После очередного обновления конфигурации «1С:Комплексная автоматизация 2.4» (или «1С:ERP 2») пользователи часто сталкиваются с неприятной ситуацией: процедура закрытия месяца начинает выдавать ошибки, указывая на отрицательные остатки в регистре себестоимости. При детальном анализе выясняется странная картина: в самих документах количество материалов указано верно, но регламентная операция «Расчет себестоимости» формирует движения по регистру Себестоимость товаров, в которых количество и стоимость списания материалов по регистраторам «Выпуск продукции» увеличиваются ровно в два (или более) раза.
В этой статье мы подробно разберем, почему возникает этот эффект, как устроена архитектура расчета себестоимости в современных конфигурациях 1С, где физически искать запросы и как пошагово локализовать и устранить эту проблему.
Прежде чем приступать к поискам кода, нам необходимо разобраться в логике работы механизма закрытия месяца. У многих разработчиков, привыкших к старым версиям программ 1С (например, УПП 1.3), возникает логичный вопрос: почему движения с «неправильными» цифрами появляются внутри документов «Выпуск продукции» или «Производство без заказа», а не в самом документе «Расчет себестоимости»?
Дело в том, что начиная с версии ERP 2.1.3, разработчики фирмы 1С кардинально изменили подход. Сам документ «Расчет себестоимости товаров» больше не делает прямых движений по регистрам накопления (таким как Себестоимость товаров или Выручка и себестоимость продаж). Вместо этого расчетный механизм выполняет сложнейшие вычисления в оперативной памяти, а затем дописывает скорректированные движения непосредственно в первичные документы (в нашем случае — в документы выпуска).
Для того чтобы отличить движения, созданные при обычном проведении документа пользователем, от расчетных движений закрытия месяца, используется специальный признак. В наборе записей регистров заполняется реквизит РасчетСебестоимости = Истина. При каждом повторном запуске закрытия месяца система сначала очищает эти расчетные движения, а затем записывает новые.
Попытка найти один конкретный статический запрос в конфигураторе, который рассчитывает себестоимость выпуска, обречена на провал. В «1С:КА 2.4» расчет себестоимости — это динамический конструктор. Пакетные запросы колоссального объема собираются в коде «на лету» в зависимости от настроек учетной политики, используемых разделов учета и наличия тех или иных хозяйственных операций.
Давайте разберем ключевые точки входа для локализации алгоритмов:
РасчетСебестоимости через процедуру РассчитатьВсе().РасчетСебестоимостиПрикладныеАлгоритмыРасчетСебестоимостиПостатейныеЗатратыРасчетСебестоимостиКорректировкаСтоимостиПараметрыРасчета.МенеджерВременныхТаблиц.Чтобы детально проанализировать, на каком именно этапе расчета происходит искажение данных, нам потребуется отладка. Мы можем использовать экспортные функции для выгрузки содержимого временных таблиц в табло отладчика. Например, проанализируем структуру таблиц с помощью следующего кода:
// Пример кода для отладки структуры временных таблиц расчета себестоимости
ТаблицыМВТ = ПолучитьОписаниеТаблицМВТ(ПараметрыРасчета.МенеджерВременныхТаблиц);
Для Каждого СтрокаТаблицы Из ТаблицыМВТ Цикл
// Выводим имена временных таблиц в журнал для анализа структуры данных
ЗаписьЖурналаРегистрации("ОтладкаСебестоимости",,,, СтрокаТаблицы.ИмяТаблицы);
КонецЦикла;
Проанализируем основные причины, из-за которых алгоритмы распределения затрат 1С начинают некорректно умножать показатели количества и стоимости.
Это самая распространенная методическая проблема. Встречный выпуск (или петля затрат) возникает, когда затраты на выпуск продукции прямо или косвенно зависят от стоимости самой этой продукции. Например, полуфабрикат «А» расходуется на производство полуфабриката «Б», а полуфабрикат «Б» входит в себестоимость «А».
При расчете себестоимости система пытается решить систему линейных уравнений методом последовательных итераций. Если в один из моментов времени на складе образуется дефицит (даже кратковременный), итерационный алгоритм сходимости может повести себя непредсказуемо. Пытаясь распределить неопределенную стоимость на недостающий остаток, система с каждым шагом начинает увеличивать (часто ровно удваивать) списываемые объемы, что приводит к лавинообразному росту количества в регистре.
Решение: Тщательно проверьте хронологию документов. Все поступления сырья и перемещения материалов на производство должны быть проведены строго до момента оформления выпуска продукции. Помогает смещение времени документов выпуска на конец дня.
Ситуация возникает, когда один и тот же материал списывается на один выпуск двумя разными путями одновременно:
В таком случае расчетный механизм может выполнить списание дважды: первый раз на основании спецификации/прямого указания в документе, второй раз — по результатам регламентного распределения затрат.
Классические отчеты, такие как «Ведомость по товарам на складах», группируют данные по номенклатуре и складу. Они могут показывать красивый положительный остаток (например, +4 штуки). Однако в регистре Себестоимость товаров ключевым измерением является АналитикаУчетаНоменклатуры.
Из-за различий в ГТД, видах запасов, назначениях или налогообложении НДС, один и тот же товар может «разойтись» по разным ключам аналитики. В регистре себестоимости на одном ключе может образоваться остаток +8 штук, а на другом -4 штуки. Система при расчете себестоимости видит «красноту» по конкретному ключу аналитики и при попытке скорректировать стоимость удваивает списание.
Решение: Проанализируем регистр себестоимости с помощью «Универсального отчета». Настроим группировку по всем измерениям регистра: Аналитика учета номенклатуры, Раздел учета, Вид запасов. Выявив скрытые минусы, мы сможем устранить их с помощью корректировки назначений или исправления видов запасов.
В некоторых обновлениях веток 2.4.10 и 2.4.11 разработчиками были допущены ошибки в коде динамических запросов распределения партий. Из-за некорректного наложения фильтров происходило декартово произведение таблиц остатков и таблиц партий списания, что приводило к кратному росту движений выпуска.
Решение: Если в результате анализа аналитики и встречного выпуска ошибок не обнаружено, следует обновить конфигурацию на более свежий стабильный релиз или установить официальные патчи от фирмы 1С, исправляющие расчет партий.
Если визуальный анализ документов не приносит результатов, применим технический метод поиска проблемного участка кода. Проанализируем ситуацию с помощью встроенного инструмента платформы 1С — «Замер производительности».
Выполним следующие шаги:
-debug.РасчетСебестоимости.Используя этот комплексный подход — от анализа аналитики учета до отладки временных таблиц — мы гарантированно найдем первопричину сбоя в расчете себестоимости и успешно закроем отчетный период.