При разработке и доработке механизмов проведения в современных конфигурациях на базе 1С:ERP, Комплексная автоматизация 2 или Управление торговлей 11.5, программисты часто сталкиваются с многоуровневой системой общих модулей. Одной из ключевых точек расширения является процесс регистрации движений. Разберем подробно, как работает логика подготовки наборов записей и почему программно добавленные регистры могут «теряться» при проведении.
Рассмотрим типовой фрагмент кода, который встречается в общем модуле ПроведениеДокументов. Здесь происходит фильтрация списка регистров, которые были переданы в процедуру подготовки наборов записей:
Движения = Документ.Метаданные().Движения;
Для каждого Регистр Из Регистры Цикл
Если Движения.Содержит(Регистр) Тогда
РегистрыКОбработке.Добавить(Регистр);
НаборыЗаписейКОбработке.Добавить(Документ.Движения[Регистр.Имя]);
КонецЕсли;
КонецЦикла;
Проанализируем ситуацию: что именно проверяет метод Содержит()? В данном контексте переменная Движения (полученная из метаданных документа) представляет собой коллекцию метаданных тех регистров, для которых данный документ может выступать регистратором.
Важный момент: Если вы добавили новый регистр в расширении и программно передаете его в массив Регистры, условие Движения.Содержит(Регистр) вернет Ложь в следующих случаях:
Регистры передается строка (имя регистра), а не объект метаданных. Метод Содержит() ожидает именно объект типа ОбъектМетаданных.В современных редакциях УТ проведение разделено на так называемые «учетные механизмы». Для добавления своего регистра в процесс проведения недостаточно просто вызвать метод записи. Необходимо встроиться в функцию ПараметрыДляПроведенияДокумента соответствующего модуля (например, через расширение модуля менеджера или специализированного серверного модуля учета).
Посмотрим на пример правильного дополнения параметров проведения через расширение функции ПараметрыДляПроведенияДокумента:
&Вместо("ПараметрыДляПроведенияДокумента")
Функция УТ_ПараметрыДляПроведенияДокумента(Документ, Свойства)
// Получаем стандартную структуру параметров учетного механизма
Параметры = ПроведениеДокументов.ПараметрыУчетногоМеханизма();
Если Свойства.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
// Добавляем регистр в массив подчиненных регистров
// ВНИМАНИЕ: используем объект метаданных, а не строку!
Параметры.ПодчиненныеРегистры.Добавить(Метаданные.РегистрыНакопления.УдалитьТМЦВЭксплуатации);
КонецЕсли;
Возврат Параметры;
КонецФункции
Этот код сообщает системе проведения, что данный учетный механизм (например, учет ТМЦ) теперь отвечает еще и за регистр УдалитьТМЦВЭксплуатации. Однако это только первый шаг.
Часто программисты обнаруживают, что даже после успешного прохождения условия Содержит(), их регистр не попадает в итоговый список для записи. Это происходит в функции ПолучитьИспользуемыеРегистры. Разберем, зачем она нужна и как работает.
Проанализируем алгоритм: система формирует динамический запрос к таблицам регистров. Цель запроса — выяснить, есть ли в базе данных уже существующие записи этого документа по данным регистрам.
ШаблонЗапроса =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ""&ИмяРегистра"" КАК ИмяРегистра
|ИЗ
| &Таблица
|ГДЕ
| Регистратор = &Регистратор";
Выясним причину, по которой регистра может не быть в результате:
Функция ПолучитьИспользуемыеРегистры служит для оптимизации. Она определяет, какие наборы записей нужно пометить флагом Записывать = Истина для очистки. Если вы проводите документ впервые или в прошлой транзакции документ не делал движений по этому конкретному регистру, запрос вернет пустой результат.
Это не ошибка! Это означает лишь то, что системе не нужно ничего «затирать» в базе перед записью новых движений. Новые движения будут записаны позже, когда алгоритм отражения (процедуры Отразить... в модулях менеджеров) сформирует таблицу движений и установит флаг Движения.ИмяРегистра.Записывать = Истина.
Рассмотрим ситуацию, когда в коде фигурирует объект с именем типа РегистрНакопления.УдалитьТМЦВЭксплуатации. В конфигурациях 1С (УТ 11, ERP 2) такой префикс означает, что объект выведен из эксплуатации вендором.
Проанализируем риски:
ОтразитьДвиженияПодчиненныхРегистров могут игнорировать его, так как ожидают данные в новых, актуальных регистрах.ФактическиеДанныеБюджетирования или новые специализированные регистры).Если вы столкнулись с тем, что движения по вашему регистру не появляются, рекомендуем выполнить следующие действия:
ПодготовитьНаборыЗаписейКРегистрацииДвижений передаются именно объекты метаданных (Метаданные.РегистрыНакопления.Имя), а не строки.Подготовить... только подготавливает структуру. Сама запись инициируется установкой свойства Движения.ВашРегистр.Записывать = Истина в модуле, который формирует данные (отражение движений).Таким образом, механизм проведения в УТ 11.5 является строго структурированным. Понимание роли каждого этапа — от формирования параметров до физической записи наборов — позволяет корректно вносить изменения, не нарушая целостность учетной системы.