При разработке механизмов обмена данными, особенно в крупных системах на базе 1С:ERP, Комплексной автоматизации или Управления торговлей, программисты часто сталкиваются с ситуацией: флаг ОбменДанными.Загрузка = Истина установлен, но система все равно выполняет какие-то действия, характерные для проведения документа. В этой статье мы подробно разберем, как работает платформа «1С:Предприятие 8» в режиме загрузки, почему «нетиповой» код может игнорировать этот флаг и как правильно организовать перенос проведенных документов без запуска лишней бизнес-логики.
Прежде всего, нам необходимо понять фундаментальное ограничение платформы. Рассмотрим технический нюанс: если свойству ОбменДанными.Загрузка присвоено значение Истина, попытка вызвать метод Записать(РежимЗаписиДокумента.Проведение) приведет к возникновению критической ошибки времени выполнения. Платформа физически запрещает штатное проведение в этом режиме.
Следовательно, когда мы видим в типовой ERP загруженный проведенный документ, это не результат работы процедуры ОбработкаПроведения. Механизм работает следующим образом:
Проведен = Истина.РежимЗаписиДокумента.Запись (не проведение!).ОбменДанными.Загрузка = Истина.Таким образом, платформа просто «складывает» данные в базу, минуя алгоритмы проведения. Если же в вашем случае «запускается проведение», значит, проблема кроется в обработчиках событий, которые не учитывают режим обмена.
Проанализируем самую частую причину лишней активности системы — Подписки на события. В отличие от кода внутри модуля объекта, который разработчик обычно контролирует, подписки выполняются платформой безусловно для всех объектов, входящих в состав подписки.
Если в вашей конфигурации создана подписка на событие ПередЗаписью или ПриЗаписи для документа, и в обработчике этой подписки нет явной проверки режима загрузки, то код будет выполняться всегда. Проверим код в общем модуле, который обслуживает подписку. Правильный шаблон должен выглядеть так:
Процедура ОбработкаСобытияПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
// Это первая и самая важная проверка
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Далее идет остальная бизнес-логика
// ...
КонецПроцедуры
Если этой проверки нет, то при записи документа (даже в режиме просто записи) могут запускаться механизмы проверки остатков, пересчета итогов или записи в дополнительные регистры, что внешне очень похоже на «проведение».
В современных конфигурациях (ERP 2.5, КА 2.5) активно используется Библиотека стандартных подсистем (БСП). Иногда стандартного флага Загрузка бывает недостаточно, так как механизмы БСП могут использовать свои флаги в коллекции ДополнительныеСвойства.
Разберем пример. Существуют такие свойства, как БизнесЛогикаОтключена или ДвиженияИзменены. Если вы создаете нетиповой документ, он может не входить в определяемые типы БСП, из-за чего стандартные подписки БСП могут работать некорректно или требовать ручной инициализации этих свойств.
Посмотрим, как можно программно отключить лишние проверки при записи объекта в коде обмена:
ОбъектДокумент = СсылкаНаДокумент.ПолучитьОбъект();
ОбъектДокумент.ОбменДанными.Загрузка = Истина;
// Дополнительная мера для конфигураций на БСП
Если ОбъектДокумент.ДополнительныеСвойства.Свойство("БизнесЛогикаОтключена") Тогда
ОбъектДокумент.ДополнительныеСвойства.БизнесЛогикаОтключена = Истина;
КонецЕсли;
ОбъектДокумент.Проведен = Истина;
ОбъектДокумент.Записать(РежимЗаписиДокумента.Запись);
Если вы используете Конвертацию Данных (КД 2.0 или 3.0), выясним причину «мнимого» запуска проведения там. В правилах конвертации часто используются обработчики «После загрузки» или настройки в ПВД (Правилах выгрузки данных).
В КД 2.0 существует настройка «Проводить документы после загрузки». Если она включена, то после того, как объект был полностью записан в режиме Загрузка = Истина, система снимает этот флаг и выполняет полноценный вызов Записать(РежимЗаписиДокумента.Проведение). Это происходит уже после завершения основной транзакции загрузки объекта. Проверьте настройки ваших правил обмена — возможно, проведение инициируется именно там.
Рассмотрим ситуацию, когда разработчик устанавливает флаг Загрузка, но внутри кода происходит перечитывание объекта. Выясним, почему это опасно:
Если внутри какой-либо процедуры выполняется код типа Ссылка.ПолучитьОбъект(), создается новый экземпляр объекта в памяти. У этого нового экземпляра свойство ОбменДанными.Загрузка по умолчанию всегда будет равно Ложь. Если затем этот новый экземпляр будет записан, сработает вся бизнес-логика и все проверки.
Важное правило: флаг ОбменДанными.Загрузка действует только на тот конкретный экземпляр объекта (переменную), у которого он был установлен. Он не сохраняется в базе данных и не распространяется «автоматически» на все обращения к этому документу в рамках транзакции.
Подведем итог нашему анализу. Если вы столкнулись с тем, что документ «проводится» при загрузке, пройдите по следующим шагам:
РежимЗаписиДокумента.Запись, а не Проведение.ПередЗаписью и ПриЗаписи, где участвует ваш документ. Проверьте наличие строки Если ОбменДанными.Загрузка Тогда Возврат; КонецЕсли;.ПередЗаписью и ПриЗаписи в самом модуле документа. Там также должна быть проверка флага загрузки в первой строке.Загрузка = Истина платформа не очищает движения автоматически. Вам нужно либо загружать их из источника, либо очищать вручную, если это необходимо.Соблюдение этих правил позволит вам добиться идентичного поведения ваших кастомных документов с типовыми объектами 1С:ERP и обеспечит высокую скорость и надежность обмена данными.