З'єднання в запиті, порівняння (у ієрархії)

Іноді потрібно, в запиті, в з'єднанні, знайти якусь загальну ієрархію. наприклад, є два списки елементів номенклатури, ці два списки треба об'єднати за загальним батькові, якщо він є, причому цей невідомо як високо стоїть цей батько.

Як варіант можна перебрати батьків через АБО, наприклад так


Тільки тут глибина батьків конечна, якщо ж незрозуміло яку глибину має довідник, то можна це вирішити так
вивантажити батьків взагалі в таблицю значень в дві колонки,
в одній батько, а в другій всі можливі його батьки (за кількістю батьків кількість рядків в таблиці значень
отриману таблицю використовувати для соеденіенія

Це моє перше твір для Інфостарта

ідея в тому що б підготувати таку таблицю значень, де була б інформація

Перша колонка Друга колонка

і так далі для кожної групи в першій колонці, всег вищі групи в другій

і використовувати це для цього завдання

Де можна буде вказати. Сполучені Номенклатура.Родітель = ТЗ.Родітель і далі обробляється

умова з вищестоящими батьками

/// це основна процедура де і потрібно зробити з'єднання по ієрархії

Процедура КнопкаВиполнітьНажатіе (Кнопка)

М = Новий МенеджерВременнихТабліц;

Запит = Новий запит;
Запит. УстановітьПараметр ( "Номенклатура". Номенклатура);

ПолучітьНаборРодітелей (М);
Запит. МенеджерВременнихТабліц = М;

// це звичайно можна відразу в умови ДЕ в ІЄРАРХІЇ вирішити
// це просто приклад
Запит. текст =

Результати = Запит. Виконати (). Вивантажити ();
ЕлементиФорми. ТЗ_1. Значення = Результат. Скопіювати ();


// Ці дві процедури створюють ТЗ з групами

// перша процедура вибирає все групи

// друга заповнює ТЗ вищестоящими батьками для батьків першої колонки

Процедура ПолучітьНаборРодітелей (МенВремТабліц)

НовТЗСоВсеміРодітелямі. Сортувати ( "ПервийРодітель");

Запит = Новий запит;
Запит. МенеджерВременнихТабліц = МенВремТабліц;
Запит. УстановітьПараметр ( "ВоВремТабл". НовТЗСоВсеміРодітелямі);
Запит. текст =
"ВИБРАТИ
| ВоВремТабл.ПервийРодітель,
| ВоВремТабл.РодітельГдеТоНадНоменклатурой
| Помістити ВремТаб
| З
| ВоВремТабл ЯК ВоВремТабл "
;
Запит. Виконати ();

Процедура ПолучітьВсехРодітелей (ТЗ. Батько. РодітельНадРодітелем)

Якщо РодітельНадРодітелем. Порожня () Тоді
повернення;
КонецЕсли;

стрТЗ = ТЗ. Додати ();
стрТЗ. ПервийРодітель = Батько;
стрТЗ. РодітельГдеТоНадНоменклатурой = РодітельНадРодітелем;

ПолучітьВсехРодітелей (ТЗ. Батько. РодітельНадРодітелем. Батько);