Как правильно подменить Уникальный Идентификатор (GUID) объекта при обмене через Конвертацию данных 2.0?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При настройке обмена данными между конфигурациями 1С (например, между 1С:Бухгалтерия 3.0 и 1С:Управление торговлей 11) часто возникает специфическая задача: необходимо сопоставить объекты не по их текущим внутренним идентификаторам, а по данным из стороннего источника. Типичный пример — наличие в информационной базе регистра сведений ПубличныеИдентификаторы, где хранятся «правильные» GUID для объектов в целевой базе — для сопоставления объектов пригодится обработка устранения дублей по регистру публичных идентификаторов. Если мы просто запустим стандартный обмен, система создаст дубли или не найдет объекты, так как поиск по УИД (уникальному идентификатору) является приоритетным.

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

Метод 1: Использование ПКС с приемником «{УникальныйИдентификатор}»

Проанализируем самый надежный и «чистый» способ подмены на стороне базы-источника. В конфигурации «Конвертация данных 2.0» (КД 2) предусмотрена возможность напрямую управлять узлом идентификатора в XML-файле выгрузки — для регулярного обмена по созданным правилам подойдёт универсальная подсистема регулярного обмена по правилам КД 2.0.

Для реализации этого метода выполним следующие шаги:

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

Рассмотрим пример кода для обработчика:


// Пытаемся найти соответствие в регистре сведений
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   ПубличныеИдентификаторы.ИдентификаторВУТ
    |ИЗ
    |   РегистрСведений.ПубличныеИдентификаторы КАК ПубличныеИдентификаторы
    |ГДЕ
    |   ПубличныеИдентификаторы.Объект = &Объект";

Запрос.УстановитьПараметр("Объект", Источник);
РезультатЗапроса = Запрос.Выполнить();

Если Не РезультатЗапроса.Пустой() Тогда
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    // Устанавливаем значение, которое КД запишет как GUID объекта в XML
    Значение = Выборка.ИдентификаторВУТ; 
Иначе
    // Если в регистре ничего нет, выгружаем со своим родным идентификатором
    Значение = Строка(Источник.УникальныйИдентификатор());
КонецЕсли;

Важно помнить, что Значение должно быть либо строковым представлением GUID, либо объектом типа УникальныйИдентификатор. Благодаря этому методу, в файл выгрузки попадет уже модифицированный узел, и база-приемник воспримет объект так, будто он изначально имел такой идентификатор.

Метод 2: Программная подмена в обработчике «Поля поиска» на стороне приемника

Если по каким-то причинам мы не можем или не хотим менять файл выгрузки, мы можем переопределить логику поиска объекта уже в момент загрузки в целевую базу (например, в УТ 11) — для контроля результатов обмена пригодится сверка данных и поиск расхождений между УТ 11 и БП 3.0. Для этого нам нужно передать требуемый идентификатор как дополнительное свойство (через параметр ПКО или обычное ПКС).

Выясним, как это работает по шагам:

  1. В ПКО на стороне источника добавим передачу нужного идентификатора в параметр (например, с именем ПромИдентификатор).
  2. В базе-приемнике в ПКО этого объекта найдем обработчик события «Поля поиска».
  3. Напишем код, который принудительно устанавливает ссылку на объект, если найден переданный идентификатор.

Посмотрим на пример реализации:


// Проверяем, передан ли наш специальный идентификатор
Если СвойстваПоиска.Свойство("ПромИдентификатор") И ЗначениеЗаполнено(СвойстваПоиска.ПромИдентификатор) Тогда
    
    Попытка
        НужныйУИД = Новый УникальныйИдентификатор(СвойстваПоиска.ПромИдентификатор);
        // Пытаемся получить ссылку по этому УИД
        СсылкаНаОбъект = Справочники.Контрагенты.ПолучитьСсылку(НужныйУИД);
        
        // Проверяем, существует ли объект в базе
        Если Не СсылкаНаОбъект.ПолучитьОбъект() = Неопределено Тогда
            СсылкаНаОбъект = СсылкаНаОбъект;
            ПрекратитьПоиск = Истина;
        КонецЕсли;
    Исключение
        // Обработка ошибки формата УИД, если необходимо
    КонецПопытки;

КонецЕсли;

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

Метод 3: Прямая модификация узла XML (для продвинутых разработчиков)

Рассмотрим ситуацию, когда требуется максимально низкоуровневый контроль над процессом выгрузки. В КД 2.0 в обработчике «Перед выгрузкой объекта» нам доступна переменная УзелОбъекта. Это позволяет программно вмешиваться в структуру формируемого XML.

Проанализируем этот подход. Мы можем найти узел, отвечающий за уникальный идентификатор, и заменить его текстовое содержимое. Однако стоит быть осторожными: прямое манипулирование DOM-моделью XML в процессе потоковой выгрузки может быть ресурсозатратным. Этот метод обычно используется, когда нужно подменить не только сам GUID, но и, например, добавить атрибуты синхронизации, которые не предусмотрены стандартным интерфейсом КД.

Особенности выгрузки «По ссылке»

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

Чтобы подмена GUID гарантированно отрабатывала для всех случаев, рекомендуется:

Риски и предостережения

Проанализируем возможные проблемы при подмене идентификаторов:

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

Выяснив все технические детали, мы видим, что наиболее сбалансированным является Метод №1. Он позволяет подменить идентификатор на самом раннем этапе, что избавляет от необходимости писать сложную логику поиска на стороне загрузки и минимизирует риск возникновения дублей.

← На главную