Почему при установленном флаге ОбменДанными.Загрузка = Истина запускается проведение документа и как это предотвратить

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

При разработке механизмов обмена данными, особенно в крупных системах на базе 1С:ERP, Комплексной автоматизации или Управления торговлей, программисты часто сталкиваются с ситуацией: флаг ОбменДанными.Загрузка = Истина установлен, но система все равно выполняет какие-то действия, характерные для проведения документа. В этой статье мы подробно разберем, как работает платформа «1С:Предприятие 8» в режиме загрузки, почему «нетиповой» код может игнорировать этот флаг и как правильно организовать перенос проведенных документов без запуска лишней бизнес-логики.

Платформенное ограничение режима загрузки

Прежде всего, нам необходимо понять фундаментальное ограничение платформы. Рассмотрим технический нюанс: если свойству ОбменДанными.Загрузка присвоено значение Истина, попытка вызвать метод Записать(РежимЗаписиДокумента.Проведение) приведет к возникновению критической ошибки времени выполнения. Платформа физически запрещает штатное проведение в этом режиме.

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

  1. У объекта устанавливается свойство Проведен = Истина.
  2. Объект записывается в режиме РежимЗаписиДокумента.Запись (не проведение!).
  3. Наборы записей всех регистров (движения) загружаются из источника и записываются отдельно, также с установленным флагом ОбменДанными.Загрузка = Истина.

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

Анализ подписок на события

Проанализируем самую частую причину лишней активности системы — Подписки на события. В отличие от кода внутри модуля объекта, который разработчик обычно контролирует, подписки выполняются платформой безусловно для всех объектов, входящих в состав подписки.

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


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

Если этой проверки нет, то при записи документа (даже в режиме просто записи) могут запускаться механизмы проверки остатков, пересчета итогов или записи в дополнительные регистры, что внешне очень похоже на «проведение».

Роль БСП и ДополнительныеСвойства

В современных конфигурациях (ERP 2.5, КА 2.5) активно используется Библиотека стандартных подсистем (БСП). Иногда стандартного флага Загрузка бывает недостаточно, так как механизмы БСП могут использовать свои флаги в коллекции ДополнительныеСвойства.

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

Посмотрим, как можно программно отключить лишние проверки при записи объекта в коде обмена:


ОбъектДокумент = СсылкаНаДокумент.ПолучитьОбъект();
ОбъектДокумент.ОбменДанными.Загрузка = Истина;

// Дополнительная мера для конфигураций на БСП
Если ОбъектДокумент.ДополнительныеСвойства.Свойство("БизнесЛогикаОтключена") Тогда
    ОбъектДокумент.ДополнительныеСвойства.БизнесЛогикаОтключена = Истина;
КонецЕсли;

ОбъектДокумент.Проведен = Истина;
ОбъектДокумент.Записать(РежимЗаписиДокумента.Запись);

Особенности работы с Конвертацией Данных

Если вы используете Конвертацию Данных (КД 2.0 или 3.0), выясним причину «мнимого» запуска проведения там. В правилах конвертации часто используются обработчики «После загрузки» или настройки в ПВД (Правилах выгрузки данных).

В КД 2.0 существует настройка «Проводить документы после загрузки». Если она включена, то после того, как объект был полностью записан в режиме Загрузка = Истина, система снимает этот флаг и выполняет полноценный вызов Записать(РежимЗаписиДокумента.Проведение). Это происходит уже после завершения основной транзакции загрузки объекта. Проверьте настройки ваших правил обмена — возможно, проведение инициируется именно там.

Типичные ошибки при программной записи

Рассмотрим ситуацию, когда разработчик устанавливает флаг Загрузка, но внутри кода происходит перечитывание объекта. Выясним, почему это опасно:

Если внутри какой-либо процедуры выполняется код типа Ссылка.ПолучитьОбъект(), создается новый экземпляр объекта в памяти. У этого нового экземпляра свойство ОбменДанными.Загрузка по умолчанию всегда будет равно Ложь. Если затем этот новый экземпляр будет записан, сработает вся бизнес-логика и все проверки.

Важное правило: флаг ОбменДанными.Загрузка действует только на тот конкретный экземпляр объекта (переменную), у которого он был установлен. Он не сохраняется в базе данных и не распространяется «автоматически» на все обращения к этому документу в рамках транзакции.

Итоги и рекомендации

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

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

Соблюдение этих правил позволит вам добиться идентичного поведения ваших кастомных документов с типовыми объектами 1С:ERP и обеспечит высокую скорость и надежность обмена данными.

← На главную