В процессе сопровождения и адаптации 1С:ERP под нетиповые бизнес-процессы предприятий программисты часто сталкиваются с необходимостью тонкой настройки проводок и движений по регистрам накопления. Типичный сценарий: требуется исключить определенные операции реализации из книги продаж для конкретных контрагентов, сохранив при этом стандартное проведение документа для остальных участников цепочки.
Однако в 1С:ERP классический подход с вмешательством в процедуру ОбработкаПроведения документа через расширение часто дает сбой. После проведения документа все выглядит корректно, но при запуске регламентных процедур закрытия месяца или фоновой актуализации расчетов изменения бесследно исчезают, а движения регистров возвращаются к исходному состоянию. Проанализируем, почему это происходит, как правильно перехватить запись движений и какие альтернативные архитектурные пути решения существуют.
Для того чтобы понять суть проблемы, нам необходимо рассмотреть логику работы механизма проведения документов в 1С:ERP. В отличие от более старых конфигураций (например, 1С:УПП), в ERP-системах разделены оперативное проведение и сложные расчетные механизмы (распределение авансов, расчет себестоимости, курсовые разницы, расчеты по НДС).
Регламентная операция «Актуализация движений документов по данным взаиморасчетов» запускается автоматически в фоновом режиме или в рамках процедуры закрытия месяца. Ее ключевые задачи:
Во время работы этого механизма система выполняет так называемое отложенное проведение. Программа инициализирует перезапись наборов записей зависимых регистров (включая регистр НДС Записи книги продаж) напрямую через объектные модули наборов записей или специализированные фоновые процедуры. При этом стандартный обработчик ОбработкаПроведения самого документа реализации либо вообще не вызывается, либо результаты его работы полностью затираются платформой в момент записи нового рассчитанного набора движений. Именно поэтому любые изменения, внесенные «поверх» проведения в модуле документа, оказываются недолговечными.
Самым надежным способом программной корректировки, гарантирующим защиту от перезаписи любыми регламентными заданиями, является использование обработчика события ПередЗаписью в модуле набора записей самого регистра накопления. Любое проведение документа, распределение расчетов или закрытие месяца неизбежно завершается физической записью набора в базу данных, которая всегда проходит через этот обработчик.
Рассмотрим по шагам, как реализовать этот механизм с помощью расширения конфигурации:
НДСЗаписиКнигиПродаж.ПередЗаписью с использованием аннотации &Перед или &Вместо.Рассмотрим пример кода, который анализирует регистратор (документ реализации), проверяет контрагента и при необходимости очищает набор записей перед его физическим сохранением в базу данных:
&Вместо("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, Замещение)
// Проверяем, что запись производится для нужного типа документа
Если ЭтотОбъект.Отбор.Регистратор.Использование
И ТипЗнч(ЭтотОбъект.Отбор.Регистратор.Значение) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
СсылкаРегистратор = ЭтотОбъект.Отбор.Регистратор.Value;
// Проверяем соответствие контрагента условиям исключения
Если ЗначениеЗаполнено(СсылкаРегистратор.Контрагент)
И СсылкаРегистратор.Контрагент.ДополнительныйРеквизитИсключитьИзКнигиПродаж = Истина Тогда
// Полностью очищаем коллекцию движений перед записью
ЭтотОбъект.Очистить();
КонецЕсли;
КонецЕсли;
// Вызываем стандартный обработчик системы
ПродолжитьВызов(Отказ, Замещение);
КонецПроцедуры
Использование конструкции ЭтотОбъект.Очистить() гарантирует, что даже если регламентное задание актуализации взаиморасчетов попытается сформировать стандартные строки для книги продаж, на этапе записи в СУБД этот набор уйдет пустым. Данный подход является наиболее стабильным при необходимости жесткого программного вмешательства.
Иногда специалисты пытаются решить проблему «в лоб»: включают в документе флаг «Ручная корректировка проводок» и вручную перенаправляют суммы со счетов учета НДС (19, 68) на транзитные или прочие счета (например, 76.29). В случае с валютным учетом это сопряжено с критическими рисками для всей учетной модели ERP.
Проанализируем ключевые опасности ручной корректировки:
РасчетыСКлиентами, СуммыДокументовВВалютахУчета, НДС Предъявленный). Если вы вручную меняете счета учета в проводках, но оставляете без изменений оперативные регистры, система получает критическое расхождение.Прежде чем приступать к доработке конфигурации через расширения, настоятельно рекомендуется рассмотреть стандартные инструменты 1С:ERP, разработанные специально для корректировки сложных ситуаций с НДС.
Вместо физического удаления записей из документа реализации, мы можем использовать штатный механизм сторнирования через специализированные документы:
Этот способ позволяет сохранить «аудиторский след»: в системе останутся и исходная реализация, и официальный документ корректировки, уменьшающий обязательства по НДС. При этом регламентные операции закрытия месяца пройдут штатно и без ошибок.
Если требуется полностью «вычистить» движения без отражения промежуточных документов сторно, воспользуемся универсальным инструментом администратора:
НДС Записи книги продаж и регистр бухгалтерии ЖурналПроводокРегламентированный.Этот метод чище, чем ручная корректировка внутри самой реализации, так как движения регистров и проводки корректируются синхронно в рамках одного специализированного документа, а исходная реализация остается «нетронутой» для алгоритмов закрытия месяца.
Если задача состоит в том, чтобы расчеты с контрагентом изначально велись на субсчетах 76 группы вместо 62, лучшим решением будет правильная настройка нормативно-справочной информации:
Таким образом, мы детально разобрали механизм фонового обновления движений в 1С:ERP и нашли наиболее надежную точку соприкосновения для программного кода в модуле набора записей регистра. Применение этих знаний позволит вам избежать досадных ошибок перезаписи данных при закрытии отчетных периодов.