Имя: Пароль:
1C
1С v8
v8: Как Получить верхнего родителя
0 dfaa
 
22.07.11
11:20
справочник номенклатура, есть реквизит верхний родитель.  Мне нужно запихнуть туда самого верхнего родителя. Запихнуть нужно при перемещении номенклатуры. Хотел запросом получить верхнего родит. а в качестве параметра передать номенклат. но у ссылки родитель предыдущий, а у объекта нужный. Каким способом это сделать.
1 Ненавижу 1С
 
гуру
22.07.11
11:21
ну разрешаю взять у объекта
2 vicof
 
22.07.11
11:21
чо?
3 dfaa
 
22.07.11
11:21
(1)а как у объекта взять самого верхнего ?
4 borik
 
22.07.11
11:22
(3) У него родитель пустой
5 Stim213
 
22.07.11
11:22
(3) самый верхний - Справочник.МойСправочник
6 vicof
 
22.07.11
11:23
спршивается, накуа?
7 butterbean
 
22.07.11
11:24
(0)
Функция Верхний(Ссылка)
   Если ЗначениеЗаполнено(Ссылка.Родитель) Тогда
      Возврат Верхний(Ссылка.Родитель)
   Иначе
      Возврат Ссылка
   КонецЕсли;
КонецФункции
8 dfaa
 
22.07.11
11:27
всем спасибо тупанул извиняюсь ))
9 Эмбеддер
 
22.07.11
11:31
без рекурсии будет даже на 1 строчку короче

Функция Верхний(знач Ссылка)
   пока ЗначениеЗаполнено(Ссылка.Родитель) цикл
      Ссылка=Ссылка.Родитель;
   конеццикла;
   Возврат Ссылка;
КонецФункции
10 dimaldinho
 
22.07.11
11:34
(9)
Функция Верхний(Ссылка)
   Возврат ?(ЗначениеЗаполнено(Ссылка.Родитель), Верхний(Ссылка.Родитель), Ссылка)
КонецФункции
11 ИС-2
 
naïve
22.07.11
11:40
(0) Тоже тупил, писал всякие рекурсии, а потом дошло, что можно выбрать данные запросом с итогами по иерархии
12 vmv
 
22.07.11
11:43
о, опять. в поиске с десяток тем, но вероятно не все велосипеды еще созданы
13 Эмбеддер
 
22.07.11
11:47
(10) Вообще за использование рекурсии там, где она не нужна, в нашем ВУЗе могли оценку снизить :)
14 Ненавижу 1С
 
гуру
22.07.11
11:51
запрос по иерархии все равно рекурсивно делается и вызывается куча маленьких запросиков
15 DrHiHi
 
22.07.11
12:04
В запросе выбор верхнего уровня групп
|ВЫБРАТЬ
| *
|ИЗ
| Справочник.Номенклатуры
|ГДЕ
| Родитель = Значение(Справочник.Номенклатура.ПустаяСсылка)
| И ЭтоГруппа
а потом ставишь условие в

не запросом
Выборка = Справочник.Номенклатура.Выбрать(Справочник.Номенклатура.ПустаяСсылка);
а потом проверяешь на принадлежитєлементу

думаю так будет быстрее, чем ты каждый раз будешь вычислять уровень элемента, а потом через родитель.родитель.родитель..... доставать верхний уровень справочника

... вроде бы так
16 Ненавижу 1С
 
гуру
22.07.11
12:05
(15) бред
17 butterbean
 
22.07.11
12:05
(15) жесть
18 DrHiHi
 
22.07.11
12:07
(16) почему??
19 Ненавижу 1С
 
гуру
22.07.11
12:08
(18) потому что в результате придется проделать ту же работу, но анализируя ВСЕ группы верхнего уровня
20 DrHiHi
 
22.07.11
12:21
(19) но что будет работать оптимально??родитель.родитель.родитель.родитель
или
МассивГрупп = Новый Массив;
Выборка = Справочник.Номенклатура.Выбрать(Справочник.Номенклатура.ПустаяСсылка);
Пока выборка.следующий() цикл
если выборка.ЭтоГруппа() тогда
МассивГрупп .добавить(выборка);
КонецЕсли;
КонецЦикла;
Для Каждого Группа из МассивГрупп Цикл
Если элемент.ПРинадлежитЭлементу(группа) тогда
группаверхнегоуровня = группа;
прервать;
КонецЕсли;
Конеццикла;

... правда смотря для чего... если нужно где-то в документе при выборе номенклатуры рядом вывести группу (что многие пользователи хотят), то рациональнее при открытии документа в переменную запихнуть массив групп, а потом при выводе строки перебирать его...
... смотря, что хочет сделать автор... где это ему надо и для чего??
21 Ненавижу 1С
 
гуру
22.07.11
12:22
ПРинадлежитЭлементу это как раз и есть завуалированный родитель.родитель.родитель.родитель
22 butterbean
 
22.07.11
12:22
(20) >> рациональнее при открытии документа в переменную запихнуть массив групп, а потом при выводе строки перебирать его...
все жощще и жощще
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс