Как работает механизм регистрации движений в УТ 11.5 и что проверяет условие Содержит(Регистр)

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

При разработке и доработке механизмов проведения в современных конфигурациях на базе 1С:ERP, Комплексная автоматизация 2 или Управление торговлей 11.5, программисты часто сталкиваются с многоуровневой системой общих модулей. Одной из ключевых точек расширения является процесс регистрации движений. Разберем подробно, как работает логика подготовки наборов записей и почему программно добавленные регистры могут «теряться» при проведении.

Разбор условия Движения.Содержит(Регистр)

Рассмотрим типовой фрагмент кода, который встречается в общем модуле ПроведениеДокументов. Здесь происходит фильтрация списка регистров, которые были переданы в процедуру подготовки наборов записей:


Движения = Документ.Метаданные().Движения;
Для каждого Регистр Из Регистры Цикл
    Если Движения.Содержит(Регистр) Тогда
        РегистрыКОбработке.Добавить(Регистр);
        НаборыЗаписейКОбработке.Добавить(Документ.Движения[Регистр.Имя]);
    КонецЕсли;
КонецЦикла;

Проанализируем ситуацию: что именно проверяет метод Содержит()? В данном контексте переменная Движения (полученная из метаданных документа) представляет собой коллекцию метаданных тех регистров, для которых данный документ может выступать регистратором.

Важный момент: Если вы добавили новый регистр в расширении и программно передаете его в массив Регистры, условие Движения.Содержит(Регистр) вернет Ложь в следующих случаях:

  1. Регистр не включен в состав движений документа в самом расширении. Даже если в основной конфигурации документ является регистратором, в расширении это свойство должно быть явно подтверждено (галочка в списке «Движения» объекта метаданных внутри расширения).
  2. В массив Регистры передается строка (имя регистра), а не объект метаданных. Метод Содержит() ожидает именно объект типа ОбъектМетаданных.

Механизм «Учетных механизмов» в УТ 11.5

В современных редакциях УТ проведение разделено на так называемые «учетные механизмы». Для добавления своего регистра в процесс проведения недостаточно просто вызвать метод записи. Необходимо встроиться в функцию ПараметрыДляПроведенияДокумента соответствующего модуля (например, через расширение модуля менеджера или специализированного серверного модуля учета).

Посмотрим на пример правильного дополнения параметров проведения через расширение функции ПараметрыДляПроведенияДокумента:


&Вместо("ПараметрыДляПроведенияДокумента")
Функция УТ_ПараметрыДляПроведенияДокумента(Документ, Свойства)
    // Получаем стандартную структуру параметров учетного механизма
    Параметры = ПроведениеДокументов.ПараметрыУчетногоМеханизма();
    
    Если Свойства.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда 
        // Добавляем регистр в массив подчиненных регистров
        // ВНИМАНИЕ: используем объект метаданных, а не строку!
        Параметры.ПодчиненныеРегистры.Добавить(Метаданные.РегистрыНакопления.УдалитьТМЦВЭксплуатации);
    КонецЕсли;
    
    Возврат Параметры;
КонецФункции

Этот код сообщает системе проведения, что данный учетный механизм (например, учет ТМЦ) теперь отвечает еще и за регистр УдалитьТМЦВЭксплуатации. Однако это только первый шаг.

Логика функции ПолучитьИспользуемыеРегистры

Часто программисты обнаруживают, что даже после успешного прохождения условия Содержит(), их регистр не попадает в итоговый список для записи. Это происходит в функции ПолучитьИспользуемыеРегистры. Разберем, зачем она нужна и как работает.

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


ШаблонЗапроса =
"ВЫБРАТЬ ПЕРВЫЕ 1
|    ""&ИмяРегистра"" КАК ИмяРегистра
|ИЗ
|    &Таблица
|ГДЕ
|    Регистратор = &Регистратор";

Выясним причину, по которой регистра может не быть в результате:

Функция ПолучитьИспользуемыеРегистры служит для оптимизации. Она определяет, какие наборы записей нужно пометить флагом Записывать = Истина для очистки. Если вы проводите документ впервые или в прошлой транзакции документ не делал движений по этому конкретному регистру, запрос вернет пустой результат.

Это не ошибка! Это означает лишь то, что системе не нужно ничего «затирать» в базе перед записью новых движений. Новые движения будут записаны позже, когда алгоритм отражения (процедуры Отразить... в модулях менеджеров) сформирует таблицу движений и установит флаг Движения.ИмяРегистра.Записывать = Истина.

Особенности регистров с префиксом «Удалить»

Рассмотрим ситуацию, когда в коде фигурирует объект с именем типа РегистрНакопления.УдалитьТМЦВЭксплуатации. В конфигурациях 1С (УТ 11, ERP 2) такой префикс означает, что объект выведен из эксплуатации вендором.

Проанализируем риски:

Итоговый чек-лист при доработке проведения

Если вы столкнулись с тем, что движения по вашему регистру не появляются, рекомендуем выполнить следующие действия:

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

Таким образом, механизм проведения в УТ 11.5 является строго структурированным. Понимание роли каждого этапа — от формирования параметров до физической записи наборов — позволяет корректно вносить изменения, не нарушая целостность учетной системы.

← На главную