Имя: Пароль:
1C
 
Как в 1С получить вернюю папку-родителя номенклатуры
0 KattyMix
 
20.05.11
11:54
Есть  список номенклатур,каждая номенклатура лежит в папке.
Например Питание-Тема-Каша.Необходимо вытащить верхнего родителя номенклатуры.
Пробовала таким образом:

Для каждого строкаТЧ из ЦеныПоставщиков цикл
Если строкаТЧ.Номенклатура.Родитель.Родитель.Родитель = Справочники.Номенклатура.НайтиПоКоду("0000045647")

Но мне этот метод не подходит-так как в списке номенклатур разное количество родителей у каждого элемента.
1 Asmody
 
20.05.11
11:57
Функция ВерхнийРодитель(Ссылка)
Возврат ?(Ссылка.Родитель.Пустая(), Ссылка, ВерхнийРодитель(Ссылка.Родитель));
КонецФункции
2 luns
 
20.05.11
12:08
можно запросом.

ВЫБРАТЬ
   Номенклатура.Ссылка
ПОМЕСТИТЬ РодителиВерхнегоУровня
ИЗ
   Справочник.Номенклатура КАК Номенклатура
ГДЕ
   Номенклатура.Родитель.Ссылка ЕСТЬ NULL
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Номенклатура.Ссылка,
   РодителиВерхнегоУровня.Ссылка КАК Ссылка1
ИЗ
   Справочник.Номенклатура КАК Номенклатура
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ РодителиВерхнегоУровня КАК РодителиВерхнегоУровня
       ПО (Номенклатура.Родитель = РодителиВерхнегоУровня.Ссылка
               ИЛИ Номенклатура.Родитель.Родитель = РодителиВерхнегоУровня.Ссылка
               ИЛИ Номенклатура.Родитель.Родитель.Родитель = РодителиВерхнегоУровня.Ссылка
               ИЛИ Номенклатура.Родитель.Родитель.Родитель.Родитель = РодителиВерхнегоУровня.Ссылка
               ИЛИ Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель = РодителиВерхнегоУровня.Ссылка)
ГДЕ
   Номенклатура.Ссылка В(&СписокНоменклатур)

это для 5 уровней.
3 Asmody
 
20.05.11
12:21
(2) запросом это делается гораздо проще
4 Reset
 
20.05.11
12:27
Вариант:

Сообщить(Справочники.ИМЯСПРАВОЧНИКА.НайтиПоКоду(Лев(Ссылка.ПолныйКод(),Ссылка.Метаданные().ДлинаКода)));
5 Reset
 
20.05.11
12:29
Почему пол мужской в профиле?
6 luns
 
20.05.11
12:40
(3) возможно. это я за минуту накидал. никогда такой задачи не возникало.
покажи кстати вариант. интересно.
7 Fragster
 
гуру
20.05.11
12:40
8 Ахиллес
 
20.05.11
12:44
(4) Если вдруг код окажется числом, получишь граблями по лбу.
9 Mitriy
 
20.05.11
12:48
(8) кстати, интересно, точно будет ошибка, или скушает?... ты проверял?
10 Asmody
 
20.05.11
12:52
(8) даже если и текст, всё равно получит
11 KattyMix
 
20.05.11
12:54
(5)Потому  что по  умолчанию пол мужской...=)

Я нашла решение-

СправочникРод = Строка.Номенклатура;
Пока СправочникРод.Уровень() <> 0 цикл
СправочникРод = СправочникРод.Родитель;
Конеццикла;    
               
Если СправочникРод = Справочники.Номенклатура.НайтиПоКоду("0000045647")
и т.д.
12 luns
 
20.05.11
12:54
(7) скд не то. речь про запрос.
13 Fragster
 
гуру
20.05.11
12:55
(12) чем принципиально толичается СКД от запроса? в ТЗ ты результат все равно можешь выгрузить
14 zbv
 
20.05.11
12:55
(11) в ЛЧ еще есть место, где можно разместить фотку :)
15 Адинэснег
 
20.05.11
12:55
охохо...
16 Fragster
 
гуру
20.05.11
12:56
никогда так не делай:


