Как в 1С:Конвертация данных синхронизировать ГУИД объекта с текстовым полем и наоборот

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

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

Сценарий 1: Передача ГУИД источника в текстовое поле приемника

Представим ситуацию: в базе-источнике у нас есть объект (например, справочник «Контрагенты»), и нам нужно, чтобы в базе-приемнике его уникальный идентификатор записался в обычный текстовый реквизит Гуид123. Это может быть полезно для ведения истории или интеграции со сторонними системами.

Рассмотрим пошагово, как это настроить в правилах конвертации свойств (ПКС):

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

Для корректного получения строкового представления идентификатора в 1С лучше всего использовать функцию XMLСтрока(). Проанализируем пример кода:


// В обработчике ПКС "Перед выгрузкой"
Значение = XMLСтрока(Источник);

Важное замечание: Функция XMLСтрока(Источник) возвращает строковый идентификатор ссылки. Использование этого метода предпочтительнее, чем Строка(Источник.УникальныйИдентификатор()), так как он работает быстрее и возвращает стандартный формат, принятый в XML-обмене. Обязательно убедитесь, что длина текстового поля в приемнике составляет не менее 36 символов, иначе строка будет обрезана.

Сценарий 2: Поиск объекта в приемнике по текстовому ГУИДу из источника

Теперь разберем более сложную и интересную задачу, описанную в сообщениях форума. У нас в базе-источнике есть текстовое поле Гуид123, в котором хранится строка GUID. Нам нужно, чтобы при загрузке система искала объект в базе-приемнике не по его собственному GUID, а пыталась найти объект, чей внутренний идентификатор совпадает с текстом в нашем поле.

Для реализации этого алгоритма нам потребуется задействовать механизм полей поиска. Выясним, какие настройки необходимо выполнить:

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

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


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

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

Сценарий 3: Установка ГУИДа для нового объекта (УстановитьСсылкуНового)

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

Рассмотрим алгоритм действий:

Когда объект создается «с нуля», он еще не имеет ссылки в базе данных. Метод УстановитьСсылкуНового() позволяет зарезервировать конкретный GUID для этого объекта.


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

Важно: Метод УстановитьСсылкуНового() сработает только в том случае, если объект действительно новый и еще не был записан. Если объект уже существует, изменить его GUID стандартными средствами платформы невозможно.

Дополнительные рекомендации и нюансы

Разберем несколько тонких моментов, которые помогут избежать ошибок при работе с идентификаторами:

Таким образом, мы проанализировали основные способы синхронизации ГУИДов с текстовыми полями. Гибкость «Конвертации данных 2.1» позволяет реализовать практически любую логику сопоставления, главное — правильно выбрать обработчик события и корректно обработать типы данных УникальныйИдентификатор и Строка.

← На главную