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