Если СправочникРод = Справочники.Номенклатура.НайтиПоКоду("0000045647")
17 Адинэснег
 
20.05.11
12:56
(10) Асмод в одинэснеки подался? оО
18 KattyMix
 
20.05.11
12:56
(16)Почему?Потому  что  код может измениться?
19 wPa
 
20.05.11
12:58
(18) хард-код = Табу
20 luns
 
20.05.11
12:59
(13) да ничем. вон в (1) уже есть ответ.
просто Asmody сказал что запросом можно.
вот мне и интересно стало чисто технически именно запросом.
21 Fragster
 
гуру
20.05.11
12:59
(18) алгоритмы конфигурации должна быть независима от данных, хранящихся в ней.
22 Fragster
 
гуру
20.05.11
12:59
*должны быть
23 Asmody
 
20.05.11
13:00
(20) подсказка в слове иерархия
24 luns
 
20.05.11
13:01
(23) не надо подсказок.
запости текст плиз
тем паче что если он проще чем в (2) то будет небольшим
25 Ахиллес
 
20.05.11
13:02
(9) полный код: 1/2/3
Длина кода 5.
Найди родителя верхнего уровня.
(16) Не мы такие, жизнь такая. Не всегда предопределённые значения удобно использовать. Просто надо помнить, что тут лежат грабли. Но то, что это авнокод это несомненно.
26 Mitriy
 
20.05.11
13:06
(25) просто не пробовал на числовых кодах... может, там строку строит с нулями, откуда мне знать? А проверять в лом ))
27 Fragster
 
гуру
20.05.11
13:08
(23) типа выбрать с итогами по иерархии а в обходе результата обработать только первую строку? а если родителя надо получить для кучи номенкулатуры?
28 Адинэснег
 
20.05.11
13:09
+(27)А если номенклатуры 200к?)
29 Ахиллес
 
20.05.11
13:11
(26) Строка с ведущими нулями это когда тип - "строка", когда "число", тогда без ведущих нулей.
30 Fragster
 
гуру
20.05.11
13:11
(28) => (7), конечно тормозит, но типа работает быстрее, чем рекурсия по каждому элементу, или запрос с группировкой по иерархии.
31 KattyMix
 
20.05.11
13:12
Вот мне как раз  для  всех элементов  справочника и надо было...
32 Fragster
 
гуру
20.05.11
13:13
(31) тогда почему фотка в личной карточке не заполнена?
33 Septera
 
20.05.11
13:13
Все просто, нижем приведу пример как получить главного родителя в справочнике:
Запрос = Новый Запрос;
       Запрос.Текст = "
       |ВЫБРАТЬ ПЕРВЫЕ 1
       |    Номенклатура.Ссылка КАК Ссылка
       |ИЗ
       |    Справочник.Номенклатура КАК Номенклатура
       |ГДЕ
       |    Номенклатура.ПометкаУдаления = ЛОЖЬ
       |    И Номенклатура.Ссылка = &Ссылка
       |ИТОГИ ПО
       |    Ссылка ТОЛЬКО ИЕРАРХИЯ";
       Запрос.УстановитьПараметр("Ссылка", НоменклатураЭлемент);
       РезультатЗапроса = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
       РезультатЗапроса.Следующий();

// РезультатЗапроса.Ссылка - содержит искомого родителя верхнего уровня
34 Fragster
 
гуру
20.05.11
13:15
(33) а теперь для 2-х номенклатур то же самое.
35 Reset
 
20.05.11
13:15
(8) (10) С числовым кодом действительно не будет работать, так же, как и с кодом с нулевой длиной. А я писал что метод универсальный на все случаи? Для приведенного в (0) условия - метод полностью рабочий. Точнее, вариант метода. Сам использую в таких случаях вариант из (11).
36 Адинэснег
 
