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