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