При разработке собственных документов в конфигурации 1С:ERP Управление предприятием (редакции 2.4 и 2.5), которые выполняют производственные движения или списывают затраты, разработчики часто сталкиваются с проблемой: при проведении или распроведении типового документа (например, Этап производства) статус регламентных операций в рабочем месте Закрытие месяца корректно сбрасывается в состояние необходимости повторного выполнения, а при манипуляциях с самописным документом этого не происходит.
Разберем детально, как устроен механизм актуализации расчета себестоимости в 1С:ERP, почему новый объект метаданных игнорируется системой и какие способы решения задачи являются технически правильными и безопасными для обновлений.
Проанализируем архитектуру рабочего места закрытия месяца. Система не выполняет динамический опрос всех учетных регистров при открытии обработки — это привело бы к колоссальным просадкам производительности. Вместо этого в 1С:ERP реализована событийно-очередная модель фиксации изменений:
ПриЗаписи, ПередУдалением и ОбработкаПроведения, в которых в качестве источника указаны строго определенные типовые документы. При изменении данных эти подписки вызывают методы общих модулей для фиксации факта модификации данных.Задания к расчету себестоимости, а также сопутствующие регистры: Задания к закрытию месяца, Задания к распределению затрат, Задания к формированию движений по НДС.Выясним причину, по которой проведение или отмена проведения самописного документа не сбрасывает статус закрытия месяца:
Источник типовых подписок регистрации закрытия месяца, системные алгоритмы регистрации изменений попросту не вызываются.Задания к расчету себестоимости. Новый документ этих действий по умолчанию не выполняет.Рассмотрим наиболее надежный подход к доработке, который предотвращает проблемы при последующих обновлениях конфигурации. Если пользователям требуется нестандартный интерфейс ввода, специализированные реквизиты или разделение выпуска по дням, самописный документ не должен напрямую двигать регистры учета затрат и себестоимости.
Вместо этого реализуем следующую схему взаимодействия:
Этап производства, Производственная операция или Производство без заказа (в зависимости от методики учета).Посмотрим на типовой пример реализации синхронизации в модуле объекта кастомного документа:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// Создаем или обновляем связанный типовой документ
ДокументЭтап = ПолучитьИлиСоздатьТиповойЭтап();
// Заполняем реквизиты и табличные части типового документа на основании текущего
ЗаполнитьРеквизитыТиповогоЭтапа(ДокументЭтап);
Попытка
ДокументЭтап.Записать(РежимЗаписиДокумента.Проведение);
ЭтотОбъект.СсылкаНаТиповойДокумент = ДокументЭтап.Ссылка;
Исключение
Отказ = Истина;
ЗаписьЖурналаРегистрации("Проведение документа", УровеньЖурналаРегистрации.Ошибка,,,
ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Процедура ОбработкаОтменыПроведения(Отказ)
Если ЗначениеЗаполнено(ЭтотОбъект.СсылкаНаТиповойДокумент) Тогда
ОбъектЭтап = ЭтотОбъект.СсылкаНаТиповойДокумент.ПолучитьОбъект();
Если ОбъектЭтап <> Неопределено И ОбъектЭтап.Проведен Тогда
Попытка
ОбъектЭтап.Записать(РежимЗаписиДокумента.ОтменаПроведения);
Исключение
Отказ = Истина;
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Такой подход полностью делегирует формирование проводок, ключей аналитик и регистрацию заданий типовым механизмам платформы, сохраняя 100% совместимость со всеми алгоритмами закрытия месяца.
Если проектные ограничения строго требуют наличия движений непосредственно в самописном документе, необходимо вручную зарегистрировать его в подсистеме закрытия месяца. Разберем необходимые шаги:
ОбработкаПроведения и ОбработкаОтменыПроведения добавьте явную регистрацию задания на расчет себестоимости через регистр сведений Задания к расчету себестоимости.Проанализируем пример явной регистрации задания к расчету при проведении или отмене проведения документа:
Процедура ЗарегистрироватьЗаданиеНаРасчетСебестоимости()
НаборЗаписей = РегистрыСведений.ЗаданияКРасчетуСебестоимости.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Организация.Установить(ЭтотОбъект.Организация);
НаборЗаписей.Отбор.Период.Установить(НачалоМесяца(ЭтотОбъект.Дата));
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Организация = ЭтотОбъект.Организация;
НоваяЗапись.Период = НачалоМесяца(ЭтотОбъект.Дата);
НоваяЗапись.Документ = ЭтотОбъект.Ссылка;
Попытка
НаборЗаписей.Записать(Ложь);
Исключение
// Обработка исключительной ситуации
КонецПопытки;
КонецПроцедуры
Важное замечание: Прямая запись в регистры заданий решает только визуальную проблему сброса статуса в обработке закрытия месяца. Если структура движений по регистрам затрат и партий сформирована с нарушениями, сам расчет себестоимости завершится с ошибкой или сформирует некорректные калькуляции.