Часто требуется получить всех родителей для группы элементов. Не люблю использовать циклы и рекурсию без крайней необходмости. Давно хотелось найти универсальный способ, желательно через запрос.
Решение с сайта 1с обладает существенным ограничением: нужно заранее знать количество уровней.
Первый способ лишен этого недостатка, однако имеет другие:
1. Результат запроса нельзя выгрузить во временную таблицу, т.к. запрос строится по итогам
2. В результирующем запросе присутствуют задублированные строки, поэтому нужно выполнять дополнительную обработку, чтобы устранить этот эффект.
Однако, я часто использую именно этот способ, за неимением более простого решения. Он подходит для небольших по размеру иерархических справочников.
ВЫБРАТЬ
Склады.Ссылка КАК Ссылка,
Склады.Ссылка.Ссылка КАК Родитель
ИЗ
Справочник.Склады КАК Склады
ИТОГИ ПО
Ссылка,
Родитель ИЕРАРХИЯ
Второй способ является модификацией метода, предложенного 1с. Недостатком этого метода:
1. Низкая производительность, т.к. выполняется большое количество соединений, а также используется условие ИЛИ
2. Жестко задается количество уровней
Поэтому он также подходит только для справочников с небольшим количеством элементов
ВЫБРАТЬ
Склады.Ссылка КАК Склад,
СкладыИерархия.Ссылка КАК Родитель
ИЗ Справочник.Склады КАК Склады
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Склады КАК СкладыИерархия
ПО СкладыИерархия.Ссылка = Склады.Ссылка
ИЛИ СкладыИерархия.Ссылка = Склады.Родитель
ИЛИ СкладыИерархия.Ссылка = Склады.Родитель.Родитель
ИЛИ СкладыИерархия.Ссылка = Склады.Родитель.Родитель.Родитель
ИЛИ СкладыИерархия.Ссылка = Склады.Родитель.Родитель.Родитель.Родитель
ИЛИ СкладыИерархия.Ссылка = Склады.Родитель.Родитель.Родитель.Родитель.Родитель
ИЛИ СкладыИерархия.Ссылка = Склады.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель
ИЛИ СкладыИерархия.Ссылка = Склады.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель