При настройке обмена данными через Конвертацию данных 3.0 (КД 3.0) по технологии Enterprise Data разработчики часто сталкиваются с ситуацией, когда в базе-источнике существует несколько видов документов, выполняющих схожие функции, а в базе-приемнике им соответствует всего один объект метаданных. Классический пример — выгрузка ведомостей на выплату зарплаты из ЗУП 3.1 (где их 6 видов) в документ ЗарплатаКВыплатеОрганизаций в УПП 1.3 или ERP.
Рассмотрим, как правильно спроектировать правила конвертации, чтобы не дублировать логику и сделать архитектуру обмена максимально гибкой и поддерживаемой. Разберем ситуацию на примере работы с ПОД (Правилами обработки данных) и ПКО (Правилами конвертации объектов).
Для начала проанализируем основное отличие КД 3.0 от КД 2.1. В новой версии обмен происходит не напрямую между объектами, а через промежуточный формат XDTO. Это означает, что:
Document.PayrollSheet).Таким образом, основная сложность заключается в настройке правил на стороне источника, так как КД 3.0 требует жесткой привязки ПОД и ПКО к конкретному типу метаданных.
Выясним причину, почему нельзя обойтись одним ПКО: в интерфейсе КД 3.0 при создании ПКО вы обязаны указать конкретный объект метаданных. Следовательно, для 6 ведомостей из ЗУП нам в любом случае придется создать 6 ПКО и 6 ПОД на отправку.
Однако, чтобы не дублировать код заполнения данных, мы применим следующий алгоритм:
ПКО в обработчике ПриОтправкеДанных будем вызывать эту общую процедуру.Рассмотрим пример кода в общем модуле:
Процедура ЗаполнитьДанныеВедомостиДляВыгрузки(ДанныеXDTO, Объект) Экспорт
// Заполняем общие реквизиты, которые есть во всех ведомостях
ДанныеXDTO.Номер = Объект.Номер;
ДанныеXDTO.Дата = Объект.Дата;
ДанныеXDTO.Организация = Объект.Организация;
ДанныеXDTO.СуммаПоДокументу = Объект.Зарплата.Итог("КВыплате");
// При необходимости добавляем логику ветвления
Если ТипЗнч(Объект) = Тип("ДокументСсылка.ВедомостьНаВыплатуЗарплатыВБанк") Тогда
ДанныеXDTO.СпособВыплаты = "ЧерезБанк";
КонецЕсли;
КонецПроцедуры
В самой Конвертации данных в каждом ПКО код будет выглядеть лаконично:
// В обработчике ПКО "При отправке данных"
МойОбщийМодуль.ЗаполнитьДанныеВедомостиДляВыгрузки(ДанныеXDTO, ДанныеИБ);
Для каждого документа создается свое ПОД. В настройках ПОД указывается соответствующее ПКО. Поскольку все эти ПКО выгружают данные в один и тот же тип XDTO, на уровне формата они станут неразличимы (если вы не добавите специальный маркер типа), что нам и требуется для базы-приемника.
На стороне приемника ситуация значительно проще. Нам нужно всего одно ПОД и одно ПКО на загрузку. Проанализируем ситуацию: поскольку из ЗУП приходят объекты одного XDTO-типа, база-приемник обрабатывает их по единому правилу, создавая документ ЗарплатаКВыплатеОрганизаций.
Важный момент: Если вам важно в УПП знать, какой именно вид ведомости был в ЗУП, рекомендуется добавить в XDTO-пакет дополнительное свойство (например, ТипВедомостиИсточник) и заполнять его в ПКО источника. Это позволит в приемнике использовать условия при заполнении реквизитов.
Разберем важный технический нюанс, упомянутый опытными специалистами. Теоретически разные виды документов в ЗУП могут иметь одинаковые УникальныйИдентификатор (GUID), если они были созданы специфическим образом или перенесены из других систем. Если в УПП поиск идет только по GUID, один документ может "затереть" другой.
Для решения этой проблемы настроим Поля поиска в ПКО приемника. Вместо стандартного поиска по ссылке, можно использовать комбинацию:
Или использовать Ключи синхронизации, добавив в них информацию о типе исходного объекта.
Если вы хотите еще больше сократить количество ручных настроек в интерфейсе КД, можно воспользоваться обработчиком ПередОбработкой в ПОД. В некоторых случаях это позволяет программно переопределять ИмяПКО, однако стандартным и более прозрачным способом для КД 3.0 остается использование схемы "6 ПКО источника -> 1 тип XDTO -> 1 ПКО приемника".
Посмотрим на структуру ПКО на стороне приемника (УПП):
ПКО, где объект формата — Document.PayrollSheet, а объект метаданных — Документ.ЗарплатаКВыплатеОрганизаций.ПослеЗагрузкиДанных прописываем специфичную логику для УПП (например, установку учетной политики или заполнение счетов учета).Подводя итог, можно сказать, что попытка запихнуть 6 разных метаданных в одно ПКО на стороне источника противоречит архитектуре КД 3.0. Правильная стратегия — это типизация через формат:
1. На стороне ЗУП: 6 ПОД и 6 ПКО. Весь программный код вынесен в один общий модуль для исключения дублирования. Все 6 ПКО указывают на один тип объекта в XDTO-пакете.
2. На стороне приемника: 1 ПОД и 1 ПКО, работающие с этим универсальным типом формата.
3. Безопасность: Настройка полей поиска для предотвращения коллизий GUID между разными видами ведомостей.
Такой подход обеспечивает минимальное количество кода внутри самой базы Конвертации данных и делает правила легко читаемыми для других разработчиков.