Почему в 1С:УТ 11.4 перестала рассчитываться себестоимость и как это исправить?

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

Проблема с расчетом себестоимости в программе «1С:Управление торговлей 11.4» — одна из самых часто встречающихся задач, с которыми сталкиваются специалисты после внедрения или перехода с предыдущих версий (например, с 7.7 ТиС). Типичная ситуация: предварительный расчет исправно работал каждый день, но в какой-то момент данные в отчетах по валовой прибыли за вторую половину месяца внезапно исчезли — для этого подойдёт отчет по валовой прибыли и себестоимости без закрытия месяца. Проанализируем причины этой проблемы и разберем по шагам проверенные способы ее решения.

Суть механизма расчета себестоимости в УТ 11.4

Прежде чем переходить к исправлению ошибок, разберем, как работает этот механизм. В системе существует два основных варианта расчета:

  1. Предварительный расчет: выполняется в течение месяца (обычно регламентным заданием) для оперативного получения данных в отчетах. Он использует упрощенные алгоритмы (среднюю оценку) и не формирует окончательных движений по партиям.
  2. Фактический расчет: выполняется в конце месяца в рамках процедуры Закрытие месяца (поможет обработка исправления ошибок для закрытия месяца) . Он производит окончательное распределение расходов на документы реализации и перемещения, расчет партий по методу FIFO (если он выбран) и формирует итоговые цифры.

Важный нюанс: если в системе за текущий месяц уже создан документ Расчет себестоимости товаров с видом «Фактический», механизм предварительного расчета блокируется. Система «считает», что раз вы уже начали закрывать месяц окончательно, оперативные (предварительные) данные вам больше не нужны. Именно в этом часто кроется причина пустых колонок в отчетах после определенной даты.

Причина 1: Наличие документа фактического расчета

Рассмотрим ситуацию: вы работали в середине января, и регламентное задание исправно создавало документы предварительного расчета. Но кто-то из пользователей или сама система (при формировании определенных отчетов) инициировала создание документа с типом «Фактический» на дату 31.01. С этого момента все продажи, совершенные после даты последнего успешного расчета, перестают показывать себестоимость в отчете Валовая прибыль, так как предварительный расчет больше не запускается.

Как исправить:

  1. Перейдем в список документов Расчет себестоимости товаров.
  2. Найдем документ с видом «Фактический» за текущий месяц.
  3. Удалим его (не просто пометим на удаление, а именно удалим, чтобы система не пыталась к нему обращаться).
  4. После этого регламентное задание Предварительный расчет себестоимости снова сможет создавать нужные документы.

Причина 2: Смена настроек в документе «Расчет себестоимости»

Проанализируем интересную особенность конфигурации. Иногда при запуске тяжелых отчетов (например, Себестоимость товаров организаций) система может автоматически инициировать фоновый пересчет. В некоторых релизах УТ 11.4 замечено, что при этом в существующем документе расчета могут самопроизвольно измениться реквизиты.

Выясним, что именно меняется:

Если документов много или ручное удаление не помогает, воспользуемся стандартной обработкой Групповое изменение реквизитов:

  1. Выберем объект Документ.РасчетСебестоимостиТоваров (для ускорения работы с данными можно использовать универсальный менеджер редактирования реквизитов и движений).
  2. Установим отбор по документам текущего месяца.
  3. Установим новые значения: Метод оценки — Средняя за месяц, Предварительный расчет — Да (Истина).
  4. Выполним изменение. Это «вернет» документы в состояние предварительных и позволит отчету валовой прибыли снова видеть данные.

Причина 3: Использование внешнего кода для принудительного расчета

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


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

// Вызов серверного метода расчета
СебестоимостьРассчитана = РасчетСебестоимости.РассчитатьВсеВПопыткеИсключении(ПараметрыЗапускаРасчетаСебестоимости);

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

Причина 4: Проблемы с очередью заданий и блокировками

В конфигурациях на базе ERP 2.0 (к которым относится и УТ 11.4) расчет себестоимости сильно зависит от регистра сведений Задания к расчету себестоимости. Если в этом регистре «повисли» старые записи или возникли взаимоблокировки, расчет за новый период может просто не начаться.

Посмотрим на пример кода, который помогает обойти проблемы с блокировками организаций в фоновых заданиях (актуально для более ранних версий 11.3/11.4):


// Пример модификации процедуры ЗаблокироватьРегистрЗаданий
Процедура ЗаблокироватьРегистрЗаданий(ИмяРегистраЗаданий, НомерЗаданияДоРасчета, АналитикиРасчета)
    Блокировка = Новый БлокировкаДанных;
    ИмяРегистра = "РегистрСведений." + ИмяРегистраЗаданий;
    ЭлементБлокировки = Блокировка.Добавить(ИмяРегистра);
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    
    // Если организация передана как одиночная ссылка, преобразуем в массив для корректной работы
    Если ТипЗнч(АналитикиРасчета.Организации) = Тип("СправочникСсылка.Организации") Тогда
        ОрганизацияЗакрытия = АналитикиРасчета.Организации;
        АналитикиРасчета.Организации = Новый Массив;
        АналитикиРасчета.Организации.Добавить(ОрганизацияЗакрытия);
    КонецЕсли;
    
    Блокировка.Заблокировать();
КонецПроцедуры

Этот код помогает системе корректно обрабатывать очередь заданий в разрезе организаций, предотвращая «зависание» расчета.

Дополнительные рекомендации по диагностике

Если вышеперечисленные методы не помогли, рекомендуем проверить следующие моменты:

  1. Отрицательные остатки: Если включена система FIFO (партионный учет 2.2), наличие «минусов» на складах или по организациям (регистр Товары организаций) может полностью блокировать расчет партий по конкретной позиции. Система просто не понимает, из какой поставки списать товар, которого официально нет.
  2. Интеркампани: Проверьте настройку Передачи товаров между организациями. Если товар продан одной организацией, а числится на другой, и документы передачи еще не сформированы, себестоимость может не рассчитаться до момента закрытия месяца.
  3. Регистр «Стоимость товаров»: Проанализируйте движения в этом регистре. Именно из него отчеты берут данные. Если в регистре Себестоимость товаров данные есть (см. диагностика расхождений в регистрах товаров и себестоимости), а в Стоимость товаров (периодический регистр сведений) — нет, значит, расчет не завершился успешно.
  4. Партионный учет: Убедитесь, что в настройках НСИ и администрирование -> Финансовый результат и контроллинг включен флаг Партионный учет. Если вы используете метод FIFO, этот флаг обязателен.

Проанализировав ситуацию, можно сделать вывод: в большинстве случаев «исчезновение» себестоимости в УТ 11.4 связано с конфликтом между предварительным и фактическим расчетами. Следите за тем, чтобы документы Расчет себестоимости товаров с видом «Фактический» появлялись в системе только один раз в конце месяца, после окончательной выверки всех документов.

← На главную