При работе с технологией EnterpriseData (Конвертация данных 3.0) разработчики часто сталкиваются с ситуацией: правила (ПКО и ПОД) созданы, код перенесен в модуль менеджера обмена, документы успешно регистрируются к отправке, и даже в журнале регистрации количество объектов отображается корректно. Однако при анализе файла обмена выясняется, что данных внутри нет. Рассмотрим подробно, почему это происходит и как настроить корректную выгрузку.
В отличие от классической Конвертации данных 2.1, где источник просто выгружает всё, что велят правила, технология EnterpriseData (XDTO) работает более избирательно. Основная причина «пустой» выгрузки заключается в механизме согласования составов данных. Проанализируем, как это устроено внутри системы.
Когда две базы (источник и приемник) синхронизируются, они обмениваются информацией о том, какие именно типы объектов они «умеют» обрабатывать. Эти сведения кэшируются в специальном регистре сведений НастройкиОбменаДаннымиXDTO. Если вы добавили новое правило для документа (например, ПередачаМатериаловВПроизводство) только на стороне источника, но база-приемник об этом «не знает», источник просто проигнорирует эти данные при формировании файла. Система считает бесполезным отправлять данные, которые принимающая сторона не сможет распознать.
Выясним причину, по которой объект может отсутствовать в списке поддерживаемых. Проблема чаще всего кроется в том, что в регистре НастройкиОбменаДаннымиXDTO не заполнен реквизит, отвечающий за поддерживаемые типы объектов со стороны приемника. Чтобы исправить это, выполним следующие шаги:
НастройкиОбменаДаннымиXDTO через «Все функции» или «Функции для технического специалиста».Важный нюанс: правила должны быть симметричными. Даже если вы не планируете ничего загружать в приемник, минимальное ПКО на стороне приема должно существовать, чтобы база-приемник сообщила источнику: «Да, я поддерживаю этот тип данных».
Рассмотрим структуру модуля менеджера обмена. Часто разработчики забывают прописать вызовы новых правил в системных процедурах. Посмотрим, какие места в коде требуют обязательного заполнения.
Во-первых, процедура ВыполнитьПроцедуруМодуляМенеджера. Именно она является диспетчером, который направляет поток данных к вашим ПКО и ПОД. Если вызов не добавлен, система не «увидит» ваш код. Пример правильного добавления вызова:
Процедура ВыполнитьПроцедуруМодуляМенеджера(ИмяПроцедуры, Параметры) Экспорт
Если ИмяПроцедуры = "ПКО_Документ_ПередачаМатериаловВПроизводство_Отправка_ПриОтправкеДанных" Тогда
ПКО_Документ_ПередачаМатериаловВПроизводство_Отправка_ПриОтправкеДанных(Параметры.ДанныеИБ, Параметры.ДанныеXDTO, Параметры.КомпонентыОбмена);
КонецЕсли;
КонецПроцедуры
Во-вторых, обратим внимание на версионность. В некоторых конфигурациях (например, БП 3.0) существует несколько модулей обмена: МенеджерОбменаЧерезУниверсальныйФормат и МенеджерОбменаЧерезУниверсальныйФормат13. Если ваша база использует версию формата 1.3 или выше, редактировать нужно именно модуль с суффиксом 13.
Проанализируем еще одну критическую точку — функцию ПоддерживаемыеОбъектыФормата. Она возвращает массив строковых имен типов объектов, которые поддерживает данный модуль. Если вы описали ПКО и ПОД, но не добавили тип документа в этот массив, механизм обмена проигнорирует ваши правила.
Функция ПоддерживаемыеОбъектыФормата(ВерсияФормата) Экспорт
МассивОбъектов = Новый Массив;
// ... существующие объекты ...
МассивОбъектов.Добавить("Документ.ПередачаМатериаловВПроизводство");
Возврат МассивОбъектов;
КонецФункции
После внесения изменений в эту функцию обязательно нужно обновить кэш метаданных обмена, о чем мы говорили в разделе про регистр настроек.
Если данные все равно не попадают в файл, нам поможет отладка. Однако в КД 3.0 отладка осложнена тем, что обмен часто выполняется в фоновом задании. Разберем по шагам, как попасть в нужную точку кода:
/Debug).ОбменДаннымиXDTOСервер.ВыгрузкаОбъектаВыборки. Это «узкое горлышко», через которое проходят все объекты.ОбменДаннымиXDTOСервер.ВыполнитьВыгрузкуЗарегистрированныхДанных.Проанализируем ситуацию: если выполнение заходит в ВыполнитьВыгрузкуЗарегистрированныхДанных, но не попадает в процедуру _ПриОтправкеДанных вашего ПКО, значит, объект был отфильтрован в процедуре ЗаполнитьСоставОбъектовДляВыгрузки. Это подтверждает теорию о несоответствии настроек в регистре НастройкиОбменаДаннымиXDTO.
Если вы разрабатываете правила обмена внутри расширения конфигурации, убедитесь, что ваши обработчики корректно перехватывают вызовы. Используйте аннотации &Вместо или &После для процедуры ВыполнитьПроцедуруМодуляМенеджера. Если расширение не «подцепилось» к основному механизму, система просто выполнит стандартный код без ваших доработок.
Резюмируем: для успешной выгрузки в Конвертации данных 3.0 недостаточно просто написать код правил. Нужно обеспечить «видимость» этих правил для обеих баз через регистрацию типов объектов в модуле менеджера и актуализацию кэша в регистре НастройкиОбменаДаннымиXDTO. Только после того, как обе базы подтвердят готовность работать с новым типом документа, данные начнут попадать в файл обмена.