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