20.05.11
13:16
ВЫБРАТЬ
   Номенклатура.Ссылка,
   ВЫБОР
       КОГДА Номенклатура.Родитель = &ПустаяСсылка
           ТОГДА &ПустаяСсылка
       ИНАЧЕ ВЫБОР
               КОГДА Номенклатура.Родитель.Родитель = &ПустаяСсылка
                   ТОГДА Номенклатура.Родитель
               ИНАЧЕ ВЫБОР
                       КОГДА Номенклатура.Родитель.Родитель.Родитель = &ПустаяСсылка
                           ТОГДА Номенклатура.Родитель.Родитель
                       ИНАЧЕ ВЫБОР
                               КОГДА Номенклатура.Родитель.Родитель.Родитель.Родитель = &ПустаяСсылка
                                   ТОГДА Номенклатура.Родитель.Родитель.Родитель
                               ИНАЧЕ ВЫБОР
                                       КОГДА Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель = &ПустаяСсылка
                                           ТОГДА Номенклатура.Родитель.Родитель.Родитель.Родитель
                                       ИНАЧЕ &ПустаяСсылка
                                   КОНЕЦ
                           КОНЕЦ
                   КОНЕЦ
           КОНЕЦ
   КОНЕЦ КАК ВерхнийУровень
ИЗ
   Справочник.Номенклатура КАК Номенклатура
ГДЕ
   (НЕ Номенклатура.ЭтоГруппа)
37 Ахиллес
 
20.05.11
13:16
(33) Нафига тут
|    Номенклатура.ПометкаУдаления = ЛОЖЬ
А если мне надо помеченный на удаление элемент обработать?
38 KattyMix
 
20.05.11
13:16
(32)какой-то не логичный вопрос...
интересует блондинка или нет?)))
39 nop
 
20.05.11
13:16
(36) ужаснах. ВЫБОР - зло
40 zbv
 
20.05.11
13:17
(38) нет. Традиция такая есть на мисте.
41 spiteful41
 
20.05.11
13:17
(33)+100500
42 Fragster
 
гуру
20.05.11
13:17
(38) можно и так сказать... просто ускорит получение ответов в дальнейшем...
43 zbv
 
20.05.11
13:18
+ (42) и не будут засорять тему, сообщениями про фото. :)
44 nop
 
20.05.11
13:18
(34) продублировать текст запроса Н раз, используя ОБЪЕДИНИТЬ ?
45 Адинэснег
 
20.05.11
13:18
(41)(33) - 100500
вы чо запросы собрались в цикле крутить?
46 nop
 
20.05.11
13:19
(45) можно в цикле составить текст, а потом выполнить 1 раз
47 Fragster
 
гуру
20.05.11
13:19
самый универсальный способ - в (7)
48 smaharbA
 
20.05.11
13:20
строкаТЧ.Номенклатура.ПолныйКод
49 Адинэснег
 
20.05.11
13:20
(46) ПЕРВЫЕ возратит родителя только для одной позиции.
А если я беру 5-7 тыщ позиций?)
50 Septera
 
20.05.11
13:21
Способ в (33) Выигрывает в быстродействии у всех, готов сертификат на стол положить если это не так =)
51 Fragster
 
гуру
20.05.11
13:21
(48) не работает, если в коде есть /
52 KattyMix
 
20.05.11
13:21
А чем вам мой вариант не понравился?Он же короче ваших запросов...Просто прибавляю  столько родителей,сколько мне надо...

СправочникРод = Строка.Номенклатура;
Пока СправочникРод.Уровень() <> 0 цикл
СправочникРод = СправочникРод.Родитель;
Конеццикла;
53 nop
 
20.05.11
13:21
(48) а если в наименованиях есть символ / ?
54 Fragster
 
гуру
20.05.11
13:22
(50) как получить для всего справочника?

ну и да, у меня нет сертификата, но сравни с (7)
55 nop
 
20.05.11
13:22
(49) см (44)
56 Fragster
 
гуру
20.05.11
13:22
(52) медленный
57 zbv
 
20.05.11
13:23
для нескольких номенклатур. по скорости ХЗ.

ВЫБРАТЬ
   Номенклатура.Ссылка КАК Ссылка
ИЗ
   Справочник.Номенклатура КАК Номенклатура
ГДЕ
   Номенклатура.ПометкаУдаления = ЛОЖЬ
   И Номенклатура.Ссылка В(&Ссылка)
ИТОГИ ПО
   Ссылка ТОЛЬКО ИЕРАРХИЯ
58 zbv
 
