Как отследить формирование движений в регистр накопления и добавить новое измерение в 1С

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

При доработке отраслевых и нетиповых конфигураций 1С разработчики часто сталкиваются с ситуацией, когда процедура ОбработкаПроведения в модуле объекта документа не содержит прямого заполнения коллекций движений. Вместо этого логика проведения распределена по множеству общих модулей, служебных процедур и менеджеров. Выясним причину такого поведения архитектуры, разберем способы точного поиска места формирования записей и рассмотрим правильные варианты добавления дополнительной аналитики в регистр накопления.

Способ 1. Отслеживание записи через модуль набора записей регистра

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

Разберем по шагам, как локализовать место записи с помощью модуля набора записей:

  1. Откроем в конфигураторе дерево метаданных и найдем интересующий нас регистр (например, РегистрыНакопления.ДвиженияТМЦ).
  2. Откроем Модуль набора записей регистра.
  3. Создадим или найдем обработчик события ПередЗаписью. Если модуль пустой, добавим стандартный обработчик:
    
    Процедура ПередЗаписью(Отказ, Замещение)
    	
    	// Точка останова для отладки
    	ТестоваяПеременная = 1;
    	
    КонецПроцедуры
    
  4. Установим точку останова (клавиша F9) на строке с исполняемым кодом внутри этой процедуры.
  5. Запустим режим «1С:Предприятие» в режиме отладки и проведем целевой документ (например, «Z-отчет»).
  6. Когда отладчик остановит выполнение программы на точке останова, откроем в верхнем меню Отладка - Стек вызовов (сочетание клавиш Ctrl + Alt + C).
  7. Проанализируем стек вызовов снизу вверх: дважды щелкая по строкам стека, мы сразу перейдем в конкретные общие модули и процедуры, где формируется таблица движений и вызывается метод Записать().

Способ 2. Поиск процедур через замер производительности

Если конфигурация находится на полной поддержке и редактирование модулей регистров нежелательно даже на копии, воспользуемся штатным замером производительности платформы 1С.

Рассмотрим порядок действий:

  1. В конфигураторе перейдем в главное меню: Отладка - Замер производительности (клавиша F4).
  2. В режиме «1С:Предприятие» выполним проведение нужного документа.
  3. Вернемся в конфигуратор и повторно нажмем F4 для завершения замера.
  4. В сформированной таблице результатов применим поиск по имени регистра или по вызовам метода .Записать(). Это позволит моментально определить процедуры общих модулей, затрагивающие запись в регистр.

Почему добавленное измерение не сохраняется в регистре

Нередко после добавления нового измерения (например, Склад) в регистр накопления и явного присвоения значения в модуле проведения поле все равно остается пустым после записи документа. Проанализируем типичные причины:

  1. Использование метода Загрузить(): Во многих сложных конфигурациях движения не формируются построчно через Движения.ИмяРегистра.Добавить(). Результаты запросов выгружаются в промежуточный объект ТаблицаЗначений, после чего загружаются в регистр конструкцией Движения.ИмяРегистра.Загрузить(ТаблицаДвижений). Если поле Склад отсутствует в тексте исходного запроса, платформа очистит его значение при пакетной загрузке.
  2. Многоэтапное проведение: При проведении документа может происходить несколько перезаписей наборов записей. Например, сначала формируются количественные движения, затем в отдельном общем модуле выполняется расчет себестоимости и партий, который повторно перезаписывает набор без учета ранее переданного реквизита.
  3. Расчет прибыли и себестоимости: Документы розничных продаж (такие как «Z-отчет» или «Отчет о розничных продажах») содержат только цену и сумму продажи. Себестоимость и валовая прибыль рассчитываются динамически по алгоритмам партионного учета (ФИФО, средняя) непосредственно во время проведения через запросы к остаткам партий, поэтому получить готовую себестоимость в начале процедуры ОбработкаПроведения невозможно.

Способ 3. Гарантированное заполнение измерения через подписку на события

Чтобы не нарушать типовую логику проведения и избежать конфликтов с перезаписью данных в общих модулях, оптимально применить объект ПодпискаНаСобытие.

Посмотрим на пример заполнения склада в событии ПередЗаписью набора записей регистра:


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

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

← На главную