Как в Конвертации данных 2 сопоставить и перезаписать существующий объект в базе-приемнике вместо создания нового дубля?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При настройке правил обмена в конфигурации «Конвертация данных 2» часто возникает задача синхронизации ключевых справочников, таких как СправочникСсылка.Организации. Типовой сценарий предполагает, что поиск выполняется по уникальному идентификатору (GUID). Однако если в базе-источнике и базе-приемнике элементы изначально создавались независимо, их GUID различаются. В результате при выгрузке данных в приемнике вместо обновления уже существующей организации постоянно создается дубль.

Попытки разработчиков вмешаться в процесс через обработчик «После загрузки» в правиле конвертации объекта (ПКО) обычно завершаются неудачей. Разберем по шагам, почему подмена ссылки в этом событии не работает, где именно в жизненном цикле КД 2 следует определять соответствие и какими способами можно гарантированно направить загружаемые данные в уже существующий элемент.

Почему не работает подмена ссылки в обработчике «После загрузки»

Проанализируем распространенную ошибку. Разработчик пытается перехватить загрузку в обработчике «После загрузки» правила конвертации объекта и переопределить системную переменную Ссылка:


Если ПараметрыОбъекта <> Неопределено Тогда 
    Если ПараметрыОбъекта["ЭтоЦентральныйАппарат"] <> Неопределено Тогда 
        Если ПараметрыОбъекта["ЭтоЦентральныйАппарат"] = Истина Тогда 
            ЦентральныйАппарат = Справочники.Организации.НайтиПоРеквизиту("Префикс", "ЦА"); 
            Если ЗначениеЗаполнено(ЦентральныйАппарат) Тогда 
                Ссылка = ЦентральныйАппарат; 
            КонецЕсли; 
        КонецЕсли; 
    КонецЕсли; 
КонецЕсли;

Данный фрагмент кода не приносит желаемого результата по следующим причинам:

  1. Стадия обработки данных. В момент вызова обработчика «После загрузки» процедура идентификации объекта уже завершена. Экземпляр объекта уже прочитан из базы данных либо инициализирован как новый и находится в оперативной памяти в переменной Объект (тип СправочникОбъект).
  2. Локальный контекст переменной. Присвоение Ссылка = ЦентральныйАппарат лишь перезаписывает значение локальной переменной обработчика. Оно не влияет на инициализированный экземпляр Объект, который в дальнейшем будет автоматически записан платформой в информационную базу.
  3. Неправильный обработчик для стороны источника. Попытки назначить Значение = ... в обработчике «Перед выгрузкой» на уровне ПКО также ошибочны: параметр Значение доступен только в правилах конвертации свойств (ПКС). В ПКО основным источником выступает переменная Источник.

Способ 1. Использование обработчика «Поля поиска» в ПКО (рекомендуемый штатный способ)

Выясним причину поведения алгоритмов загрузки: когда файл данных поступает в приемник, механизм КД 2 сначала ищет элемент по переданному идентификатору GUID. Если элемент с таким идентификатором не найден, система переходит к сопоставлению по полям поиска. Именно здесь необходимо переопределить результирующую ссылку.

Рассмотрим, как правильно настроить поиск в ПКО справочника Организации:

  1. Открываем ПКО нужного справочника в конфигурации «Конвертация данных 2».
  2. В свойствах правила настраиваем поиск по полям. Если сопоставление по GUID не требуется, флаг «Искать объект приемника по внутреннему идентификатору» можно отключить, либо оставить его включенным, если часть других элементов может сопоставляться по GUID при первичном совпадении.
  3. Переходим на вкладку «Поля поиска» в ПКО. В этом обработчике доступны специализированные параметры: СсылкаНаОбъект (ссылка, куда необходимо поместить результат поиска), ПрекратитьПоиск (булев флаг, прерывающий стандартные алгоритмы поиска) и СвойстваПоиска.
  4. Описываем алгоритм поиска требуемого элемента в приемнике и явно передаем его в переменную СсылкаНаОбъект:

// Проверяем переданные свойства или параметры объекта
Если ПараметрыОбъекта <> Неопределено И ПараметрыОбъекта["ЭтоЦентральныйАппарат"] = Истина Тогда
    НайденнаяОрганизация = Справочники.Организации.НайтиПоРеквизиту("Префикс", "ЦА");
    Если ЗначениеЗаполнено(НайденнаяОрганизация) Тогда
        СсылкаНаОбъект = НайденнаяОрганизация;
        ПрекратитьПоиск = Истина;
    КонецЕсли;
КонецЕсли;

В таком сценарии механизм загрузки не станет создавать новый элемент. Он возьмет существующую ссылку из переменной СсылкаНаОбъект, считает объект из базы данных в переменную Объект, заполнит переданные реквизиты и перезапишет его.

Особенности платформы 1С:Предприятие при работе с GUID

Необходимо учитывать фундаментальное ограничение платформы: уникальный идентификатор существующего в базе объекта изменить нельзя. Метод ПолучитьСсылку() с указанием нового GUID работает только для еще не записанных в базу элементов.

Это означает, что даже после успешного сопоставления и перезаписи организации в приемнике её внутренний идентификатор останется прежним. При следующей выгрузке поиск по GUID снова вернет отрицательный результат, и платформа опять пойдет по ветке полей поиска. Поэтому алгоритм в обработчике «Поля поиска» должен выполняться стабильно при каждой синхронизации данных.

Способ 2. Использование регистра «Соответствия объектов информационных баз» (для конфигураций на БСП)

Если обмен выполняется между типовыми конфигурациями, использующими Библиотеку стандартных подсистем (БСП), сопоставление ссылок управляется механизмом регистра сведений СоответствияОбъектовИнформационныхБаз.

Разберем по шагам альтернативное решение без доработки правил обмена:

  1. Определяем точный GUID организации в базе-источнике с помощью вызова функции Строка(ОрганизацияИсточник.УникальныйИдентификатор()).
  2. В базе-приемнике находим требуемую организацию, которую необходимо замещать при загрузке.
  3. Создаем запись в регистре сведений СоответствияОбъектовИнформационныхБаз для соответствующего узла плана обмена. В качестве уникального идентификатора источника указываем GUID из первой базы, а в качестве ссылки приемника — существующую организацию приемника.

При таком подходе типовые механизмы БСП сопоставят объекты на этапе анализа файла обмена еще до выполнения общих алгоритмов КД 2, что полностью исключит создание дублирующих записей.

← На главную