20.05.11
13:24
+ (57) правда в какой папке, какая номенклатура видно не будет :)
59 Fragster
 
гуру
20.05.11
13:24
(57) а теперь - если номенклатуры в разных группах ?
60 KattyMix
 
20.05.11
13:24
какая тема оказывается популярная)))
61 nop
 
20.05.11
13:24
есть ещё вариант определить максимальную глубину вложености в справочнике единожды. После чего составлять динамически (программно) текст запроса типа (2) но не на 5 уровней, а на определенную ранее глубину вложености.
62 Septera
 
20.05.11
13:25
(49) тебе же сказали что можно составить запрос под твою задачу, не вижу проблемы в этом, пример который я привел в (33) универсален и работает очень быстро
63 Fragster
 
гуру
20.05.11
13:25
(61) ну, результирующий запрос будет быстрым, но вот получение максимального уровня может затянуться :)
64 Fragster
 
гуру
20.05.11
13:26
(62) запрос в цикле работает быстро?
65 smaharbA
 
20.05.11
13:26
(51) ну и чо
66 smaharbA
 
20.05.11
13:26
(53) пох
67 Адинэснег
 
20.05.11
13:27
(64) у него в базе 100 ном-х позиций :-D
68 Fragster
 
гуру
20.05.11
13:27
(65) если есть 2 группы верхнего уровня:

а
а/а

и искомая номенклаутра находится в "а/а", то анализ полного кода все равно вернет "а"
69 nop
 
20.05.11
13:27
(63) но оно того стоит, 1 раз сделать определение в ПриНачалеРаботыСистемы(). Если конфу нельзя менять, и отчет внешний, тогда упс
70 smaharbA
 
20.05.11
13:28
да хоть три
71 FN
 
20.05.11
13:28
(0)
Если в 8-ке есть функция ПолныйКод() и коды уникальны по всем справочнику, то юзай
Если Лев(строкаТЧ.ПолныйКод(),11)="0000045647/" тогда
....
КонецЕсли
72 Fragster
 
гуру
20.05.11
13:29
(69) ага, и еще подписку на "приЗаписи" справочника повесить, да :)))
73 nop
 
20.05.11
13:29
(71) фигня, если в коде есть /
74 Fragster
 
гуру
20.05.11
13:29
(71) ты чему учишь? сам же потом переделывать будешь.
75 nop
 
20.05.11
13:29
(72) затормозит запись
76 KattyMix
 
20.05.11
13:30
У меня вообще стоит 8.0...
77 Адинэснег
 
20.05.11
13:30
(71)
ИначеЕсли (УТебяКриваяРаспределенка И КодыЕбуцоКакХотят) Тогда
СидиКури();
КонецЕсли
78 Fragster
 
гуру
20.05.11
13:31
(75) там у объекта по моему есть Уровень(). а так - если в процессе сеанса работы изменится максимальная глубина - будет косяк. ну и каждый раз при запуске не надо будет пересчитывать...
79 Fragster
 
гуру
20.05.11
13:32
(76) тогда запрос в цикле из (33) будет быстрее твоего метода, но ты не парься, скорее всего это не будет основным источником тормозов :)
80 Ткачев
 
20.05.11
13:33
Если Не Ссылка.Пустая() Тогда
Справочники.СПРАВОЧНИК.НайтиПоКоду(Лев(Ссылка.ПолныйКод(), Найти(Ссылка.ПолныйКод(), "/")-1))
КонецЕсли;
81 nop
 
20.05.11
13:33
(78) точно.  Тогда можно в ПриЗаписи() справочника Уровень() максимальный сохранять в РС например.
82 nop
 
20.05.11
13:34
(80) Баян 1005500 раз. См (77)
83 Septera
 
20.05.11
13:34
Выборка программными средствами никога не выиграет у запроса, особенно на sql базах, потому что при переводе на Transact-SQL субд использует различные планировщики запросов, которые построят оптимальный вид запроса.
84 zbv
 
20.05.11
13:34
Кстати, а зачем собственно ?
85 FN
 
20.05.11
13:34
(73) "/" поставить в код платформа не даст (во всяком случае 7.7)
(74) да ладно - абсолютно рабочий подход. Главное прямо в коде не писать "0000045647/", а брать например из константы

