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