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