ПроверяемыйКод=Константа.НужнаяГруппа.ПолныйКод()+"/";
Если Лев(строкаТЧ.ПолныйКод(),11)=ПроверяемыйКод тогда
86 Fragster
 
гуру
20.05.11
13:34
(81) и список элементов с максимальным уровнем :))
87 Адинэснег
 
20.05.11
13:35
v8: Голосуем за добавление фунции УникальныйИдентификатор в язык запросов
добавьте в петицию "Справочник.Ссылка.ВерхнийРодитель"
88 lxs
 
20.05.11
13:36
(36) Строить такие этажи в запросе, тем более, когда количество уровней иерархии неограниченное - бред
89 FN
 
20.05.11
13:36
(85)+ на 7.7 это один из самых быстрых способов проверки вхождения элемента в группу
90 nop
 
20.05.11
13:37
(86) у меня есть предложение покруче тогда. Завести реквизит в этом же справочнике Уровень и писать в него Уровень(), по реквизиту индекс. Экономия и ускорение поиска на лицо
91 Fragster
 
гуру
20.05.11
13:44
(90) :)
92 smaharbA
 
20.05.11
13:45
балбесы
93 Reset
 
20.05.11
13:46
(90) Тогда уж сразу реквизит ВерхнийРодитель )
94 smaharbA
 
20.05.11
13:47
Справочники.Номенклатура.НайтиПоКоду(строкаТЧ.Номенклатура.ПолныйКод)

все
95 Ненавижу 1С
 
гуру
20.05.11
13:49
в общем случае одним запросом (пакетом запросов) нельзя
96 Фрэнки
 
20.05.11
13:51
(95) если задавать список ссылок для которых нужно найти?
97 Адинэснег
 
20.05.11
13:51
(36) строй программно
98 Адинэснег
 
20.05.11
13:52
(97)->(88)
99 Ненавижу 1С
 
гуру
20.05.11
13:53
(96) именно
100 Ненавижу 1С
 
гуру
20.05.11
13:53
1с не дала альтернативного построения иерархии, а текущий слишком топорный
101 Mitriy
 
20.05.11
13:53
(94) прикольно... а с числовым кодом прокатит?
102 Ненавижу 1С
 
гуру
20.05.11
13:55
(101) нет числовых кодов
то что называется числовым кодом есть строка с ограничением на возможные значения
103 Mitriy
 
20.05.11
13:57
(102) я не это спрашивал вроде ))
104 Ненавижу 1С
 
гуру
20.05.11
13:58
(103) а что? разверни мысль
105 smaharbA
 
20.05.11
13:58
(101) х.з. я восьмерку не знаю
(реально не кодил)
106 Fragster
 
гуру
20.05.11
14:01
(94) не работает
107 Fragster
 
гуру
20.05.11
14:02
108 Ахиллес
 
20.05.11
14:03
(102) В смысле?
То есть можно писать .НайтиПоКоду(1) или .НайтиПоКоду("1") и пофигу ни настройки справочника? Любой вариант схавает?
109 Fragster
 
гуру
20.05.11
14:04
(102) оно на чар, а децимал в базе, не?
110 Mitriy
 
20.05.11
14:06
(106) а у меня сработало...
111 Mitriy
 
20.05.11
14:07
(104) разворачиваю: прокатит ли метода в (94) в случае справочника с числовым кодом.
112 Mitriy
 
20.05.11
14:09
(110) правда, я в 8.2 смотрел...
113 Aprobator
 
20.05.11
14:11

Функция ПолучитьРодителя(ЭлементСправочника)
      РодительЭлемента = ЭлементСправочника.Родитель;
      Если РодительЭлемент.Родитель.Пустая() Тогда
           Возврат РодительЭлемента;
      ИначеЕсли ЭлементСправочника.Пустая() Тогда
           Возврат Справчоник.КакойТам.ПустаяСсылка()
      Иначе
           Возврат ПолучитьРодителя(РодительЭлемента)
      КонецЕсли;
КонецФункции

впрочем вариант в (94) довести до ума, а именно с полного кода вычитать первую часть до / и поставить поиск по полному коду, то покошернее будет.
114 Попытка1С
 
