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