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