Как вариант можно перебрать родителей через ИЛИ, например так
Номенклатура.Родитель = Номенклатура1.Ссылка
ИЛИ Номенклатура.Родитель.Родитель = Номенклатура1.Ссылка
ИЛИ Номенклатура.Родитель.Родитель.Родитель = Номенклатура1.Ссылка
ИЛИ Номенклатура.Родитель.Родитель.Родитель.Родитель = Номенклатура1.Ссылка
Только здесь глубина родителей конечна, если же непонятно какую глубину имеет справочник, то можно это решить так
выгрузить родителей вообще в таблицу значений в две колонки,
в одной родитель, а во второй все возможные его родители (по количеству родителей количество строк в таблице значений
полученную таблицу использовать для соедениения
Это мое первое сочинение для Инфостарта
В запросе, в соединении нельзя указать например: ЛЕВОЕ СОЕДИНЕНИЕ ……. Ссылка В ИЕРАРХИИ(ТЗ.Ссылка)
Внизу приведены процедуры, которые позволяют все же сравниться с иерархией
идея в том что бы подготовить такую таблицу значений, где была бы информация
Первая колонка Вторая колонка
Родитель Родитель.Родитель
Родитель Родитель.Родитель.Родитель
и так далее для каждой группы в первой колонке, всег вышестоящие группы во второй
и использовать это для этой задачи
Где можно будет указать …. СОединение Номенклатура.Родитель = ТЗ.Родитель и далее обрабатывается
условие с Вышестоящими родителями
итак процедуры
/// это основная процедура где и нужно произвести соединение по иерархии
Процедура КнопкаВыполнитьНажатие(Кнопка)
М = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр(«Номенклатура»,Номенклатура);
ПолучитьНаборРодителей(М);
Запрос.МенеджерВременныхТаблиц = М;
// это конечно можно сразу в условии ГДЕ в ИЕРАРХИИ решить
// это просто пример
Запрос.Текст =
«ВЫБРАТЬ
| ВремТаб.ПервыйРодитель,
| ВремТаб.РодительГдеТоНадНоменклатурой
|ПОМЕСТИТЬ ТЗ
|ИЗ
| ВремТаб КАК ВремТаб
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Номенклатура.Ссылка КАК Номенклатура,
| ТЗ.ПервыйРодитель,
| ТЗ.РодительГдеТоНадНоменклатурой
// ну и ради чего все затевалось, сравнение с группами в иерархии
|ИЗ
| ТЗ КАК ТЗ
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
| ПО ТЗ.ПервыйРодитель = Номенклатура.Родитель
|ГДЕ
| ТЗ.РодительГдеТоНадНоменклатурой = &Номенклатура»
;
РЕзультат = Запрос.Выполнить().Выгрузить();
ЭлементыФормы.ТЗ_1.Значение = Результат.Скопировать();
КонецПроцедуры
// Эти две процедуры создают ТЗ с группами
// первая процедура выбирает все группы
// вторая заполняет ТЗ вышестоящими родителями для родителя первой колонки
Процедура ПолучитьНаборРодителей(МенВремТаблиц)
НовТЗСоВсемиРодителями = Новый ТаблицаЗначений;
ТипНоменклатура = Новый ОписаниеТипов(«СправочникСсылка.Номенклатура»);
НовТЗСоВсемиРодителями.Колонки.Добавить(«ПервыйРодитель»,ТипНоменклатура);
НовТЗСоВсемиРодителями.Колонки.Добавить(«РодительГдеТоНадНоменклатурой»,ТипНоменклатура);
Запрос = Новый Запрос;
// Запрос.УстановитьПараметр(«Номенклатура»,Номенклатура);
Запрос.Текст =
«ВЫБРАТЬ
| Номенклатура.Ссылка КАК ПервыйРодитель
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ЭтоГруппа
// | И Номенклатура.Ссылка = &Номенклатура
|
|СГРУППИРОВАТЬ ПО
| Номенклатура.Ссылка»
;
Результат = Запрос.Выполнить().Выгрузить();
Для каждого стр Из Результат Цикл
Если стр.ПервыйРодитель.Родитель.Пустая() Тогда
стрТЗ = НовТЗСоВсемиРодителями.Добавить();
стрТЗ.ПервыйРодитель = стр.ПервыйРодитель;
стрТЗ.РодительГдеТоНадНоменклатурой = Справочники.Номенклатура.ПустаяСсылка();
Иначе
ПолучитьВсехРодителей(НовТЗСоВсемиРодителями,стр.ПервыйРодитель,стр.ПервыйРодитель.Родитель);
КонецЕсли;
КонецЦикла;
НовТЗСоВсемиРодителями.Сортировать(«ПервыйРодитель»);
////////////////////////////////////////////////////////////////////////
///// для наглядоности, выгружаем в Таблицу значений на форме //////////
////////////////////////////////////////////////////////////////////////
ЭлементыФормы.ТЗ_.Значение = НовТЗСоВсемиРодителями.Скопировать();
ЭлементыФормы.ТЗ_.ОбновитьСтроки();
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенВремТаблиц;
Запрос.УстановитьПараметр(«ВоВремТабл»,НовТЗСоВсемиРодителями);
Запрос.Текст =
«ВЫБРАТЬ
| ВоВремТабл.ПервыйРодитель,
| ВоВремТабл.РодительГдеТоНадНоменклатурой
|ПОМЕСТИТЬ ВремТаб
|ИЗ
| &ВоВремТабл КАК ВоВремТабл»
;
Запрос.Выполнить();
КонецПроцедуры
Процедура ПолучитьВсехРодителей(ТЗ,Родитель,РодительНадРодителем)
Если РодительНадРодителем.Пустая() Тогда
Возврат;
КонецЕсли;
стрТЗ = ТЗ.Добавить();
стрТЗ.ПервыйРодитель = Родитель;
стрТЗ.РодительГдеТоНадНоменклатурой = РодительНадРодителем;
ПолучитьВсехРодителей(ТЗ,Родитель,РодительНадРодителем.Родитель);
КонецПроцедуры
? А вроде в СКД такое соединение делается на ура с помощью разных наборов данных
бесспорно))) решается, но иногда надо влезть в существующий запрос, например типовой, и строить скд, для общего модуля, или еще по каким причинам может быть неудобно.
тут две задачи даже показаны,
одна из них понятно, это использование менеджера таблиц и использовании в запросе таблицы значения, тут все понятно и про нее расписывать ничего не стал
и вторая как узнать общего родителя через соединение в запросе
каждая процедурка, решает очень узкую задачу
КнопкаВыполнитьНажатие(Кнопка) основная процедура, в которой и лежит запрос в котором нужно получить соединение
ПолучитьНаборРодителей(М) процедура которая получает список родителей, организуя выборку родителей вообще
и подбор всех родителей через
рекурсивную процедуру ПолучитьВсехРодителей(ТЗ,Родитель,РодительНадРодителем)
что беру всего родителя, ну может и тяжело, только зачем в примере путать людей оптимизацией, чем нагляднее тем лучше
да еще, у меня приложена там обработка, которая и демонстрирует работу этой задачи
ну и я не убрал отсюда из кода строк которые управляют таблицей на форме
//ЭлементыФормы.ТЗ_1.Значение = Результат.Скопировать();
//ЭлементыФормы.ТЗ_.Значение = НовТЗСоВсемиРодителями.Скопировать();
//ЭлементыФормы.ТЗ_.ОбновитьСтроки();
если есть пожелания конкретного характера))) в частности как сделать код нагляднее, с удовольствием выслушаю
спасибо за критику
понятно))) если вы не увидели зачем она нужна, то и статья то в общем вам должна быть не интересна
спасибо за комментарии
Спасибо. Натолкнуло на решение собственной проблемы.
пожалуйста)))
Спасибо
Спасибо
дело нужное и хорошее
даже получилось
спасибо 🙂
(1) А можно пример того, как это легко на СКД сделать?
Сорри за некропостинг ))) но наткнулся тут у вас на запрос в рекурсии и все это цикле это прям идеальный антипаттерн.
имхо наилучшая оптимизация подобной задачи это просто один цикл по каждому элементу правой таблицы соединения (В ИЕРАРХИИ)
(18) Пример пожалуйста 🙂
Показать
такой запрос в таблицу и спрягаете с ним ваш набор данных как хотите
(20) Вложенность родителей не известна, в этом фокус, а такой перебор конечно очевиден