Как устранить дублирование продукции и материалов в отчете «Производство без заказа»

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

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

Выясняем причину: декартово произведение таблиц

Проанализируем техническую сторону вопроса. В документе ПроизводствоБезЗаказа (как и во многих других документах в 1С:ERP или Комплексной автоматизации) данные хранятся в разных табличных частях: ВыходныеИзделия и МатериалыИУслуги. Когда мы пытаемся в одном запросе соединить эти таблицы через ЛЕВОЕ СОЕДИНЕНИЕ по полю Ссылка, возникает эффект, называемый в математике «декартовым произведением».

Представим ситуацию: в документе 1 строка продукции и 5 строк материалов. При соединении СУБД сопоставит одну строку продукции с каждой из пяти строк материалов. В итоге запрос вернет 5 строк, где продукция будет повторяться 5 раз. Если же в документе будет 2 строки продукции и 5 строк материалов, на выходе мы получим уже 10 строк. Это и есть причина «задваивания», которую невозможно исправить простой настройкой консоли запросов без изменения структуры самого запроса.

Решение №1: Использование связей наборов данных в СКД

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

  1. Создадим Набор данных - запрос (назовем его НаборПродукция), который выбирает только данные из табличной части ВыходныеИзделия.
  2. Создадим второй Набор данных - запрос (назовем его НаборМатериалы), который выбирает данные только из таблицы МатериалыИУслуги.
  3. Перейдем на вкладку Связи наборов данных. Здесь мы укажем, что НаборПродукция является источником, а НаборМатериалы — приемником. В качестве условия связи выберем поле Ссылка (документ-основание).

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

Решение №2: Объединение запросов (UNION ALL)

Посмотрим на ситуацию под другим углом. Если нам нужно вывести плоский список, где сначала идет продукция, а затем материалы, мы можем использовать оператор ОБЪЕДИНИТЬ ВСЕ. Проанализируем пример кода:


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

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Производство.Ссылка,
    Материалы.Номенклатура,
    "Материал",
    Материалы.Количество
ИЗ
    Документ.ПроизводствоБезЗаказа.МатериалыИУслуги КАК Материалы
ГДЕ
    Материалы.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода

В данном случае мы выбираем данные «в высоту», а не «в ширину». Чтобы отчет выглядел красиво, в настройках СКД достаточно добавить группировку по полю Документ или Марка.

Решение №3: Обращение к регистрам накопления

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

Использование регистра решает сразу несколько проблем:

Настройка иерархического вывода в СКД

Чтобы добиться формы «Марка и под ней компоненты», выполним следующие шаги в настройках отчета:

  1. Откроем вкладку Настройки в схеме компоновки данных.
  2. В иерархии группировок создадим верхний уровень по полю Номенклатура (ваша Марка).
  3. Внутри этой группировки добавим подчиненную группировку Детальные записи, куда выведем компоненты (материалы).
  4. Для того чтобы данные не дублировались визуально, убедимся, что ресурсы (например, количество) рассчитываются корректно через СУММА(Количество) на вкладке Ресурсы.

Исправляем проблему с периодом

Выясним причину, по которой отчет может выводить лишние документы, несмотря на установленные даты. В СКД мало просто создать параметры НачалоПериода и КонецПериода. Их необходимо явно прописать в тексте запроса в секции ГДЕ.

Проанализируем пример правильного условия:

ГДЕ ПроизводствоБезЗаказа.Дата МЕЖДУ &НачалоПериода И &КонецПериода

Также проверьте вкладку Параметры в СКД. Убедитесь, что для параметров периода не стоит галочка «Ограничение доступности», иначе пользователь не сможет изменить их в пользовательском режиме. Важно: для удобства пользователя лучше использовать тип СтандартныйПериод, а в самом запросе обращаться к его границам: &Период.ДатаНачала и &Период.ДатаОкончания.

Резюме

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

← На главную