По теме из базы знаний
- Уровни, глубина, прародители, циклы и аналоги запросом
- Получение первого уровня иерархии справочника (департамента/верхней группы)
- Иерархия справочника Сверху Вниз. Получаем произвольное количество родителей "верхнего" уровня
- Управление сборкой. Расширение для конфигурации СППР
- Вывод элементов иерархии верхнего уровня на СКД
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Итерация для человека, а рекурсия для Бога!
Функция ДайПапу(элемент)
Если элемент.Родитель.Выбран() = 1 Тогда
Возврат ДайПапу(элемент.Родитель);
КонецЕсли;
Возврат элемент;
КонецФункции
рекурсия ради рекурсии? нахрена?
Папа = Элемент.Родитель;
Пока ПустоеЗначение(Папа.Родитель) = 0 Цикл
Папа = Папа.Родитель;
КонецЦикла;
Папа = Элемент.Родитель;
Пока ПустоеЗначение(Папа.Родитель) = 0 Цикл
Папа = Папа.Родитель;
КонецЦикла;
Пример из Оле, подключаемся к 1с 7.7 через 1с 8.2:
СпрОле1 = БазаОле.CreateObject("Справочник.Номенклатура");
СпрОле1.ВыбратьЭлементы();
Пока СпрОле1.ПолучитьЭлемент() Цикл
//
СпрОле = БазаОле.CreateObject("Справочник.Номенклатура");
мКод=СпрОле1.код;
мПутьРодителя="";
~мПродолжимИскатьРодителя:
мЭлементЕсть = СпрОле.НайтиПоКоду(МКод);
Если мЭлементЕсть<>0 тогда
мРодитель = СпрОле.родитель.код;
Если мПутьРодителя <> 0 тогда
мПутьРодителя = мРодитель+"\\"+мПутьРодителя;
мКод=мРодитель;
перейти ~мПродолжимИскатьРодителя;
КонецЕсли;
КонецЕсли;
Сообщить(мПутьРодителя+"\\"+СпрОле1.наименование);
//
КонецЦикла;
*****************************
на выходе получаем путь до номенклатуры по родителям через "\\":
\\Ц0000011\\00079\\18-4\\\\184152 UC152 Саморез 4.8*152 (500шт) TYCOON
СпрОле1 = БазаОле.CreateObject("Справочник.Номенклатура");
СпрОле1.ВыбратьЭлементы();
Пока СпрОле1.ПолучитьЭлемент() Цикл
//
СпрОле = БазаОле.CreateObject("Справочник.Номенклатура");
мКод=СпрОле1.код;
мПутьРодителя="";
~мПродолжимИскатьРодителя:
мЭлементЕсть = СпрОле.НайтиПоКоду(МКод);
Если мЭлементЕсть<>0 тогда
мРодитель = СпрОле.родитель.код;
Если мПутьРодителя <> 0 тогда
мПутьРодителя = мРодитель+"\\"+мПутьРодителя;
мКод=мРодитель;
перейти ~мПродолжимИскатьРодителя;
КонецЕсли;
КонецЕсли;
Сообщить(мПутьРодителя+"\\"+СпрОле1.наименование);
//
КонецЦикла;
*****************************
на выходе получаем путь до номенклатуры по родителям через "\\":
\\Ц0000011\\00079\\18-4\\\\184152 UC152 Саморез 4.8*152 (500шт) TYCOON
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Папа .Ссылка КАК Папа
|ИЗ
| Папа КАК Папа
|ГДЕ
| Папа .Ссылка = &Папа
|ИТОГИ ПО
| Ссылка ТОЛЬКО ИЕРАРХИЯ";
Запрос.УстановитьПараметр("Папа ", Папа );
РезультатЗапроса = Запрос.Выполнить();
ВыборкаСсылка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ВыборкаСсылка.Следующий();
ПоказатьТакой еще вариант
можно написать универсальный механизм, который будет работать в запросах
вариант # 1 (не сильно нравиться))))
в общем модуле повторного использования создаем функцию, которая будет возвращать текст запроса, где будет указана номенклатура и все ее родители... взять глубину метаданных справочника и через соединения нескольких временных таблиц добится требуемого текста запроса
вариант # 2
создать регистр сведений, который будет хранить все связи номенклатуры со всеми родителями
при записи элемента номенклатуры, создать фоновое задание, которое будет этот регистр корректировать (если нужно)
в запросе можно соединенить номенклатура с новым регистром и знать всех родителей... родитель, у которого пустой родитель - это и есть Ваш корень ;))
вариант # 1 (не сильно нравиться))))
в общем модуле повторного использования создаем функцию, которая будет возвращать текст запроса, где будет указана номенклатура и все ее родители... взять глубину метаданных справочника и через соединения нескольких временных таблиц добится требуемого текста запроса
вариант # 2
создать регистр сведений, который будет хранить все связи номенклатуры со всеми родителями
при записи элемента номенклатуры, создать фоновое задание, которое будет этот регистр корректировать (если нужно)
в запросе можно соединенить номенклатура с новым регистром и знать всех родителей... родитель, у которого пустой родитель - это и есть Ваш корень ;))
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот