Расчет фактической себестоимости выпущенной продукции с детализацией до статей затрат — одна из самых сложных задач в автоматизации бухгалтерского учета. В типовых конфигурациях 1С (например, 1С:Бухгалтерия 3.0) для этих целей предусмотрен специализированный регистр сведений РасчетКалькуляцииСебестоимости. Однако при попытке построить отчет на основе этого регистра разработчики часто сталкиваются с тем, что данные в консоли запросов отображаются корректно, а в итоговом отчете СКД — частично исчезают или не выводятся вовсе.
В этой статье мы подробно разберем, как построить запрос для получения себестоимости, проанализируем структуру данных и выясним причины типичных ошибок при работе с Системой компоновки данных.
Для решения задачи нам необходимо объединить данные о продажах (или выпуске) с данными о фактических затратах. Посмотрим на алгоритм формирования данных через пакетный запрос. Проанализируем каждый этап создания временных таблиц.
Этап 1. Получение данных об оборотах счета 43 (Готовая продукция)
Нам необходимо выделить обороты в разрезе номенклатурных групп и продукции. Мы используем виртуальную таблицу Обороты регистра бухгалтерии.
ВЫБРАТЬ
ХозрасчетныйОбороты.Счет КАК счет,
ХозрасчетныйОбороты.Субконто1 КАК Субконто1,
ХозрасчетныйОбороты.КорСчет КАК КорСчет,
ХозрасчетныйОбороты.КорСубконто1 КАК КорСубконто1,
СУММА(ХозрасчетныйОбороты.КоличествоОборотКт) КАК КоличествоОборотКт,
СУММА(ХозрасчетныйОбороты.СуммаОборотКт) КАК СуммаОборотКт
ПОМЕСТИТЬ Продажи
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, , Счет В (&ТоварыНаСкладах), , , , ) КАК ХозрасчетныйОбороты
ГДЕ
ХозрасчетныйОбороты.КорСчет В(&КорСчет)
И ХозрасчетныйОбороты.КорСубконто1 = &Номгр
СГРУППИРОВАТЬ ПО
ХозрасчетныйОбороты.Счет,
ХозрасчетныйОбороты.Субконто1,
ХозрасчетныйОбороты.КорСчет,
ХозрасчетныйОбороты.КорСубконто1;
Этап 2. Получение данных из регистра калькуляции
Регистр РасчетКалькуляцииСебестоимости содержит информацию о том, из чего сложилась стоимость продукции в конкретном месяце. Важно помнить, что данные в нем появляются только после успешного выполнения регламентной операции "Закрытие месяца".
ВЫБРАТЬ
РасчетКалькуляцииСебестоимости.СтатьяЗатрат КАК СтатьяЗатрат,
СУММА(РасчетКалькуляцииСебестоимости.Сумма) КАК Сумма,
РасчетКалькуляцииСебестоимости.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа,
РасчетКалькуляцииСебестоимости.Продукция КАК Продукция
ПОМЕСТИТЬ Темп
ИЗ
РегистрСведений.РасчетКалькуляцииСебестоимости КАК РасчетКалькуляцииСебестоимости
ГДЕ
РасчетКалькуляцииСебестоимости.ПериодРасчета МЕЖДУ &НачалоПериода И &КонецПериода
И РасчетКалькуляцииСебестоимости.НезавершенноеПроизводство = ЛОЖЬ
И РасчетКалькуляцииСебестоимости.СчетВыпуска.Код = "20.01"
СГРУППИРОВАТЬ ПО
РасчетКалькуляцииСебестоимости.СтатьяЗатрат,
РасчетКалькуляцииСебестоимости.НоменклатурнаяГруппа,
РасчетКалькуляцииСебестоимости.Продукция;
Проанализируем ситуацию, когда запрос в консоли работает, а в отчете — нет. Чаще всего проблема кроется в технической реализации связи таблиц и настройках параметров СКД.
&НачалоПериода и &КонецПериода в СКД установлен тип Дата с составом "Дата", то система отсекает время. Например, если отчет строится по 31.01.2020, то данные за этот день, записанные после 00:00:00 (что актуально для регламентных операций закрытия месяца), не попадут в выборку. Решение: Установите состав даты "Дата и время".ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОсновноеПроизводство ПО Продажи.Субконто1 = ОсновноеПроизводство.Субконто1. Если в текущем месяце была продажа товара, который был выпущен в прошлом месяце, то в регистре калькуляции за текущий период его не будет. Внутреннее соединение исключит такую строку из результата. Решение: Всегда используйте ЛЕВОЕ СОЕДИНЕНИЕ от таблицы выпуска/продаж к таблице калькуляции.ХозрасчетныйОбороты вручную, СКД может продублировать их, что приведет к конфликту логики. Попробуйте убрать периоды из параметров виртуальных таблиц в тексте запроса, оставив их только в настройках СКД.При анализе себестоимости важно учитывать специфику работы программы 1С:
1. Закрытие месяца. Данные регистра РасчетКалькуляцииСебестоимости являются вторичными. Они формируются только при проведении документа РегламентнаяОперация с типом "Закрытие счетов 20, 23, 25, 26". Если бухгалтер перепровел первичный документ (например, ОтчетПроизводстваЗаСмену), но не перезакрыл месяц — данные в вашем отчете будут неактуальными или пустыми.
2. Номенклатурные группы. Связь между бухгалтерским счетом и калькуляцией идет через измерение НоменклатурнаяГруппа. Если в документах выпуска или реализации аналитика заполнена некорректно (разные группы для одной продукции), соединение в запросе ПО Темп.НоменклатурнаяГруппа = ХозрасчетныйОбороты.КорСубконто1 не сработает.
3. Косвенные расходы. Статьи затрат, приходящие со счетов 25 и 26, распределяются на 20 счет в конце месяца. Если вы видите, что сумма себестоимости в отчете меньше, чем в Оборотно-сальдовой ведомости, проверьте, включены ли в запрос все типы затрат и не стоит ли фильтр по конкретному подразделению, который отсекает общие расходы.
Чтобы выяснить причину исчезновения данных, проделаем следующие шаги:
ВНУТРЕННЕЕ СОЕДИНЕНИЕ на ЛЕВОЕ СОЕДИНЕНИЕ. Добавим в выборку проверку: ЕСТЬNULL(Темп.Сумма, 0) КАК СуммаКалькуляции. Если в отчете появятся строки с нулевой суммой, значит, проблема в отсутствии записей в регистре калькуляции или в несовпадении аналитики (Продукция/НомГруппа).КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ) непосредственно в коде запроса, чтобы гарантированно захватить последнюю секунду суток.Рассмотрим финальный пример корректировки соединения для повышения надежности отчета:
ВЫБРАТЬ
Продажи.Субконто1 КАК Продукция,
Продажи.КорСубконто1 КАК НоменклатурнаяГруппа,
ЕСТЬNULL(Темп.СтатьяЗатрат, ЗНАЧЕНИЕ(Справочник.СтатьиЗатрат.ПустаяСсылка)) КАК СтатьяЗатрат,
ЕСТЬNULL(Темп.Сумма, 0) КАК СуммаЗатрат
ИЗ
Продажи КАК Продажи
ЛЕВОЕ СОЕДИНЕНИЕ
Темп КАК Темп
ПО
Продажи.Субконто1 = Темп.Продукция
И Продажи.КорСубконто1 = Темп.НоменклатурнаяГруппа
Такой подход позволит увидеть в отчете даже те позиции, по которым калькуляция не рассчитана, что поможет пользователю быстро найти и исправить ошибки ведения учета.