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