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