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

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

При разработке собственных документов в конфигурации 1С:ERP Управление предприятием (редакции 2.4 и 2.5), которые выполняют производственные движения или списывают затраты, разработчики часто сталкиваются с проблемой: при проведении или распроведении типового документа (например, Этап производства) статус регламентных операций в рабочем месте Закрытие месяца корректно сбрасывается в состояние необходимости повторного выполнения, а при манипуляциях с самописным документом этого не происходит.

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

Как устроен механизм отслеживания изменений и закрытия месяца

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

  1. Подписки на события: В конфигурации зарегистрированы специализированные подписки на события ПриЗаписи, ПередУдалением и ОбработкаПроведения, в которых в качестве источника указаны строго определенные типовые документы. При изменении данных эти подписки вызывают методы общих модулей для фиксации факта модификации данных.
  2. Планы обмена механизма закрытия: Часть логики регистрации опирается на планы обмена, отслеживающие изменения объектов учетного контура для очередей фоновых расчетов.
  3. Регистры сведений очередей заданий: При изменении документов система создает записи в специализированных регистрах. Ключевым из них является регистр сведений Задания к расчету себестоимости, а также сопутствующие регистры: Задания к закрытию месяца, Задания к распределению затрат, Задания к формированию движений по НДС.
  4. Регистр сведений «Состояния операций закрытия месяца»: В данном регистре хранятся актуальные статусы каждого шага процедуры для конкретной организации и расчетного периода. При появлении записей в очереди заданий или смещении границы актуальности статус операции автоматически переключается с «Выполнено успешно» на «Требуется выполнение».

Почему самописный документ не инициирует перерасчет

Выясним причину, по которой проведение или отмена проведения самописного документа не сбрасывает статус закрытия месяца:

  1. Документ отсутствует в источниках подписок на события: Поскольку новый объект метаданных не включен в состав типа Источник типовых подписок регистрации закрытия месяца, системные алгоритмы регистрации изменений попросту не вызываются.
  2. Объект не включен в состав планов обмена: Механизмы отслеживания очереди изменений не видят новый документ в метаданных плана обмена.
  3. Отсутствие записей в регистре заданий: Типовой документ при проведении и отмене проведения программно сдвигает границу актуальности расчета назад до даты документа и делает запись в регистр сведений Задания к расчету себестоимости. Новый документ этих действий по умолчанию не выполняет.
  4. Разрыв аналитики производственного учета: Модуль расчета себестоимости (решение СЛАУ) оперирует сложными регистрами учета затрат и незавершенного производства (НЗП), ключами аналитики и ключами партий. Попытка вручную воспроизвести только часть движений приводит к ошибкам при самом расчете.

Вариант 1. Архитектурно правильное решение: использование типовых документов

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

Вместо этого реализуем следующую схему взаимодействия:

  1. Самописный документ выступает удобным интерфейсом (рабочим местом) для ввода первичных данных сотрудниками.
  2. В обработчике проведения кастомного документа программно создается, заполняется и проводится соответствующий типовой документ — Этап производства, Производственная операция или Производство без заказа (в зависимости от методики учета).
  3. При отмене проведения кастомного документа система программно распроводит или помечает на удаление связанный типовой документ.

Посмотрим на типовой пример реализации синхронизации в модуле объекта кастомного документа:


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

КонецПроцедуры

Процедура ОбработкаОтменыПроведения(Отказ)
    
    Если ЗначениеЗаполнено(ЭтотОбъект.СсылкаНаТиповойДокумент) Тогда
        ОбъектЭтап = ЭтотОбъект.СсылкаНаТиповойДокумент.ПолучитьОбъект();
        Если ОбъектЭтап <> Неопределено И ОбъектЭтап.Проведен Тогда
            Попытка
                ОбъектЭтап.Записать(РежимЗаписиДокумента.ОтменаПроведения);
            Исключение
                Отказ = Истина;
            КонецПопытки;
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры

Такой подход полностью делегирует формирование проводок, ключей аналитик и регистрацию заданий типовым механизмам платформы, сохраняя 100% совместимость со всеми алгоритмами закрытия месяца.

Вариант 2. Встраивание документа в механизм регистрации закрытия месяца

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

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

Проанализируем пример явной регистрации задания к расчету при проведении или отмене проведения документа:


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

КонецПроцедуры

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

← На главную