20.05.11
14:11
(94) Круто.
115 Mitriy
 
20.05.11
14:12
(113) зачем доводить до ума, если и так работает?
116 Fragster
 
гуру
20.05.11
14:13
(115) почему-то не всегда работает. ты на иерархии групп и элементов проверял?
117 Mitriy
 
20.05.11
14:14
(116) нет...
118 Mitriy
 
20.05.11
14:16
(117) тьфу ты... на иерархии элементов не проверял...
119 Mitriy
 
20.05.11
14:18
(118) проверил... работает...
120 Mitriy
 
20.05.11
14:19
Ном = Справочники.Номенклатура.НайтиПоКоду(ПолеВвода1.ПолныйКод());
   Сообщить(Ном);

Ном = Справочники.ПодразделенияОрганизаций.НайтиПоКоду(ПолеВвода1.ПолныйКод());
   Сообщить(Ном);
121 smaharbA
 
20.05.11
14:19
Есть еще старый простой метод, перебрать все верхнего + Принадлежит(Элементу)
в (94) конечно найдет тот у которого есть / если есть, а далее дело техники
122 Mitriy
 
20.05.11
14:19
как часы...
123 Aprobator
 
20.05.11
14:20
в (113) ошибся.

Функция ПолучитьРодителя(ЭлементСправочника)
      РодительЭлемента = ЭлементСправочника.Родитель;
      Если РодительЭлемент.Родитель.Пустая() Тогда
           Возврат РодительЭлемента;
      ИначеЕсли РодительЭлемента.Пустая() Тогда
           Возврат Справчоник.КакойТам.ПустаяСсылка()
      Иначе
           Возврат ПолучитьРодителя(РодительЭлемента)
      КонецЕсли;
КонецФункции

так вроде правильнее.
(119) тип кода справочника какой?
124 smaharbA
 
20.05.11
14:24
(122) не совсем, если будут с / и без, найдет тот в котором есть / (вроде), но тут уже не сложно и выбрать из остатка по принадлежит и те у которых код с началом полученного полного совпадет
125 Mitriy
 
20.05.11
14:24
(123) строка, вестимо...
126 Fragster
 
гуру
20.05.11
14:26
а ты проверял до конца добив длину кода? или как у меня - не полностью выбрав длину у верхнего родителя? он по ходу в "НайтиПоКоду" криво обрезает - Лев(ДлинаКода) - ну и не находит в мною указанном случае
127 ice777
 
20.05.11
14:26
(123) и это быстрее найденного автором варианта? имхо, рекурсия еще медленней.
128 Reset
 
20.05.11
14:26
(116) Не работает в случае, если верхний код не полность заполнен. Этот вариант - фактически тот же, что мой, только строка автоматически обрезается по длине кода. Т.е. в этом случае будет искать с огрызком кода 2го уровня.
129 Сам такой
 
20.05.11
14:27
Эх давно это было.

Функция ПолучитьВерхнегоРодителя(ЭлементФ)
   
   Если НЕ ЗначениеЗаполнено(ЭлементФ.Родитель) Тогда
   
       Возврат ЭлементФ;
       
   Иначе
       
       Возврат ПолучитьВерхнегоРодителя(ЭлементФ.Родитель);
   
   КонецЕсли;
   
КонецФункции
130 Reset
 
20.05.11
14:28
(129) два или три разу уже было в этой теме, вкл 1й пост
131 smaharbA
 
20.05.11
14:28
(129) см первый пост
132 vmv
 
20.05.11
14:28
Проще всего, конечно, запросом по иерархии без возни с СКД и гигантскими запросам.

из моих нетленок )

