В практике разработчика 1С часто встречается парадоксальная ситуация: файл обмена, сформированный при синхронизации данных (например, из «Бухгалтерии предприятия 3.0»), успешно загружается в приемник (например, «Управление торговлей 10.3») через стандартную кнопку «Синхронизировать», но при попытке загрузить этот же самый файл через «Универсальный обмен данными в формате XML» возникают ошибки алгоритмов или дублирование данных. Давайте подробно разберем, почему это происходит, и проанализируем внутренние механизмы платформы, которые определяют такое поведение.
Первое, на что мы должны обратить внимание — это формат самого XML-файла. В экосистеме 1С существуют два принципиально разных подхода к обмену:
V8Exch82.epf. Он жестко привязан к структуре метаданных конкретных конфигураций.Проанализируем ситуацию: когда вы нажимаете «Синхронизировать» в БП 3.0, система формирует файл в формате EnterpriseData. Типовая универсальная обработка XML настроена на поиск узлов и тегов, специфичных для версии 2.0 (например, <ПравилаОбмена>, <Объект>). Если она встречает структуру XDTO, она либо не видит данных вовсе, либо пытается интерпретировать их некорректно, что и приводит к ошибкам алгоритмов.
Выясним причину ошибок в обработчиках. При запуске через План обмена, система инициализирует специфический контекст. В него входят параметры обмена, такие как «Организация по умолчанию», «Склад», или «Дата начала выгрузки». Эти параметры передаются в глобальную структуру и доступны во всех обработчиках событий (например, «Перед загрузкой»).
В универсальной обработке эти параметры по умолчанию не заполнены. Рассмотрим пример кода, который может вызвать ошибку в универсальной загрузке, но отлично сработать в плане обмена:
// Ошибка возникнет, если Параметры.ОрганизацияПоУмолчанию не определена
Если Не ЗначениеЗаполнено(Параметры.ОрганизацияПоУмолчанию) Тогда
ВызватьИсключение "Не задана организация для подстановки в документы!";
КонецЕсли;
В режиме синхронизации план обмена автоматически подставляет значения из своих настроек, в то время как универсальная загрузка «не знает» о существовании этих настроек, если вы не загрузили их вручную в виде отдельного файла параметров.
Посмотрим, как происходит поиск объектов. Планы обмена активно используют специализированный регистр сведений — «Соответствия объектов информационных баз». Когда загрузка идет через механизм синхронизации, система сначала выполняет поиск в этом регистре по паре «УникальныйИдентификатор (GUID) — ПланОбмена».
Универсальная обработка работает иначе:
Если в базе-приемнике объект уже существует, но его GUID отличается от того, что в файле, и при этом в регистре соответствий связь уже установлена, то план обмена найдет объект успешно. Универсальная же обработка либо создаст дубль, либо выдаст ошибку поиска, так как она игнорирует регистр соответствий планов обмена.
Важным отличием является режим записи объектов в базу данных. В планах обмена практически всегда устанавливается программный флаг ОбменДанными.Загрузка = Истина. Рассмотрим, на что это влияет:
// В модуле объекта (например, документа)
Процедура ПередЗаписью(Отказ)
Если ОбменДанными.Загрузка Тогда
Возврат; // Пропускаем типовые проверки при загрузке
КонецЕсли;
// Прикладная проверка, которая может выдать ошибку
Если СуммаДокумента < 0 Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
В универсальной обработке есть галочка «Использовать режим записи - загрузка». Если пользователь забыл её установить, то при загрузке начнут срабатывать все подписки на события и встроенные проверки модулей объектов (проверка остатков, контроль заполнения реквизитов). Это часто становится причиной того, что через план обмена (где проверки отключены) данные «залетают», а через обработку — «отваливаются» с ошибками валидации.
Современные файлы обмена EnterpriseData используют пространства имен XML для типизации данных. План обмена в БСП умеет работать с XDTOДесериализатором, который корректно разбирает эти пространства. Старая универсальная обработка часто не обучена работе с Namespace, если они не были явно описаны в схеме правил конвертации 2.0. Это приводит к тому, что парсер XML видит теги, но не может сопоставить их с объектами метаданных, считая файл «пустым» или «битым».
Если перед вами стоит задача изменить правила обмена и вы столкнулись с подобным поведением, проанализируем следующие шаги:
ОбменДанными.Загрузка = Истина в обработке, если хотите добиться идентичного с планом обмена поведения.ПослеЗагрузки, ПриЗагрузке) происходит сбой.Таким образом, основная разница заключается не в самом файле, а в алгоритмах его обработки и окружении. План обмена — это комплексный механизм с памятью (регистры соответствий) и настройками (параметры), а универсальная обработка — это «чистый лист», который требует ручной настройки всех тех условий, которые план обмена выполняет автоматически.