При переходе с конфигурации «Конвертация данных 2.1» на «Конвертацию данных 3.0» (работающую на базе формата EnterpriseData) разработчики часто сталкиваются с непониманием архитектуры сопоставления объектов. В интерфейсе правил конвертации объектов (ПКО) при настройке направления «Отправка и получение» можно увидеть настройки полей поиска, из-за чего возникает вопрос: какой вариант поиска приоритетнее — заданный при выгрузке из базы-источника или при загрузке в базу-приемник?
Разберем фундаментальное отличие КД 3.0 от КД 2.1. В старой версии правила создавались для конкретной пары баз («Источник — Приемник»), а алгоритмы поиска жестко зашивались в общий файл правил. В «Конвертации данных 3.0» правила разрабатываются для одной конкретной конфигурации относительно универсального формата (XML/JSON):
EnterpriseData. В результирующее сообщение помещаются только реквизиты объекта и его уникальный идентификатор (UUID). Никаких алгоритмов поиска в выгружаемом сообщении нет.Таким образом, настройки поиска, указанные в правилах для сценария выгрузки, при обработке данных в базе-приемнике не используются и игнорируются. Поиск объектов всегда осуществляется исключительно по алгоритмам и правилам, сгенерированным в общем модуле МенеджерОбменаЧерезУниверсальныйФормат принимающей базы.
Рассмотрим, как именно база-получатель выполняет поиск и идентификацию входящих элементов при загрузке. Процесс состоит из нескольких строгих этапов:
Соответствия объектов информационных баз. Если в регистре уже зафиксирована связь «узел обмена + идентификатор источника = ссылка приемника», то поиск завершается мгновенно, а сопоставление по полям пропускается.GUID (если данная опция включена в настройках ПКО).Проанализируем события-обработчики, которые можно использовать в КД 3.0 для переопределения логики сопоставления:
СтрокаТаблицыПоиска в зависимости от значений входящих данных.Посмотрим на пример переопределения логики в обработчике «Перед поиском», когда необходимо найти элемент по нестандартному условию и прервать типовой поиск:
// ВходящиеДанные содержат структуру свойств из формата EnterpriseData
Если Не ПустаяСтрока(ВходящиеДанные.Артикул) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Артикул = &Артикул
| И НЕ Номенклатура.ПометкаУдаления";
Запрос.УстановитьПараметр("Артикул", ВходящиеДанные.Артикул);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
СсылкаНаОбъект = Выборка.Ссылка;
ПрекратитьПоиск = Истина;
КонецЕсли;
КонецЕсли;
Выясним основные проблемы, с которыми можно столкнуться при отладке правил поиска в КД 3.0:
Соответствия объектов информационных баз.Артикул или Код), а во входящем объекте этот реквизит не заполнен, система может найти первый попавшийся элемент с пустым значением. Для предотвращения таких коллизий обязательно проверяйте заполненность полей в обработчиках поиска.ДоговорыКонтрагентов с поиском по владельцу и номеру) убедитесь, что ссылка на объект-владелец корректно идентифицирована до момента начала поиска подчиненного элемента.