Как реализовать многоуровневое разузлование спецификаций в отчете СКД для 1С:ERP

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

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

Постановка задачи и анализ структуры данных

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

Проанализируем основные сложности:

  1. Рекурсивность данных: Спецификация может ссылаться на номенклатуру, которая сама имеет спецификацию.
  2. Расчет количества: Количество сырья должно умножаться на количество полуфабриката, которое, в свою очередь, зависит от количества продукции в заказе.
  3. Единое визуальное представление: Пользователь хочет видеть иерархию «Продукция -> Комплектующая -> Сырье» в одном дереве, а не разнесенную по разным колонкам.

Шаг 1: Подготовка наборов данных в СКД

Для решения задачи нам не подойдет один плоский запрос. Мы воспользуемся механизмом Связи наборов данных. Создадим два основных набора данных типа «Запрос».

НаборДанных1 (Заказы): Этот запрос выбирает данные из документов ЗаказКлиента и его табличной части Товары. Здесь мы получаем исходное количество и номенклатуру.

НаборДанных2 (Состав): Этот запрос будет обращаться к регистру сведений ОсновныеСпецификации или напрямую к справочнику РесурсныеСпецификации_МатериалыИУслуги. Важно передавать в этот запрос параметр &Владелец (номенклатура-родитель), чтобы получить список материалов именно для конкретного узла.

Пример упрощенного запроса для получения состава:


ВЫБРАТЬ
    Материалы.Номенклатура КАК Материал,
    Материалы.Количество КАК КоличествоВКМ,
    Материалы.Ссылка.Владелец КАК Продукция
ИЗ
    Справочник.РесурсныеСпецификации.МатериалыИУслуги КАК Материалы
ГДЕ
    Материалы.Ссылка.Владелец = &НоменклатураПроизводства
    И Материалы.Ссылка.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыРесурсныхСпецификаций.Действует)

Шаг 2: Настройка рекурсивной связи наборов данных

Это ключевой момент. Чтобы СКД сама «раскручивала» дерево производства, мы должны связать НаборДанных2 сам с собой. Перейдем на закладку Связи наборов данных и выполним следующие настройки:

  1. Связываем НаборДанных1 (Источник) и НаборДанных2 (Приемник) по полю Номенклатура. В параметре связи для НаборДанных2 указываем НоменклатураПроизводства.
  2. Добавляем вторую связь, где Источником выступает НаборДанных2, а Приемником — снова НаборДанных2. Источник связи: Материал, Приемник связи: НоменклатураПроизводства.

Важный нюанс: Чтобы отчет не уходил в бесконечный цикл и не разворачивал лишнее, в запросе НаборДанных2 стоит добавить условие на способ обеспечения. Мы можем соединиться с регистром СхемаОбеспечения и проверять, является ли текущий материал «Собственным производством». Если это покупной товар, мы можем вернуть пустую спецификацию или флаг, запрещающий дальнейшее раскрытие.

Шаг 3: Вычисление ресурсов и расчет дефицита

Выясним причину, почему простые ресурсы могут работать некорректно. В иерархическом отчете нам нужно, чтобы КоличествоТребуется на нижнем уровне было произведением количества родителя на количество в спецификации. В СКД это удобно делать через Вычисляемые поля или правильно настроенные Выражения ресурсов.

Создадим поле ИтоговоеКоличество. В выражении ресурса для этого поля пропишем:

Сумма(ВычислитьВыражение("КоличествоВЗаказе", "НаборДанных1") * КоличествоВКМ)

Для расчета остатков и расхождений (дефицита) выполним следующие действия:

  1. Добавим в запрос НаборДанных2 левое соединение с виртуальной таблицей ТоварыНаСкладахОстатки.
  2. Определим ресурс ОстатокНаСкладе.
  3. Создадим вычисляемое поле Дефицит, выражение которого будет: ЕстьNULL(ОстатокНаСкладе, 0) - ИтоговоеКоличество.

Шаг 4: Настройка группировок для визуализации дерева

Чтобы отчет выглядел как наглядное дерево, а не как плоская таблица с повторяющимися данными, проанализируем настройки на закладке Настройки в СКД:

  1. Основная группировка — ЗаказКлиента.
  2. Под ней — группировка Номенклатура (из заказов).
  3. Далее добавляем группировку Материал. Для этой группировки в поле Тип группировки выберем Иерархия.

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

Шаг 5: Использование макетов для сложного оформления

Если стандартный вывод СКД кажется слишком «техническим», рассмотрим вариант использования Макетов оформления. Мы можем создать собственный макет для группировки. Это позволит нам:

Посмотрим на пример настройки условного оформления: выберем область «Строка», условие Дефицит Меньше 0, и установим цвет текста — Красный. Это позволит менеджеру по планированию мгновенно увидеть критические позиции, по которым требуется закупка или запуск производства.

Рекомендации по производительности

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

В этом случае эффективнее будет:

  1. Подготовить данные заранее в коде (в модуле объекта отчета).
  2. Использовать временные таблицы для формирования плоской структуры дерева с полями Ссылка и Родитель.
  3. Передать эту таблицу в СКД как Внешний набор данных.

Такой подход позволит выполнить разузлование одним пакетным запросом (используя иерархические возможности языка запросов или циклы в коде), что значительно ускорит получение результата в 1С:ERP.

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

← На главную