Как получить уникальный идентификатор ссылки в 1С и понять формат битых ссылок

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

При интеграции с внешними системами (например, ЕГАИС) или при переносе данных разработчики часто сталкиваются с необходимостью программно установить или прочитать уникальный идентификатор (GUID) объекта. В процессе работы могут возникнуть сомнения: почему метод УникальныйИдентификатор() возвращает строку одного формата, а система при ошибках или в представлении «битых ссылок» отображает совершенно другой вид — например, <Объект не найден> (62:be224c291913d660582766003eaf83b1). Разберем подробно, как устроен этот механизм, как получить GUID ссылки и как избежать ошибок дублирования идентификаторов.

Как получить стандартный уникальный идентификатор из ссылки

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

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


// Получаем уникальный идентификатор из существующей ссылки
Идентификатор = СсылкаНаЭлемент.УникальныйИдентификатор();

// Преобразуем идентификатор в стандартную строку формата GUID
СтрокаГУИД = Строка(Идентификатор);
// Результат будет иметь вид: "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"

Именно такое строковое представление является каноническим (соответствует стандарту UUID) и применяется для передачи идентификаторов в веб-сервисах, XML, JSON и механизмах интеграции с ЕГАИС.

Откуда берется формат вида (62:be224c291913d660582766003eaf83b1)

Проанализируем, почему платформа в некоторых случаях (например, при вызове ЗначениеВСтрокуВнутр() или отображении отсутствующих объектов <Объект не найден>) выводит шестнадцатеричную строку с двоеточием:

  1. Номер таблицы метаданных: Число до двоеточия (в примере 62) — это внутренний числовой код таблицы метаданных конкретной информационной базы. Этот номер генерируется базой данных и может изменяться при реструктуризации или отличаться в разных базах с одинаковой конфигурацией.
  2. Байтовое представление GUID: 32-значная шестнадцатеричная последовательность после двоеточия представляет собой внутренний порядок байтов уникального идентификатора в СУБД. В 1С порядок следования байтов во внутреннем представлении отличается от стандартной записи UUID: блоки байтов переставлены местами.

Важно понимать: строка вида 62:be22... является внутренним техническим представлением платформы и не предназначена для хранения в реквизитах или передачи в сторонние сервисы. Для программного поиска и сопоставления ссылок всегда следует оперировать объектом типа УникальныйИдентификатор.

Причина ошибки «Ошибка при попытке вставки записи с неуникальным значением ссылки»

Такая ошибка часто возникает при загрузке остатков ЕГАИС или ручной генерации идентификаторов с помощью алгоритмов вида СформироватьУникальныйИдентификатор(Код, ...). Выясним основные причины конфликта:

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

Как правильно проверять и создавать объекты по идентификатору

Чтобы исключить попытку создания дублирующей ссылки в базе, разберем безопасный алгоритм проверки существования объекта перед созданием:


// Формируем нужный идентификатор
Идентификатор = Новый УникальныйИдентификатор(СтрокаИдентификатора);

// Получаем ссылку по идентификатору
СсылкаНаОбъект = Справочники[ИмяСправочника].ПолучитьСсылку(Идентификатор);

// Проверяем, существует ли уже запись в базе данных
НайденныйОбъект = СсылкаНаОбъект.ПолучитьОбъект();

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

Поиск существующего объекта по идентификатору

Если требуется просто найти элемент справочника по имеющемуся GUID без риска создания ссылок в памяти, воспользуемся штатным методом менеджера справочника НайтиПоУникальномуИдентификатору():


Идентификатор = Новый УникальныйИдентификатор(СтрокаИдентификатора);
Ссылка = Справочники.Номенклатура.НайтиПоУникальномуИдентификатору(Идентификатор);

Если Не Ссылка.Пустая() Тогда
    // Ссылка найдена в базе
    Сообщить("Найден объект: " + Строка(Ссылка));
Иначе
    // Элемент с таким GUID в информационной базе отсутствует
    Сообщить("Элемент не найден.");
КонецЕсли;

Восстановление ссылочной целостности

Если в базе данных уже появились битые ссылки или поврежденные записи после сбоя обмена с ЕГАИС, выполним следующие шаги:

  1. Откроем базу в режиме Конфигуратор.
  2. Перейдем в меню Администрирование → Тестирование и исправление информационной базы...
  3. Установим флажок Проверка ссылочной целостности информационной базы.
  4. При наличии некорректных ссылок выберем режим «Очищать ссылки» или «Создавать объекты» в зависимости от задач учета.
  5. Нажмем кнопку Выполнить для устранения несоответствий в структуре данных.
← На главную