Как реализовать рекурсивное разузлование состава продукции в СКД?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Промышленность, строительство и АПК
← На главную

Реализация построения дерева спецификаций или разузлования продукции в СКД — это классическая задача для разработчика 1С, которая требует понимания того, как система компоновки данных обрабатывает связи между наборами данных. Поскольку СКД не поддерживает рекурсивные CTE напрямую, мы воспользуемся механизмом связей наборов данных для имитации рекурсии.

Основные принципы рекурсивного разузлования

Для решения задачи нам потребуется разделить получение данных на два этапа. Первый набор данных будет отвечать за выборку корневых элементов (готовой продукции), а второй — за выборку вложенных компонентов (материалов, полуфабрикатов), которые будут связываться сами с собой.

  1. Создание первого набора данных: Сформируем запрос, который выбирает номенклатуру, являющуюся продукцией. Это будут «вершины» нашего дерева.
  2. Создание второго набора данных: Этот набор будет содержать связь из регистра сведений или другого источника данных, где хранятся спецификации (Продукция и Материал).
  3. Настройка связей наборов данных: Это критический этап. Нам необходимо связать поле Материал из второго набора с полем Продукция из этого же набора.

Разбор процесса по шагам

Давайте проанализируем, как правильно настроить связи:

В настройках СКД перейдем на вкладку Связи наборов данных. Добавим новую связь, где источником данных будет наш рекурсивный набор, а приемником — он же сам. Установим параметр Связь таким образом, чтобы поле Материал первого уровня соответствовало полю Продукция следующего уровня.

Для того чтобы СКД корректно вывела дерево, необходимо правильно указать Параметры связи:


// Пример логики связи:
Источник: НаборДанныхСпецификация
Приемник: НаборДанныхСпецификация
Выражение источника: Материал
Выражение приемника: Продукция
Параметр: Иерархическая

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

Решение проблемы вывода всей продукции

Как отмечают опытные разработчики, основной сложностью является вывод всей продукции на первом уровне. Если вы используете обычный запрос, СКД может пытаться выводить только одну ветку. Чтобы этого избежать, убедитесь, что ваш первый набор данных (корневой) возвращает полный список Номенклатура, для которых реквизит ЭтоПродукция равен Истина.

Особенности визуализации

Для того чтобы дерево выглядело красиво в отчете:

  1. Перейдите в настройки СКД.
  2. В структуре отчета создайте Группировку по полю Продукция.
  3. В свойствах группировки установите тип иерархии — Иерархия.
  4. Если стандартного вывода недостаточно, можно добавить Вычисляемые поля для расчета УровеньВложенности, используя встроенные функции СКД или дополнительные Параметры виртуальных таблиц.

Когда стоит отказаться от СКД для разузлования?

Если спецификации вашего предприятия имеют огромную глубину или количество компонентов исчисляется тысячами, СКД может демонстрировать низкую производительность из-за множественных обращений к базе данных при каждом шаге рекурсии. В таких случаях мы рекомендуем:

Подготовка данных заранее: Создайте временную таблицу или отчетную таблицу, которая будет содержать «плоский» состав всей продукции со всеми уровнями вложенности. Сформируйте этот список с помощью кода (например, через временные таблицы в Запрос), а СКД используйте только для группировки уже подготовленных данных.

Этот подход значительно ускорит формирование отчетов и снизит нагрузку на сервер 1С, так как основная «тяжелая» работа по поиску вложенных элементов будет выполнена в одном или нескольких оптимизированных запросах к базе данных.

Мы рассмотрели основной технический метод работы с иерархией в СКД. Используя описанные настройки связей, вы сможете построить дерево любой сложности, обеспечив при этом наглядное представление данных для пользователей.

← На главную