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

Программист 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация Управленческий учет IT и автоматизация бизнеса
← На главную

После очередного обновления конфигурации «1С:Комплексная автоматизация 2.4» (или «1С:ERP 2») пользователи часто сталкиваются с неприятной ситуацией: процедура закрытия месяца начинает выдавать ошибки, указывая на отрицательные остатки в регистре себестоимости. При детальном анализе выясняется странная картина: в самих документах количество материалов указано верно, но регламентная операция «Расчет себестоимости» формирует движения по регистру Себестоимость товаров, в которых количество и стоимость списания материалов по регистраторам «Выпуск продукции» увеличиваются ровно в два (или более) раза.

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

1. Архитектурная особенность: почему движения записываются в «Выпуск продукции»?

Прежде чем приступать к поискам кода, нам необходимо разобраться в логике работы механизма закрытия месяца. У многих разработчиков, привыкших к старым версиям программ 1С (например, УПП 1.3), возникает логичный вопрос: почему движения с «неправильными» цифрами появляются внутри документов «Выпуск продукции» или «Производство без заказа», а не в самом документе «Расчет себестоимости»?

Дело в том, что начиная с версии ERP 2.1.3, разработчики фирмы 1С кардинально изменили подход. Сам документ «Расчет себестоимости товаров» больше не делает прямых движений по регистрам накопления (таким как Себестоимость товаров или Выручка и себестоимость продаж). Вместо этого расчетный механизм выполняет сложнейшие вычисления в оперативной памяти, а затем дописывает скорректированные движения непосредственно в первичные документы (в нашем случае — в документы выпуска).

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

2. Где физически искать запросы по расчету себестоимости?

Попытка найти один конкретный статический запрос в конфигураторе, который рассчитывает себестоимость выпуска, обречена на провал. В «1С:КА 2.4» расчет себестоимости — это динамический конструктор. Пакетные запросы колоссального объема собираются в коде «на лету» в зависимости от настроек учетной политики, используемых разделов учета и наличия тех или иных хозяйственных операций.

Давайте разберем ключевые точки входа для локализации алгоритмов:

Чтобы детально проанализировать, на каком именно этапе расчета происходит искажение данных, нам потребуется отладка. Мы можем использовать экспортные функции для выгрузки содержимого временных таблиц в табло отладчика. Например, проанализируем структуру таблиц с помощью следующего кода:


// Пример кода для отладки структуры временных таблиц расчета себестоимости
ТаблицыМВТ = ПолучитьОписаниеТаблицМВТ(ПараметрыРасчета.МенеджерВременныхТаблиц);
Для Каждого СтрокаТаблицы Из ТаблицыМВТ Цикл
    // Выводим имена временных таблиц в журнал для анализа структуры данных
    ЗаписьЖурналаРегистрации("ОтладкаСебестоимости",,,, СтрокаТаблицы.ИмяТаблицы);
КонецЦикла;

3. Основные причины задвоения списания материалов

Проанализируем основные причины, из-за которых алгоритмы распределения затрат 1С начинают некорректно умножать показатели количества и стоимости.

А. Встречный выпуск и закольцованность производства

Это самая распространенная методическая проблема. Встречный выпуск (или петля затрат) возникает, когда затраты на выпуск продукции прямо или косвенно зависят от стоимости самой этой продукции. Например, полуфабрикат «А» расходуется на производство полуфабриката «Б», а полуфабрикат «Б» входит в себестоимость «А».

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

Решение: Тщательно проверьте хронологию документов. Все поступления сырья и перемещения материалов на производство должны быть проведены строго до момента оформления выпуска продукции. Помогает смещение времени документов выпуска на конец дня.

Б. Конфликт ручного и автоматического распределения

Ситуация возникает, когда один и тот же материал списывается на один выпуск двумя разными путями одновременно:

  1. Материал указан вручную на вкладке «Материалы и работы» в документе выпуска (например, «Производство без заказа»).
  2. Этот же материал распределен на этот же выпуск через специализированное рабочее место «Распределение материалов и работ» (или по статье затрат с вариантом распределения «На себестоимость производства (прямые)»).

В таком случае расчетный механизм может выполнить списание дважды: первый раз на основании спецификации/прямого указания в документе, второй раз — по результатам регламентного распределения затрат.

В. Скрытые отрицательные остатки по ключам аналитики

Классические отчеты, такие как «Ведомость по товарам на складах», группируют данные по номенклатуре и складу. Они могут показывать красивый положительный остаток (например, +4 штуки). Однако в регистре Себестоимость товаров ключевым измерением является АналитикаУчетаНоменклатуры.

Из-за различий в ГТД, видах запасов, назначениях или налогообложении НДС, один и тот же товар может «разойтись» по разным ключам аналитики. В регистре себестоимости на одном ключе может образоваться остаток +8 штук, а на другом -4 штуки. Система при расчете себестоимости видит «красноту» по конкретному ключу аналитики и при попытке скорректировать стоимость удваивает списание.

Решение: Проанализируем регистр себестоимости с помощью «Универсального отчета». Настроим группировку по всем измерениям регистра: Аналитика учета номенклатуры, Раздел учета, Вид запасов. Выявив скрытые минусы, мы сможем устранить их с помощью корректировки назначений или исправления видов запасов.

Г. Ошибки релиза конфигурации (баги)

В некоторых обновлениях веток 2.4.10 и 2.4.11 разработчиками были допущены ошибки в коде динамических запросов распределения партий. Из-за некорректного наложения фильтров происходило декартово произведение таблиц остатков и таблиц партий списания, что приводило к кратному росту движений выпуска.

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

4. Как найти ошибку с помощью замера производительности

Если визуальный анализ документов не приносит результатов, применим технический метод поиска проблемного участка кода. Проанализируем ситуацию с помощью встроенного инструмента платформы 1С — «Замер производительности».

Выполним следующие шаги:

  1. Запустим сеанс «1С:Предприятие» в режиме отладки. Если база находится на серверном кластере, убедимся, что на сервере включена отладка с параметром -debug.
  2. Откроем рабочее место «Закрытие месяца» и дойдем до шага «Расчет себестоимости».
  3. В конфигураторе выберем пункт меню Отладка -> Замер производительности (включим его).
  4. В режиме пользователя запустим расчет себестоимости. Как только начнется этап расчета или программа выдаст ошибку, остановим замер производительности в конфигураторе.
  5. В открывшейся таблице замера отсортируем строки по колонке «Время (%)». Обратим внимание на процедуры общих модулей с префиксом РасчетСебестоимости.
  6. Найдем ресурсоемкие запросы, которые выполняются в циклах. Именно там происходит динамическое построение временных таблиц, в которых задваиваются строки.

Используя этот комплексный подход — от анализа аналитики учета до отладки временных таблиц — мы гарантированно найдем первопричину сбоя в расчете себестоимости и успешно закроем отчетный период.

← На главную