Как добавить выгрузку и поиск по GUID в обработке загрузки данных из табличного документа?

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

При обмене данными между информационными базами или загрузке справочников из внешних таблиц стандартного поиска по наименованию или коду часто бывает недостаточно. Наименования могут дублироваться или изменяться пользователями, что приводит к созданию дублей. Самым надежным способом однозначной идентификации элементов является использование их уникального идентификатора — GUID (UUID).

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

Особенности работы с GUID и ссылками в платформе «1С:Предприятие»

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

  1. Неизменяемость ссылки записанного объекта: Уникальный идентификатор генерируется платформой в момент создания ссылки и жестко привязан к полю Ссылка. Изменить GUID у объекта, который уже записан в базу данных, невозможно.
  2. Поведение метода ПолучитьСсылку(): Метод менеджера справочника Справочники.Сотрудники.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID)) возвращает валидную ссылку заданного типа всегда, даже если в информационной базе объекта с таким идентификатором еще нет. Данный метод не обращается к таблицам базы данных для проверки существования записи.
  3. Формат строки идентификатора: Конструктор Новый УникальныйИдентификатор(...) принимает строго строку длиной 36 символов определенного формата (шаблон xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx). Если в строке присутствуют пробелы или невидимые символы, платформа вызовет исключение. Поэтому строковое значение всегда следует предварительно очищать с помощью функции СокрЛП().

Шаг 1. Выгрузка GUID в табличный документ

Рассмотрим, как добавить колонку с идентификатором при формировании таблицы для выгрузки. Для получения строки идентификатора из ссылки на объект конфигурации используется свойство УникальныйИдентификатор(), которое затем приводится к строковому типу.

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


// Предположим, что мы обходим выборку сотрудников или массив ссылок
ТекущийИдентификатор = Строка(ТекущийСотрудник.УникальныйИдентификатор());

// Записываем полученную строку в соответствующую ячейку колонки табличного документа
ОбластьСтрока.Параметры.ГУИД = ТекущийИдентификатор;
ТабличныйДокумент.Вывести(ОбластьСтрока);

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

Шаг 2. Поиск существующего объекта и создание нового с сохранением GUID

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

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

  1. Получаем строковое значение GUID из текущей строки табличного документа и преобразуем его в объект типа УникальныйИдентификатор.
  2. Формируем ссылку с помощью метода ПолучитьСсылку() менеджера соответствующего справочника.
  3. Проверяем, существует ли уже такой объект в информационной базе. Для одиночных операций можно вызвать метод ПолучитьОбъект(). Если метод возвращает Неопределено, значит, объекта с данным GUID в базе еще нет.
  4. Если объект не найден, создаем новый элемент через СоздатьЭлемент() и сразу же вызываем метод УстановитьСсылкуНового(СсылкаПоГУИД). Метод сработает только в том случае, если объект еще не был записан (Объект.ЭтоНовый() = Истина).
  5. Заполняем остальные реквизиты объекта и выполняем запись.

Посмотрим на практическую реализацию данного алгоритма:


СтрокаГУИД = СокрЛП(СтрокаТаблицы.ГУИД);

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

// Заполнение реквизитов объекта данными из табличного документа
ОбъектСотрудник.Наименование = СтрокаТаблицы.ФИО;
ОбъектСотрудник.Записать();

Интеграция в типовые обработки загрузки данных

Рассмотрим подробнее, как применить этот подход, если используется готовая универсальная обработка «Загрузка данных из табличного документа»:

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

Альтернативные варианты переноса данных с сохранением GUID

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

  1. Обработка «Универсальный обмен данными в формате XML»: Если требуется перенести справочники между базами с идентичной конфигурацией, этот инструмент переносит объекты с полным сохранением их системных идентификаторов без необходимости написания программного кода.
  2. Конфигурация «Конвертация данных»: При сложном переносе между различными конфигурациями правила синхронизации объектов (ПСО) позволяют гибко настроить сопоставление по внутреннему уникальному идентификатору (GUID).
  3. HTTP-сервисы и OData (REST API): При программной интеграции через стандартный интерфейс OData передача реквизита Ref_Key автоматически связывает или создает запись с требуемым значением уникального идентификатора.
← На главную