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

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

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

Почему в модуле набора записей нет режима проведения?

Разберем архитектуру взаимодействия объектов платформы. Набор записей регистра — это самостоятельный объект для работы с таблицами базы данных. События модуля набора записей (такие как ПередЗаписью и ПриЗаписи) вызываются при любых операциях с данными:

  1. При проведении документа (как оперативном, так и неоперативном).
  2. При отмене проведения документа.
  3. При ручной записи набора записей из внешних обработок, регламентных заданий или кода других модулей.
  4. При переносе данных и загрузке информации через механизмы обмена (планы обмена, интеграции).

Сам параметр РежимПроведения (принимающий значения системного перечисления РежимПроведенияДокумента.Оперативный и РежимПроведенияДокумента.Неоперативный) существует исключительно в контексте проведения самого документа — в процедуре ОбработкаПроведения модуля документа или в соответствующих подписках на события. На уровне платформы данный параметр не транслируется в наборы движений автоматически.

Кроме того, коллекция ДополнительныеСвойства объекта документа и коллекция ДополнительныеСвойства каждого его набора записей из коллекции Движения — это абсолютно разные, независимые структуры в оперативной памяти.

Способ 1. Явная передача режима через ДополнительныеСвойства набора

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

Посмотрим на пример кода в модуле документа:


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    
    // Формируем движения по регистру
    Движение = Движения.ТоварыНаСкладах.ДобавитьРасход();
    Движение.Период = Дата;
    Движение.Номенклатура = СсылкаНаНоменклатуру;
    Движение.Количество = 10;
    
    // Явно передаем режим проведения в коллекцию свойств набора записей
    Движения.ТоварыНаСкладах.ДополнительныеСвойства.Вставить("РежимПроведения", РежимПроведения);
    
КонецПроцедуры

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


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

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

Если в конфигурации множество документов-регистраторов и ручное дублирование кода передачи свойства нерационально, применим централизованный подход с использованием подписок на события. Разберем реализацию по шагам:

  1. Создаем в конфигурации подписку на событие ОбработкаПроведения.
  2. В качестве источника указываем тип ДокументОбъект (или выбираем нужные типы документов).
  3. В обработчике подписки в общем модуле выполняем обход всех сформированных движений документа и заполняем их свойства:

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

Архитектурная рекомендация: перенос бизнес-проверок в документ

Проанализируем стандарты разработки 1С. Размещение проверок проведения (например, контроля остатков, лимитов, взаиморасчетов) внутри модуля набора записей считается нежелательной практикой по следующим причинам:

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

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

← На главную