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