В конфигурациях 1С часто встречаются иерархические справочники (номенклатура, контрагенты, статьи расходов и др.).
Для работы с такими данными удобно использовать язык запросов 1С, который предоставляет набор специальных функций, позволяющих получать не только отдельные элементы, но и всю цепочку родитель‑потомок.
Основные функции для работы с иерархией
- Уровень – возвращает уровень вложенности элемента (0 – корень, 1 – его прямые потомки и т.д.).
- Родитель – ссылка на непосредственного родителя элемента.
- ПОТОМКИ(&Ссылка) – набор всех потомков (детей, внуков и т.д.) указанного элемента.
- ПРЕДКИ(&Ссылка) – набор всех предков (родителей, дедов и т.д.) указанного элемента.
- ИЕРАРХИЯ(&Ссылка) – набор элементов, образующих путь от корня до указанного элемента включительно.
Эти функции можно использовать прямо в условии ГДЕ или в списке выбираемых полей.
Получение всей иерархии справочника
Самый простой способ – выбрать все элементы, которые являются потомками корня справочника (или любого другого узла, от которого нужно построить дерево).
Пример 1: Иерархия от корня справочника «Номенклатура»
ВЫБРАТЬ Т.Ссылка КАК Ссылка, Т.Наименование КАК Наименование, Т.Родитель КАК Родитель, Т.Уровень КАК Уровень ИЗ Справочник.Номенклатура КАК Т ГДЕ Т.Ссылка В ПОТОМКАХ(&Справочник.Номенклатура.ПустаяСсылка) // корень – пустая ссылка ИЛИ Т.Ссылка = &Справочник.Номенклатура.ПустаяСсылка УПОРЯДОЧИТЬ ПО Т.Уровень, Т.Наименование
Пояснения:
- Пустая ссылка (
Справочник.Номенклатура.ПустаяСсылка) соответствует корню иерархии. - Функция
ПОТОМКИвозвращает всех потомков указанного элемента, поэтому условиеТ.Ссылка В ПОТОМКАХ(&Корень)захватывает всю поддерево. - Добавляем условие
ИЛИ Т.Ссылка = &Корень, чтобы сам корень также попал в результат. - Поле
Уровеньудобно использовать для визуального отступа в отчетах.
Пример 2: Иерархия от произвольного узла
Если нужно получить дерево, начинающееся с конкретного группы (например, «Оборудование»), достаточно подставить её ссылку в параметр.
ВЫБРАТЬ Т.Ссылка, Т.Наименование, Т.Родитель, Т.Уровень КАК Уровень ИЗ Справочник.Номенклатура КАК Т ГДЕ Т.Ссылка В ПОТОМКАХ(&ГруппаОборудование) ИЛИ Т.Ссылка = &ГруппаОборудование УПОРЯДОЧИТЬ ПО Т.Уровень, Т.Наименование
Альтернативный способ: использование функции ИЕРАРХИЯ
Функция ИЕРАРХИЯ возвращает набор ссылок, образующих путь от корня до указанного элемента.
Она удобна, когда нужно получить не всё дерево, а только цепочку предков для конкретного элемента.
ВЫБРАТЬ Т.Ссылка, Т.Наименование, Т.Уровень КАК Уровень ИЗ Справочник.Номенклатура КАК Т ГДЕ Т.Ссылка В ИЕРАРХИИ(&ВыбранныйЭлемент) УПОРЯДОЧИТЬ ПО Т.Уровень
Здесь &ВыбранныйЭлемент – параметр, содержащий ссылку на элемент, предков которого нужно получить.
Рекурсивные запросы (CTE) в 1С 8.3.12+
Начиная с версии 8.3.12 язык запросов поддерживает общие табличные выражения (CTE), что позволяет реализовать собственный обход иерархии, если стандартные функции не покрывают какой‑то специфический кейс.
ВЫБРАТЬ Т.Ссылка, Т.Наименование, Т.Родитель, 0 КАК Уровень ПОМЕСТИТЬ ВТ_Иерархия ИЗ Справочник.Номенклатура КАК Т ГДЕ Т.Ссылка = &Корень ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Т.Ссылка, Т.Наименование, Т.Родитель, ВТ.Уровень + 1 КАК Уровень ИЗ Справочник.Номенклатура КАК Т ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Иерархия КАК ВТ НА Т.Родитель = ВТ.Ссылка ГДЕ Т.Ссылка <> &Корень ВЫБРАТЬ * ИЗ ВТ_Иерархия УПОРЯДОЧИТЬ ПО Уровень, Наименование
Такой запрос полезно использовать, когда нужно добавить дополнительные вычисляемые поля (например, накопительные суммы) на каждом уровне иерархии.
Практические советы по производительности
- Ограничивайте выборку – указывайте конкретный корень или фильтр по свойствам, чтобы не сканировать весь справочник.
- Индексы – убедитесь, что по полям
СсылкаиРодительесть индексы (по умолчанию они присутствуют). - Избегайте SELECT * – выбирайте только нужные поля, это уменьшит объём передаваемых данных.
- Кешируйте результаты – если иерархия используется часто, сохраняйте её во временную таблицу или в регистр накопления.
- Используйте параметры – подставляйте ссылки через параметры (
&Корень), чтобы запрос мог переиспользоваться планом выполнения.
Для получения всей иерархии справочника в 1С достаточно воспользоваться функциями ПОТОМКИ, ПРЕДКИ или ИЕРАРХИЯ в сочетании с условием ГДЕ.
Пример запроса, показанный выше, возвращает ссылку, наименование, родителя и уровень вложенности каждого элемента, что позволяет легко построить древовидный вид в отчетах, формах или обработках.
Если понадобится более сложная логика (накопительные итоги, фильтрация по уровням, пользовательские вычисления), можно прибегнуть к CTE или к временным таблицам, но для большинства типовых задач стандартные функции иерархии оказываются достаточными и оптимальными.
Статья подготовлена на основе официальной документации 1С и общедоступных примеров запросов. Дата актуализации: .