В разработке на платформе «1С:Предприятие» обычная иерархия справочников (по стандартному реквизиту Родитель) не всегда отвечает бизнес-требованиям. Часто возникает необходимость построить иерархическую структуру по произвольному реквизиту (например, ДопРодитель).
В этом рецепте описан процесс реализации альтернативной иерархии в Системе компоновки данных (СКД), настройки связей наборов данных и корректной работы стандартных отборов «В группе» или «В группе из списка».
Постановка задачи и исходные данные
Для примера возьмем следующую структуру метаданных:
- Справочник «Номенклатура» с дополнительным реквизитом ДопРодитель (тип: СправочникСсылка.Номенклатура).
- Регистр сведений «Минимальные остатки»: измерение Номенклатура (тип: СправочникСсылка.Номенклатура) и ресурс Остаток (тип: Число).
Шаг 1. Создание наборов данных в СКД
Для реализации механизма мы подготовим три набора данных (запроса):
1. Основной набор данных
Здесь мы собираем ключевые данные для отчета в плоскую таблицу (в нашем случае — номенклатуру и минимальные остатки).
2. Набор данных для построения иерархии
Этот набор отвечает за построение дерева снизу вверх (от подчиненных элементов к родительским).
- Важная особенность: для всех полей этого набора необходимо включить все доступные флажки (роли, ограничения и т.д.).
- В запрос этого набора передается параметр Ссылки, с помощью которого связываются основной и иерархический наборы.
- Правило именования: Поле, по которому достраивается иерархия, должно иметь одинаковое имя (синоним) в обоих наборах. Если в основном наборе поле называется «Товар», то и в наборе иерархии оно должно называться «Товар».
3. Набор данных для проверки вхождения (ПроверкаИерархии)
Данный набор необходим для корректной работы условий «В группе» и «В группе из списка» в пользовательских настройках. Он разворачивает дерево в обратном направлении — сверху вниз (от родителя к конечным элементам).
Шаг 2. Настройка связей наборов данных
После создания наборов перейдите на вкладку «Связи наборов данных» и настройте три связи:
1. Связь основного набора с набором «Иерархия»
Связывает исходные данные с механизмом построения дерева.
- Источник связи: Основной набор данных.
- Приемник связи: Набор «Иерархия».
- Выражение источника: Товар.
- Выражение приемника: Товар.
- Параметры: Укажите параметр Ссылки и обязательно установите флажок «Список параметров» (это позволит СКД передавать список элементов пакетом).
2. Рекурсивная связь набора «Иерархия» (сам с собой)
Необходима для рекурсивного обхода дерева снизу вверх.
- Источник связи: Набор «Иерархия».
- Приемник связи: Набор «Иерархия».
- Выражение источника: Родитель (поле, содержащее ссылку на альтернативного родителя).
- Выражение приемника: Товар.
- Параметры: Параметр Ссылки, флажок «Список параметров».
3. Рекурсивная связь набора проверки иерархии
Обеспечивает корректную проверку условий вхождения при отборах.
- Источник связи: Набор «ПроверкаИерархии».
- Приемник связи: Набор «ПроверкаИерархии».
- Выражение источника: Поле, по которому осуществляется проверка (например, ПроверкаИерархии).
- Выражение приемника: Родитель.
- Параметры: Укажите параметр ПроверкаИерархии и установите флажок «Список параметров».
Шаг 3. Настройка проверки иерархии для поля
Чтобы СКД понимала, какой механизм использовать при наложении иерархических фильтров пользователем:
- Перейдите на вкладку «Наборы данных» к основному набору.
- Найдите поле, по которому строится альтернативная иерархия (в нашем примере — Товар).
- В колонке «Проверка иерархии» укажите созданный ранее набор данных для проверки (ПроверкаИерархии) и соответствующий параметр связи (ПроверкаИерархии).
Шаг 4. Настройка параметров схемы
Перейдите на вкладку «Параметры» и проверьте свойства созданных параметров связи (Ссылки и ПроверкаИерархии):
- Укажите для них соответствующий тип данных (в данном случае — СправочникСсылка.Номенклатура).
- Обязательно установите флажок «Доступен список значений», так как платформа будет передавать в них массивы элементов при компоновке результата.
Для тех, кому нужно посложнее
В этом рецепте мы рассмотрели простой сценарий создания собственной иерархии в отчете на СКД.
Но можно делать и более сложные штуки, например объединить в иерархию данные нескольких справочников. А также есть нюанс по выбору элементов в отборе «В группе». Подробно я разбираю это в закрытом Клубе для разработчиков. Там же доступна и выгрузка .dt со всеми примерами. Буду рад видеть вас в числе резидентов Клуба!
Резюме
Использование трех наборов данных и правильное конфигурирование связей позволяют обойти ограничения стандартной платформенной иерархии 1С. Такая схема сохраняет за пользователем возможность использовать привычные инструменты детализации данных и гибкие иерархические отборы непосредственно в пользовательском режиме отчета.