При разработке отчетов для планирования производства в 1С:ERP 2.2 одной из самых сложных задач является вывод полной структуры изделия. Нам часто требуется не просто показать список комплектующих первого уровня, но и «заглянуть глубже» — развернуть те компоненты, которые мы производим сами, до уровня исходного сырья. При этом важно сохранить единую структуру колонок для количества, остатков на складах и итогового дефицита. Разберем подробно, как реализовать такую задачу с помощью механизмов Системы компоновки данных (СКД).
Рассмотрим стандартную ситуацию: у нас есть Заказ клиента, в котором указана готовая продукция. Для этой продукции в системе задана Основная спецификация (ресурсная спецификация). Продукция состоит из комплектующих. Некоторые из них являются покупными, а некоторые — полуфабрикатами собственного производства. Нам необходимо получить дерево, где для покупных изделий отображается только их наличие, а для полуфабрикатов — их состав (сырье), при этом расчет требуемого количества должен проходить сквозь все уровни вложенности.
Проанализируем основные сложности:
Для решения задачи нам не подойдет один плоский запрос. Мы воспользуемся механизмом Связи наборов данных. Создадим два основных набора данных типа «Запрос».
НаборДанных1 (Заказы): Этот запрос выбирает данные из документов ЗаказКлиента и его табличной части Товары. Здесь мы получаем исходное количество и номенклатуру.
НаборДанных2 (Состав): Этот запрос будет обращаться к регистру сведений ОсновныеСпецификации или напрямую к справочнику РесурсныеСпецификации_МатериалыИУслуги. Важно передавать в этот запрос параметр &Владелец (номенклатура-родитель), чтобы получить список материалов именно для конкретного узла.
Пример упрощенного запроса для получения состава:
ВЫБРАТЬ
Материалы.Номенклатура КАК Материал,
Материалы.Количество КАК КоличествоВКМ,
Материалы.Ссылка.Владелец КАК Продукция
ИЗ
Справочник.РесурсныеСпецификации.МатериалыИУслуги КАК Материалы
ГДЕ
Материалы.Ссылка.Владелец = &НоменклатураПроизводства
И Материалы.Ссылка.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыРесурсныхСпецификаций.Действует)
Это ключевой момент. Чтобы СКД сама «раскручивала» дерево производства, мы должны связать НаборДанных2 сам с собой. Перейдем на закладку Связи наборов данных и выполним следующие настройки:
НаборДанных1 (Источник) и НаборДанных2 (Приемник) по полю Номенклатура. В параметре связи для НаборДанных2 указываем НоменклатураПроизводства.НаборДанных2, а Приемником — снова НаборДанных2. Источник связи: Материал, Приемник связи: НоменклатураПроизводства.Важный нюанс: Чтобы отчет не уходил в бесконечный цикл и не разворачивал лишнее, в запросе НаборДанных2 стоит добавить условие на способ обеспечения. Мы можем соединиться с регистром СхемаОбеспечения и проверять, является ли текущий материал «Собственным производством». Если это покупной товар, мы можем вернуть пустую спецификацию или флаг, запрещающий дальнейшее раскрытие.
Выясним причину, почему простые ресурсы могут работать некорректно. В иерархическом отчете нам нужно, чтобы КоличествоТребуется на нижнем уровне было произведением количества родителя на количество в спецификации. В СКД это удобно делать через Вычисляемые поля или правильно настроенные Выражения ресурсов.
Создадим поле ИтоговоеКоличество. В выражении ресурса для этого поля пропишем:
Сумма(ВычислитьВыражение("КоличествоВЗаказе", "НаборДанных1") * КоличествоВКМ)
Для расчета остатков и расхождений (дефицита) выполним следующие действия:
НаборДанных2 левое соединение с виртуальной таблицей ТоварыНаСкладахОстатки.ОстатокНаСкладе.Дефицит, выражение которого будет: ЕстьNULL(ОстатокНаСкладе, 0) - ИтоговоеКоличество.Чтобы отчет выглядел как наглядное дерево, а не как плоская таблица с повторяющимися данными, проанализируем настройки на закладке Настройки в СКД:
ЗаказКлиента.Номенклатура (из заказов).Материал. Для этой группировки в поле Тип группировки выберем Иерархия.Именно использование системного типа группировки Иерархия позволяет СКД выводить данные «лесенкой» в одной колонке. При этом все числовые показатели (количество, остатки) будут аккуратно выравниваться по своим столбцам независимо от уровня вложенности материала.
Если стандартный вывод СКД кажется слишком «техническим», рассмотрим вариант использования Макетов оформления. Мы можем создать собственный макет для группировки. Это позволит нам:
Дефицит < 0 (через условное оформление).Уровень).Посмотрим на пример настройки условного оформления:
выберем область «Строка», условие Дефицит Меньше 0, и установим цвет текста — Красный. Это позволит менеджеру по планированию мгновенно увидеть критические позиции, по которым требуется закупка или запуск производства.
Проанализируем ситуацию с большими спецификациями. Рекурсивные связи наборов данных в СКД выполняют отдельный запрос к базе на каждую строку связи. Если в заказе сотни позиций, а дерево изделия имеет глубину 5-10 уровней, отчет может работать медленно.
В этом случае эффективнее будет:
Ссылка и Родитель.Такой подход позволит выполнить разузлование одним пакетным запросом (используя иерархические возможности языка запросов или циклы в коде), что значительно ускорит получение результата в 1С:ERP.
Таким образом, комбинируя связи наборов данных, иерархические группировки и вычисляемые ресурсы, мы получаем мощный инструмент для анализа производственных потребностей, который полностью закрывает вопрос многоуровневого планирования состава изделий.