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