//
//  Ссылка:
//  - ссылка на иерархический объект
//  - массив ссылок на иерархический объект
//  - список значений ссылок на на иерархический объект
//
// ОбходРезультатаЗапроса:
// "Прямой"                  : При таком способе обход осуществляется без группировок и иерархии. Т.е. получаем таблицу значений
// "ПоГруппировкам"          : Обход записей результата запроса по группировкам. Т.е. получаем дерево групп в иерархии группировок запроса.
// "ПоГруппировкамСИерархией": Обход записей результата запроса по группировкам с учетом иерархии. Т.е. получаем дерево групп строго соответвествующее иерархии групп
//
Функция ПолучитьВышестоящихРодителейДляСсылки(Ссылка, ОбходРезультата = "Прямой") Экспорт
   Перем ПолноеИмяТаблицы, ТекстЗапроса, Запрос, РезультатЗапроса;
   
   // Определим имя таблицы
   Если ТипЗнч(Ссылка) = Тип("Массив") Тогда
       
       Если Не Ссылка.Количество() Тогда
           Если ВРег(ОбходРезультата) = "Прямой" Тогда
                Возврат Новый ТаблицаЗначений;
           Иначе    
                Возврат Новый ДеревоЗначений;
           КонецЕсли;
       КонецЕсли;
       
       ПолноеИмяТаблицы = AddМетаданные.ИмяТаблицыПоСсылке(Ссылка[0], Истина);
       
   ИначеЕсли ТипЗнч(Ссылка) = Тип("СписокЗначений") Тогда
       
       Если Не Ссылка.Количество() Тогда
           Если ВРег(ОбходРезультата) = "Прямой" Тогда
                Возврат Новый ТаблицаЗначений;
           Иначе    
                Возврат Новый ДеревоЗначений;
           КонецЕсли;
       КонецЕсли;
       
       ПолноеИмяТаблицы = AddМетаданные.ИмяТаблицыПоСсылке(Ссылка[0].Значение, Истина);
       
   Иначе
       
       ПолноеИмяТаблицы = AddМетаданные.ИмяТаблицыПоСсылке(Ссылка, Истина);
       
   КонецЕсли;
   
   ТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ
   |   ТаблицаОбъекта.Код КАК Код,
     |    ТаблицаОбъекта.Ссылка КАК Ссылка,
   |   ТаблицаОбъекта.Родитель КАК РодительСсылок
   |ИЗ
   |  " + ПолноеИмяТаблицы + " КАК ТаблицаОбъекта";    
   ТекстЗапроса = ТекстЗапроса + "
   |ГДЕ
   |    ТаблицаОбъекта.Ссылка В (&Ссылка)
   |ИТОГИ ПО
   |    Ссылка ТОЛЬКО ИЕРАРХИЯ";
   
   Запрос = Новый Запрос;

   
   // Установка параметров запроса
   Запрос.УстановитьПараметр("Ссылка", Ссылка);
       
   // Получение результата
   Запрос.Текст = ТекстЗапроса;
   РезультатЗапроса = Запрос.Выполнить();

   // Возврат выборки групп
   Возврат РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса[ОбходРезультата]);
   
КонецФункции

Функция ИмяТаблицыПоСсылке(Ссылка, ПолноеИмя=Истина) Экспорт
   
   ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(Ссылка));
   
   Если ПолноеИмя Тогда
       Возврат ОбъектМетаданных.ПолноеИмя();
   Иначе
       Возврат ОбъектМетаданных.Имя;
   КонецЕсли;
   
КонецФункции
133 Сам такой
 
20.05.11
14:29
теперь три или четыре включая пост 129.
134 smaharbA
 
20.05.11
14:34
а после обсуждают "гомнокод", практически любой так называемый "гомнокод" при светлой памяти и чистом взгляде максимально рационален в отличие от тех кто его так называет
135 Fragster
 
гуру
20.05.11
14:36
(134) дада, код кристально чист, но если код заполнен не на всю длину - то это проблема данных, а не кода.
136 vmv
 
20.05.11
14:40
(134)

1. Одной вещью, которую мы узнали за все эти годы, было то, что многие люди просто копируют код, даже не понимая, что он делает(с)Реймонд Чен, Microsoft
2. 90% кода в интернете - го..но(с)Колумб)
3. Моё определение "говна" может не совпадать с вашим. (С) Ларри Остерман.)
137 smaharbA
 
20.05.11
14:52
(135) тебе надо весь расписать ?
(136) в сад
138 smaharbA
 
20.05.11
14:52
это и есть что NS называет "кодеры"
139 smaharbA
 
20.05.11
14:53
+ программистами вам никогда не быть
140 Reset
 
