При разработке печатных форм и отчетов для производственных документов разработчики часто сталкиваются с задачей вывести себестоимость произведенной продукции непосредственно в документе Отчет производства за смену. Однако попытка получить фактическую стоимость запросом к регистру накопления ВыпускПродукции с фильтром по текущему документу возвращает пустые значения или нулевые суммы. Разберем причины такого поведения платформы, архитектуру производственного учета в конфигурации «1С:Управление производственным предприятием 1.3» и рассмотрим корректные способы решения задачи.
Проанализируем техническую сторону исходного запроса. В коде модуля объекта разработчики иногда пытаются передать текущий экземпляр документа через переменную ЭтотОбъект:
Запрос.УстановитьПараметр("ЭтотОбъект", ЭтотОбъект);
Поле Регистратор в таблицах регистров накопления всегда имеет ссылочный тип данных (например, ДокументСсылка.ОтчетПроизводстваЗаСмену). Переменная ЭтотОбъект содержит объектную ссылку на сам экземпляр документа в оперативной памяти (ДокументОбъект). Сравнение ссылки с объектом в СУБД всегда вернет ложь.
Чтобы установить фильтр по текущему документу, в параметрах запроса всегда следует передавать ссылку на записанный документ:
Запрос.УстановитьПараметр("ТекущийДокумент", ЭтотОбъект.Ссылка);
// или просто:
Запрос.УстановитьПараметр("ТекущийДокумент", Ссылка);
Важно: Если документ еще не записан в информационную базу, его движений в регистрах накопления не существует, и запрос по ссылке вернет пустой результат.
Выясним, почему даже при правильной передаче параметра Ссылка поле стоимости в движениях документа Отчет производства за смену не содержит фактической себестоимости.
В производственном учете 1С фактическая себестоимость выпуска принципиально не может быть рассчитана в момент проведения оперативного документа выпуска по следующим причинам:
В типовой конфигурации 1С:УПП 1.3 фактический расчет выполняется специализированным регламентным документом «Расчет себестоимости выпуска» (РСВ) при процедуре закрытия месяца. Движения с фактическими суммами затрат и скорректированной стоимостью выпуска формируются именно документом РСВ, а не исходным отчетом за смену.
Особенности поведения зависят от выбранного режима учета:
УчетЗатрат только в количественном выражении. Стоимостная оценка формируется исключительно документом РСВ путем решения системы линейных уравнений.Если руководству требуется печатная форма непосредственно в момент выпуска партии продукции (до закрытия месяца), в ней можно вывести нормативную (плановую) себестоимость или стоимость по спецификации.
Плановые цены в 1С:УПП хранятся в типовом регистре сведений ЦеныНоменклатуры. Чтобы они подставлялись в документы:
Установка цен номенклатуры должны быть зафиксированы плановые цены для продукции и материалов.Посмотрим на пример запроса для получения плановых цен и расчета материальных затрат по спецификации продукции:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Спецификации.Номенклатура КАК Материал,
| Спецификации.Количество КАК НормаКоличества,
| ЕСТЬNULL(Цены.Цена, 0) КАК ПлановаяЦена,
| Спецификации.Количество * ЕСТЬNULL(Цены.Цена, 0) КАК ПлановаяСумма
|ИЗ
| Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК Спецификации
| ЛЕВОЕ СОЕДИНЕНИЕ СрезПоследних.ЦеныНоменклатуры(&Период, ТипЦен = &ТипЦенПлановый) КАК Цены
| ПО Спецификации.Номенклатура = Цены.Номенклатура
|ГДЕ
| Спецификации.Ссылка = &Спецификация";
Запрос.УстановитьПараметр("Период", ДокументСсылка.Дата);
Запрос.УстановитьПараметр("Спецификация", ВыбСпецификация);
Запрос.УстановитьПараметр("ТипЦенПлановый", Константы.ТипЦенПлановойСебестоимостиНоменклатуры.Получить());
Результат = Запрос.Выполнить();
Если в организации ведется традиционный партионный учет и в документе Отчет производства за смену заполнены табличные части Материалы и Распределение материалов, мы можем рассчитать оперативную прямую материальную себестоимость на основе списанных партий.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Затраты.Продукция КАК Продукция,
| Затраты.Затрата КАК Материал,
| СУММА(Затраты.Количество) КАК Количество,
| СУММА(Затраты.Стоимость) КАК МатериальнаяСтоимость
|ИЗ
| РегистрНакопления.НезавершенноеПроизводство КАК Затраты
|ГДЕ
| Затраты.Регистратор = &ДокументСсылка
|СГРУППИРОВАТЬ ПО
| Затраты.Продукция,
| Затраты.Затрата";
Запрос.УстановитьПараметр("ДокументСсылка", Ссылка);
Результат = Запрос.Выполнить();
Ограничение: Эта стоимость отражает исключительно прямые материальные расходы, списанные со складов по учетным ценам партий на момент проведения документа. Она не включает косвенные цеховые расходы и может скорректироваться при восстановлении последовательности партионного учета.
Если печатная форма формируется постфактум за прошлые периоды, когда регламентная операция закрытия месяца уже выполнена, фактические затраты на единицу продукции рассчитываются по регистрам учета затрат.
В этом случае соединение выполняется не по регистратору, а по аналитике выпуска за период месяца:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВыпускОбороты.Номенклатура КАК Продукция,
| ВыпускОбороты.КоличествоОборот КАК ВыпущеноЗаМесяц,
| ВыпускОбороты.СтоимостьОборот КАК СтоимостьВыпускаЗаМесяц,
| ВЫБОР
| КОГДА ВыпускОбороты.КоличествоОборот <> 0
| ТОГДА ВыпускОбороты.СтоимостьОборот / ВыпускОбороты.КоличествоОборот
| ИНАЧЕ 0
| КОНЕЦ КАК ФактическаяСебестоимостьЕдиницы
|ИЗ
| РегистрНакопления.ВыпускПродукцииБухгалтерскийУчет.Обороты(
| НАЧАЛОПЕРИОДА(&ДатаДокумента, МЕСЯЦ),
| КОНЕЦПЕРИОДА(&ДатаДокумента, МЕСЯЦ),
| ,
| Номенклатура = &Номенклатура
| И Подразделение = &Подразделение
| ) КАК ВыпускОбороты";
Запрос.УстановитьПараметр("ДатаДокумента", Ссылка.Дата);
Запрос.УстановитьПараметр("Номенклатура", ВыбНоменклатура);
Запрос.УстановитьПараметр("Подразделение", Ссылка.Подразделение);
Результат = Запрос.Выполнить();
Рассчитанную среднюю фактическую себестоимость единицы за месяц можно умножить на количество продукции в конкретном отчете за смену для получения итоговой суммы.