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