Как правильно рассчитать себестоимость готовой продукции по статьям затрат в 1С и почему могут пропадать данные?

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

Расчет фактической себестоимости выпущенной продукции с детализацией до статей затрат — одна из самых сложных задач в автоматизации бухгалтерского учета. В типовых конфигурациях 1С (например, 1С:Бухгалтерия 3.0) для этих целей предусмотрен специализированный регистр сведений РасчетКалькуляцииСебестоимости. Однако при попытке построить отчет на основе этого регистра разработчики часто сталкиваются с тем, что данные в консоли запросов отображаются корректно, а в итоговом отчете СКД — частично исчезают или не выводятся вовсе.

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

Разбор структуры запроса для получения себестоимости

Для решения задачи нам необходимо объединить данные о продажах (или выпуске) с данными о фактических затратах. Посмотрим на алгоритм формирования данных через пакетный запрос. Проанализируем каждый этап создания временных таблиц.

Этап 1. Получение данных об оборотах счета 43 (Готовая продукция)

Нам необходимо выделить обороты в разрезе номенклатурных групп и продукции. Мы используем виртуальную таблицу Обороты регистра бухгалтерии.


ВЫБРАТЬ
    ХозрасчетныйОбороты.Счет КАК счет,
    ХозрасчетныйОбороты.Субконто1 КАК Субконто1,
    ХозрасчетныйОбороты.КорСчет КАК КорСчет,
    ХозрасчетныйОбороты.КорСубконто1 КАК КорСубконто1,
    СУММА(ХозрасчетныйОбороты.КоличествоОборотКт) КАК КоличествоОборотКт,
    СУММА(ХозрасчетныйОбороты.СуммаОборотКт) КАК СуммаОборотКт
ПОМЕСТИТЬ Продажи
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, , Счет В (&ТоварыНаСкладах), , , , ) КАК ХозрасчетныйОбороты
ГДЕ
    ХозрасчетныйОбороты.КорСчет В(&КорСчет)
    И ХозрасчетныйОбороты.КорСубконто1 = &Номгр
СГРУППИРОВАТЬ ПО
    ХозрасчетныйОбороты.Счет,
    ХозрасчетныйОбороты.Субконто1,
    ХозрасчетныйОбороты.КорСчет,
    ХозрасчетныйОбороты.КорСубконто1;

Этап 2. Получение данных из регистра калькуляции

Регистр РасчетКалькуляцииСебестоимости содержит информацию о том, из чего сложилась стоимость продукции в конкретном месяце. Важно помнить, что данные в нем появляются только после успешного выполнения регламентной операции "Закрытие месяца".


ВЫБРАТЬ
    РасчетКалькуляцииСебестоимости.СтатьяЗатрат КАК СтатьяЗатрат,
    СУММА(РасчетКалькуляцииСебестоимости.Сумма) КАК Сумма,
    РасчетКалькуляцииСебестоимости.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа,
    РасчетКалькуляцииСебестоимости.Продукция КАК Продукция
ПОМЕСТИТЬ Темп
ИЗ
    РегистрСведений.РасчетКалькуляцииСебестоимости КАК РасчетКалькуляцииСебестоимости
ГДЕ
    РасчетКалькуляцииСебестоимости.ПериодРасчета МЕЖДУ &НачалоПериода И &КонецПериода
    И РасчетКалькуляцииСебестоимости.НезавершенноеПроизводство = ЛОЖЬ
    И РасчетКалькуляцииСебестоимости.СчетВыпуска.Код = "20.01"
СГРУППИРОВАТЬ ПО
    РасчетКалькуляцииСебестоимости.СтатьяЗатрат,
    РасчетКалькуляцииСебестоимости.НоменклатурнаяГруппа,
    РасчетКалькуляцииСебестоимости.Продукция;

