Иерархические справочники — один из самых распространённых типов объектов метаданных в 1С:Предприятие. Классический пример — справочник «Номенклатура», который содержит информацию об услугах, материалах и товарах, сгруппированных по папкам (группам). В этой статье подробно разберём, как работать с такими справочниками в запросах: как выбрать элементы с учётом иерархии, как отобрать данные по группе и как обойти дерево.
Особенности иерархических справочников
Иерархический справочник отличается от обычного наличием поля Родитель (Parent), которое ссылается на группу или элемент того же справочника. Существует два вида иерархии:
- Иерархия групп и элементов — группы могут содержать и элементы, и другие группы (как папки в проводнике);
- Иерархия элементов — любой элемент может быть родителем другого элемента.
Также у элементов есть служебное поле ЭтоГруппа (IsFolder), позволяющее отличить группу от элемента.
Простой запрос к иерархическому справочнику
Базовый запрос к справочнику «Номенклатура» выглядит так:
ВЫБРАТЬ Номенклатура.Ссылка, Номенклатура.Код, Номенклатура.Наименование, Номенклатура.Родитель, Номенклатура.ЭтоГруппа ИЗ Справочник.Номенклатура КАК Номенклатура
Чтобы выбрать только элементы (без групп), добавьте условие:
ГДЕ НЕ Номенклатура.ЭтоГруппа
Отбор элементов по группе с учётом вложенности
Самая частая задача — получить все элементы, входящие в определённую группу, включая все вложенные подгруппы. Для этого используется оператор В ИЕРАРХИИ:
ВЫБРАТЬ Номенклатура.Ссылка, Номенклатура.Наименование ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.Ссылка В ИЕРАРХИИ(&Группа) И НЕ Номенклатура.ЭтоГруппа
Параметр &Группа передаётся в запрос программно:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|Номенклатура.Ссылка,
|Номенклатура.Наименование
|ИЗ
|Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)
|И НЕ Номенклатура.ЭтоГруппа";
Запрос.УстановитьПараметр("Группа", ВыбраннаяГруппа);
Результат = Запрос.Выполнить.Выгрузить;
Чтобы получить результат запроса в виде иерархического дерева, используется предложение ИТОГИ ПО … ТОЛЬКО ИЕРАРХИЯ:
ВЫБРАТЬ Номенклатура.Ссылка, Номенклатура.Наименование ИЗ Справочник.Номенклатура КАК Номенклатура ИТОГИ ПО Номенклатура.Ссылка ТОЛЬКО ИЕРАРХИЯ
Обход такого результата выполняется методом Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией):
Выборка = Запрос.Выполнить.Выбрать( ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); Пока Выборка.Следующий Цикл Сообщить(Выборка.Наименование); КонецЦикла;
Получение полного пути элемента
Иногда нужно вывести полный путь элемента, например «Материалы / Стройматериалы / Краска». Это можно сделать через последовательные соединения таблицы справочника самой с собой:
ВЫБРАТЬ Номенклатура.Наименование КАК Элемент, Номенклатура.Родитель.Наименование КАК Группа1, Номенклатура.Родитель.Родитель.Наименование КАК Группа2 ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ НЕ Номенклатура.ЭтоГруппа
Учтите, что количество уровней в таком запросе фиксировано, для произвольной глубины иерархии путь формируют программно при обходе выборки.
Полезные рекомендации
- Всегда фильтруйте группы условием НЕ ЭтоГруппа, если нужны только элементы.
- Используйте В ИЕРАРХИИ вместо сравнения с родителем — это учитывает все уровни вложенности.
- Для отображения дерева в форме удобно выгружать результат в ДеревоЗначений через итоги по иерархии.
- Не забывайте про отбор по ПометкаУдаления = ЛОЖЬ, чтобы исключить удалённые объекты.
Работа с иерархическими справочниками в запросах 1С строится на трёх ключевых инструментах: поле Родитель, оператор В ИЕРАРХИИ и итоги ТОЛЬКО ИЕРАРХИЯ. Освоив их, вы сможете легко отбирать элементы по группам любой вложенности и выводить данные в виде удобного дерева, будь то номенклатура, подразделения или статьи затрат.