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

Устали копаться в группах номенклатуры? Откройте секреты выборки по дереву справочников и заставьте 1С находить нужное за миллисекунды.

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

+7 (800) 301-07-30

Реклама jurik.ru

Иерархические справочники — один из самых распространённых типов объектов метаданных в 1С:Предприятие. Классический пример — справочник «Номенклатура», который содержит информацию об услугах, материалах и товарах, сгруппированных по папкам (группам). В этой статье подробно разберём, как работать с такими справочниками в запросах: как выбрать элементы с учётом иерархии, как отобрать данные по группе и как обойти дерево.

Особенности иерархических справочников

Иерархический справочник отличается от обычного наличием поля Родитель (Parent), которое ссылается на группу или элемент того же справочника. Существует два вида иерархии:

  • Иерархия групп и элементов — группы могут содержать и элементы, и другие группы (как папки в проводнике);
  • Иерархия элементов — любой элемент может быть родителем другого элемента.

Также у элементов есть служебное поле ЭтоГруппа (IsFolder), позволяющее отличить группу от элемента.

Простой запрос к иерархическому справочнику

Базовый запрос к справочнику «Номенклатура» выглядит так:

ВЫБРАТЬ
 Номенклатура.Ссылка,
 Номенклатура.Код,
 Номенклатура.Наименование,
 Номенклатура.Родитель,
 Номенклатура.ЭтоГруппа
ИЗ
 Справочник.Номенклатура КАК Номенклатура

Чтобы выбрать только элементы (без групп), добавьте условие:

ГДЕ
 НЕ Номенклатура.ЭтоГруппа

Отбор элементов по группе с учётом вложенности

Самая частая задача — получить все элементы, входящие в определённую группу, включая все вложенные подгруппы. Для этого используется оператор В ИЕРАРХИИ:

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

Параметр &Группа передаётся в запрос программно:

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
 |Номенклатура.Ссылка,
 |Номенклатура.Наименование
 |ИЗ
 |Справочник.Номенклатура КАК Номенклатура
 |ГДЕ
 |Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)
 |И НЕ Номенклатура.ЭтоГруппа";

Запрос.УстановитьПараметр("Группа", ВыбраннаяГруппа);
Результат = Запрос.Выполнить.Выгрузить;

Чтобы получить результат запроса в виде иерархического дерева, используется предложение ИТОГИ ПО … ТОЛЬКО ИЕРАРХИЯ:

ВЫБРАТЬ
 Номенклатура.Ссылка,
 Номенклатура.Наименование
ИЗ
 Справочник.Номенклатура КАК Номенклатура
ИТОГИ ПО
 Номенклатура.Ссылка ТОЛЬКО ИЕРАРХИЯ

Обход такого результата выполняется методом Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией):

Выборка = Запрос.Выполнить.Выбрать(
 ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

Пока Выборка.Следующий Цикл
 Сообщить(Выборка.Наименование);
КонецЦикла;

Получение полного пути элемента

Иногда нужно вывести полный путь элемента, например «Материалы / Стройматериалы / Краска». Это можно сделать через последовательные соединения таблицы справочника самой с собой:

ВЫБРАТЬ
 Номенклатура.Наименование КАК Элемент,
 Номенклатура.Родитель.Наименование КАК Группа1,
 Номенклатура.Родитель.Родитель.Наименование КАК Группа2
ИЗ
 Справочник.Номенклатура КАК Номенклатура
ГДЕ
 НЕ Номенклатура.ЭтоГруппа

Учтите, что количество уровней в таком запросе фиксировано, для произвольной глубины иерархии путь формируют программно при обходе выборки.

Полезные рекомендации

  1. Всегда фильтруйте группы условием НЕ ЭтоГруппа, если нужны только элементы.
  2. Используйте В ИЕРАРХИИ вместо сравнения с родителем — это учитывает все уровни вложенности.
  3. Для отображения дерева в форме удобно выгружать результат в ДеревоЗначений через итоги по иерархии.
  4. Не забывайте про отбор по ПометкаУдаления = ЛОЖЬ, чтобы исключить удалённые объекты.

Работа с иерархическими справочниками в запросах 1С строится на трёх ключевых инструментах: поле Родитель, оператор В ИЕРАРХИИ и итоги ТОЛЬКО ИЕРАРХИЯ. Освоив их, вы сможете легко отбирать элементы по группам любой вложенности и выводить данные в виде удобного дерева, будь то номенклатура, подразделения или статьи затрат.