Почему данные могут исчезать: основные причины

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

  1. Состав даты в параметрах. Если у параметров &НачалоПериода и &КонецПериода в СКД установлен тип Дата с составом "Дата", то система отсекает время. Например, если отчет строится по 31.01.2020, то данные за этот день, записанные после 00:00:00 (что актуально для регламентных операций закрытия месяца), не попадут в выборку. Решение: Установите состав даты "Дата и время".
  2. Использование Внутреннего соединения. Рассмотрим фрагмент кода: ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОсновноеПроизводство ПО Продажи.Субконто1 = ОсновноеПроизводство.Субконто1. Если в текущем месяце была продажа товара, который был выпущен в прошлом месяце, то в регистре калькуляции за текущий период его не будет. Внутреннее соединение исключит такую строку из результата. Решение: Всегда используйте ЛЕВОЕ СОЕДИНЕНИЕ от таблицы выпуска/продаж к таблице калькуляции.
  3. Автозаполнение в СКД. При включенном автозаполнении СКД может самостоятельно добавлять условия в виртуальные таблицы. Рассмотрим ситуацию: если вы передаете параметры периода внутрь виртуальной таблицы ХозрасчетныйОбороты вручную, СКД может продублировать их, что приведет к конфликту логики. Попробуйте убрать периоды из параметров виртуальных таблиц в тексте запроса, оставив их только в настройках СКД.

Методологические особенности расчета

При анализе себестоимости важно учитывать специфику работы программы 1С:

1. Закрытие месяца. Данные регистра РасчетКалькуляцииСебестоимости являются вторичными. Они формируются только при проведении документа РегламентнаяОперация с типом "Закрытие счетов 20, 23, 25, 26". Если бухгалтер перепровел первичный документ (например, ОтчетПроизводстваЗаСмену), но не перезакрыл месяц — данные в вашем отчете будут неактуальными или пустыми.

2. Номенклатурные группы. Связь между бухгалтерским счетом и калькуляцией идет через измерение НоменклатурнаяГруппа. Если в документах выпуска или реализации аналитика заполнена некорректно (разные группы для одной продукции), соединение в запросе ПО Темп.НоменклатурнаяГруппа = ХозрасчетныйОбороты.КорСубконто1 не сработает.

3. Косвенные расходы. Статьи затрат, приходящие со счетов 25 и 26, распределяются на 20 счет в конце месяца. Если вы видите, что сумма себестоимости в отчете меньше, чем в Оборотно-сальдовой ведомости, проверьте, включены ли в запрос все типы затрат и не стоит ли фильтр по конкретному подразделению, который отсекает общие расходы.

Практические рекомендации по отладке

Чтобы выяснить причину исчезновения данных, проделаем следующие шаги:

  1. Проверим наличие данных в самом регистре. Для этого перейдем в "Функции для технического специалиста" — "Регистры сведений" — "Расчет калькуляции себестоимости". Установим фильтр по периоду и интересующей нас продукции.
  2. В запросе временно заменим ВНУТРЕННЕЕ СОЕДИНЕНИЕ на ЛЕВОЕ СОЕДИНЕНИЕ. Добавим в выборку проверку: ЕСТЬNULL(Темп.Сумма, 0) КАК СуммаКалькуляции. Если в отчете появятся строки с нулевой суммой, значит, проблема в отсутствии записей в регистре калькуляции или в несовпадении аналитики (Продукция/НомГруппа).
  3. Для проверки влияния периодов воспользуемся функцией КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ) непосредственно в коде запроса, чтобы гарантированно захватить последнюю секунду суток.

Рассмотрим финальный пример корректировки соединения для повышения надежности отчета:


ВЫБРАТЬ
    Продажи.Субконто1 КАК Продукция,
    Продажи.КорСубконто1 КАК НоменклатурнаяГруппа,
    ЕСТЬNULL(Темп.СтатьяЗатрат, ЗНАЧЕНИЕ(Справочник.СтатьиЗатрат.ПустаяСсылка)) КАК СтатьяЗатрат,
    ЕСТЬNULL(Темп.Сумма, 0) КАК СуммаЗатрат
ИЗ
    Продажи КАК Продажи
ЛЕВОЕ СОЕДИНЕНИЕ
    Темп КАК Темп
ПО
    Продажи.Субконто1 = Темп.Продукция
    И Продажи.КорСубконто1 = Темп.НоменклатурнаяГруппа

Такой подход позволит увидеть в отчете даже те позиции, по которым калькуляция не рассчитана, что поможет пользователю быстро найти и исправить ошибки ведения учета.

← На главную