20.05.11
14:56
(0) (11) Кстати, если задачей является не определение верхнего родителя, а является ли конкретный родитель таковым (как можно подумать из того, что у тебя в примерах в конце идет проверка на равенство), возможен вариант:

Для каждого строкаТЧ из ЦеныПоставщиков цикл
Если строкаТЧ.Номенклатура.ПринадлежитЭлементу(СсылкаНаПроверяемогоРодителя)
141 Fragster
 
гуру
20.05.11
16:35
(137) код из (94) не работает, если длина кода верхнего элемента меньше длины кода в метаданных, факт.
142 Fragster
 
гуру
20.05.11
16:36
ну и да - говнокод - это в том числе использование недокументированных возможностей.
143 Дикообразко
 
20.05.11
16:39
вот это было круто Определить старший уровень

а это все фигня
144 Дикообразко
 
20.05.11
16:41
ВерхнийРодитель=ЗначениеИзСтрокиВнутр(Шаблон("[ЗначениеВСтрокуВнутр(Спр"+СтрЗаменить(Формат("","С"+(Спр.Уровень()-1))," ",".Родитель")+")]"));

(с) Рупор абсурда

эхх... времена :)
145 smaharbA
 
20.05.11
16:44
(141) дак тебе не кто не запрещает проверять на вхождение

Вот еще гомнокод (на восьмерке кодю со вчерашнего дня, если считать кодинием вчерашний код универсальной функции для работы с ооо, жкк всякие и сп не читал до)

Функция Верхний(Элемент)
   Спр = Справочники[Элемент.Метаданные().Имя];
   Если Элемент.ПринадлежитЭлементу(Спр.НайтиПоКоду(Элемент.ПолныйКод())) Тогда
       Возврат Спр.НайтиПоКоду(Элемент.ПолныйКод()).Ссылка;
   КонецЕсли;
   
   Стр = СтрЗаменить(Элемент.ПолныйКод(),"/","" "");
   Структура = Новый Структура;
   Структура.Вставить("Код",СтрПолучитьСтроку(Стр,1));
   Для Сч=1 По СтрЧислоСтрок(Стр) Цикл
       Выборка = Спр.Выбрать(Спр.ПустаяСсылка(),,Структура);
       Сообщить(Структура.Код);
       Пока Выборка.Следующий() Цикл
           Если Элемент.ПринадлежитЭлементу(Выборка.Ссылка) Тогда
               Возврат Выборка.Ссылка;
           КонецЕсли;
       КонецЦикла;
       Структура.Код = Структура.Код + "/" + СтрПолучитьСтроку(Стр,Сч+1);
   КонецЦикла;
КонецФункции


Процедура КнопкаВыполнитьНажатие(Кнопка)
   Спр = Справочники.СотрудникиОрганизаций;
   Элемент = Спр.НайтиПоНаименованию("Ё");
   Сообщить(Верхний(Элемент));
КонецПроцедуры
146 smaharbA
 
20.05.11
16:44
Рупор - голова !
147 Fragster
 
гуру
20.05.11
16:45
(145) если код не во всю длину и в нем есть "/", то не работает
148 Fragster
 
гуру
20.05.11
16:46
а, не, вру
149 Fragster
 
гуру
20.05.11
16:47
но вообще - адский ад
150 smaharbA
 
20.05.11
17:33
+(146) как всегда Рупору решпект, ну и Дикообразке

Сообщить(Вычислить("Элемент"+СтрЗаменить(Формат(0,"ЧВН=;ЧЦ="+(Элемент.Уровень())+";ЧГ=0;ЧН="),"0",".Родитель")));
151 Fragster
 
гуру
20.05.11
17:36
крута!
152 Fragster
 
гуру
20.05.11
17:36
настоящая пятница здесь
153 Fragster
 
гуру
20.05.11
17:38
правда это медленнее запроса из (33) :)
154 Лефмихалыч
 
20.05.11
17:39
да вы здесь все упоротые!
155 Лефмихалыч
 
20.05.11
17:39
+(154) правильный ответ (1)
156 Дикообразко
 
20.05.11
20:03
(153) тут цель была не в быстроте :))

(150) а я поленился на 8ку перекладываться, респект тебе :)