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