Как в КД 2.1 принудительно задать GUID для загружаемого объекта?

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

При обмене данными через Конвертацию Данных 2.1 часто возникают ситуации, когда необходимо перенести объект из базы-источника в базу-приемник с сохранением его УникальногоИдентификатора (GUID), даже если в целевой конфигурации этот объект еще не существует или поиск по внутреннему идентификатору настроить невозможно. Разберем, как реализовать подмену GUID программными средствами.

Почему стандартный поиск не всегда подходит?

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

Решение через обработчик «Поля поиска»

Наиболее надежный способ принудительного назначения GUID — это работа в обработчике Поля поиска (или Перед поиском в ПКО). В этом случае мы перехватываем логику определения ссылки и принудительно создаем нужный объект, если он еще не существует.

Рассмотрим пошагово, как это реализовать:

  1. Передайте необходимый GUID из источника в приемник через ПараметрыОбъекта или через специальное свойство.
  2. В правилах конвертации объектов (ПКО) в обработчике Поля поиска напишите код для инициализации объекта.

Вот пример кода, который позволит нам выполнить задачу:


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

Важные рекомендации при реализации

При использовании метода УстановитьСсылкуНового необходимо учитывать несколько критических аспектов, чтобы не нарушить целостность данных:

Альтернативный подход: работа со свойствами поиска

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


// Пример из обработчика Перед поиском
GUID = СвойстваПоиска["ИмяВашегоРеквизита"];
СвойстваПоиска.Удалить("ИмяВашегоРеквизита");
СвойстваПоиска.Вставить("{УникальныйИдентификатор}", GUID);

УстанавливатьУОбъектаВсеСвойстваПоиска = Ложь;
ПрекратитьПоиск = Истина;

// Принудительно устанавливаем ссылку
СсылкаНаОбъект = Справочники.ВашСправочник.ПолучитьСсылку(Новый УникальныйИдентификатор(GUID));

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

Выбирая метод реализации, ориентируйтесь на объем данных. Если вы загружаете десятки тысяч объектов, создание объектов через Записать() в коде может замедлить процесс, поэтому лучше использовать встроенный механизм поиска, подменяя параметры в СвойстваПоиска.

← На главную