Работа с иерархическими справочниками в языке запросов 1С

Бесплатная консультация юриста

+7 (800) 302-87-29

Реклама jurik.ru

В конфигурациях 1С часто встречаются иерархические справочники (номенклатура, контрагенты, статьи расходов и др.).
Для работы с такими данными удобно использовать язык запросов 1С, который предоставляет набор специальных функций, позволяющих получать не только отдельные элементы, но и всю цепочку родитель‑потомок.

Основные функции для работы с иерархией

  • Уровень – возвращает уровень вложенности элемента (0 – корень, 1 – его прямые потомки и т.д.).
  • Родитель – ссылка на непосредственного родителя элемента.
  • ПОТОМКИ(&Ссылка) – набор всех потомков (детей, внуков и т.д.) указанного элемента.
  • ПРЕДКИ(&Ссылка) – набор всех предков (родителей, дедов и т.д.) указанного элемента.
  • ИЕРАРХИЯ(&Ссылка) – набор элементов, образующих путь от корня до указанного элемента включительно.

Эти функции можно использовать прямо в условии ГДЕ или в списке выбираемых полей.

Получение всей иерархии справочника

Самый простой способ – выбрать все элементы, которые являются потомками корня справочника (или любого другого узла, от которого нужно построить дерево).

Пример 1: Иерархия от корня справочника «Номенклатура»

ВЫБРАТЬ
 Т.Ссылка КАК Ссылка,
 Т.Наименование КАК Наименование,
 Т.Родитель КАК Родитель,
 Т.Уровень КАК Уровень
ИЗ
 Справочник.Номенклатура КАК Т
ГДЕ
 Т.Ссылка В ПОТОМКАХ(&Справочник.Номенклатура.ПустаяСсылка) // корень – пустая ссылка
 ИЛИ Т.Ссылка = &Справочник.Номенклатура.ПустаяСсылка
УПОРЯДОЧИТЬ ПО
 Т.Уровень, Т.Наименование

Пояснения:

  • Пустая ссылка (Справочник.Номенклатура.ПустаяСсылка) соответствует корню иерархии.
  • Функция ПОТОМКИ возвращает всех потомков указанного элемента, поэтому условие Т.Ссылка В ПОТОМКАХ(&Корень) захватывает всю поддерево.
  • Добавляем условие ИЛИ Т.Ссылка = &Корень, чтобы сам корень также попал в результат.
  • Поле Уровень удобно использовать для визуального отступа в отчетах.

Пример 2: Иерархия от произвольного узла

Если нужно получить дерево, начинающееся с конкретного группы (например, «Оборудование»), достаточно подставить её ссылку в параметр.

ВЫБРАТЬ
 Т.Ссылка,
 Т.Наименование,
 Т.Родитель,
 Т.Уровень КАК Уровень
ИЗ
 Справочник.Номенклатура КАК Т
ГДЕ
 Т.Ссылка В ПОТОМКАХ(&ГруппаОборудование)
 ИЛИ Т.Ссылка = &ГруппаОборудование
УПОРЯДОЧИТЬ ПО
 Т.Уровень, Т.Наименование

Альтернативный способ: использование функции ИЕРАРХИЯ

Функция ИЕРАРХИЯ возвращает набор ссылок, образующих путь от корня до указанного элемента.
Она удобна, когда нужно получить не всё дерево, а только цепочку предков для конкретного элемента.

ВЫБРАТЬ
 Т.Ссылка,
 Т.Наименование,
 Т.Уровень КАК Уровень
ИЗ
 Справочник.Номенклатура КАК Т
ГДЕ
 Т.Ссылка В ИЕРАРХИИ(&ВыбранныйЭлемент)
УПОРЯДОЧИТЬ ПО
 Т.Уровень

Здесь &ВыбранныйЭлемент – параметр, содержащий ссылку на элемент, предков которого нужно получить.

Рекурсивные запросы (CTE) в 1С 8.3.12+

Начиная с версии 8.3.12 язык запросов поддерживает общие табличные выражения (CTE), что позволяет реализовать собственный обход иерархии, если стандартные функции не покрывают какой‑то специфический кейс.

ВЫБРАТЬ
 Т.Ссылка,
 Т.Наименование,
 Т.Родитель,
 0 КАК Уровень
ПОМЕСТИТЬ ВТ_Иерархия
ИЗ
 Справочник.Номенклатура КАК Т
ГДЕ
 Т.Ссылка = &Корень

ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
 Т.Ссылка,
 Т.Наименование,
 Т.Родитель,
 ВТ.Уровень + 1 КАК Уровень
ИЗ
 Справочник.Номенклатура КАК Т
 ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Иерархия КАК ВТ
 НА Т.Родитель = ВТ.Ссылка
ГДЕ
 Т.Ссылка <> &Корень

ВЫБРАТЬ
 *
ИЗ

 ВТ_Иерархия
УПОРЯДОЧИТЬ ПО
 Уровень, Наименование

Такой запрос полезно использовать, когда нужно добавить дополнительные вычисляемые поля (например, накопительные суммы) на каждом уровне иерархии.

Практические советы по производительности

  1. Ограничивайте выборку – указывайте конкретный корень или фильтр по свойствам, чтобы не сканировать весь справочник.
  2. Индексы – убедитесь, что по полям Ссылка и Родитель есть индексы (по умолчанию они присутствуют).
  3. Избегайте SELECT * – выбирайте только нужные поля, это уменьшит объём передаваемых данных.
  4. Кешируйте результаты – если иерархия используется часто, сохраняйте её во временную таблицу или в регистр накопления.
  5. Используйте параметры – подставляйте ссылки через параметры (&Корень), чтобы запрос мог переиспользоваться планом выполнения.

Для получения всей иерархии справочника в 1С достаточно воспользоваться функциями ПОТОМКИ, ПРЕДКИ или ИЕРАРХИЯ в сочетании с условием ГДЕ.
Пример запроса, показанный выше, возвращает ссылку, наименование, родителя и уровень вложенности каждого элемента, что позволяет легко построить древовидный вид в отчетах, формах или обработках.

Если понадобится более сложная логика (накопительные итоги, фильтрация по уровням, пользовательские вычисления), можно прибегнуть к CTE или к временным таблицам, но для большинства типовых задач стандартные функции иерархии оказываются достаточными и оптимальными.


Статья подготовлена на основе официальной документации 1С и общедоступных примеров запросов. Дата актуализации: .