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