Уникальный идентификатор ссылки в 1С 8.3: где его увидеть, как получить кодом и что с ним делать при обмене

· 9 мин

Содержание

GUID объекта в 1С быстрее всего посмотреть кодом: Строка(Ссылка.УникальныйИдентификатор()). В отладчике это выражение вводят в окно «Вычислить выражение» (Shift+F9), а в пользовательском режиме идентификатор виден внутри навигационной ссылки, только в переставленном порядке байтов.

Частое заблуждение — что GUID записан где-то в карточке элемента или в свойствах объекта в Конфигураторе. Там его нет. Уникальный идентификатор хранится у ссылки на объект данных, и платформа показывает его только через код, отладчик, навигационную ссылку или выгрузку в XML. У объектов метаданных (самого справочника «Номенклатура» как объекта конфигурации) свой, отдельный GUID — он лежит в файлах выгрузки конфигурации.

Какой GUID вам нужен: у данных или у метаданных

Прежде чем искать, определите, какой из двух идентификаторов нужен. Их часто путают, а живут они в разных местах.

ЧтоПримерГде хранитсяКак посмотреть
GUID ссылки на данныеэлемент «Гвозди 50 мм», документ «Реализация № 15»в базе, поле _IDRRef таблицы объектакод, отладчик, навигационная ссылка, выгрузка XML
GUID объекта метаданныхсправочник «Номенклатура», реквизит «Артикул»в конфигурациивыгрузка конфигурации в файлы, атрибут uuid

Уникальный идентификатор есть у ссылочных типов данных:

  • 📁 справочники;
  • 📄 документы;
  • 📊 планы видов характеристик, планы счетов, планы видов расчёта;
  • 🔄 планы обмена;
  • ⚙️ бизнес-процессы и задачи.

У констант и записей регистров GUID нет. Константа — это одно значение без ссылки, запись регистра определяется набором измерений и регистратором. Если нужен идентификатор «строки» регистра сведений, берут GUID ссылок из его измерений или регистратора.

Пустая ссылка любого типа имеет GUID 00000000-0000-0000-0000-000000000000. Если код вернул такую строку, переменная содержит пустую ссылку, а не «сломанный» объект.

Как посмотреть GUID элемента без Конфигуратора: навигационная ссылка

Этот способ подходит, когда доступа к Конфигуратору нет, а GUID нужен прямо сейчас — например, чтобы передать разработчику.

  1. Откройте элемент справочника или документ в режиме 1С:Предприятие.
  2. Нажмите Shift+F11 — откроется окно с навигационной ссылкой на объект. Ту же команду «Получить ссылку» можно вызвать из меню формы, значок со звеньями цепи в заголовке окна.
  3. Скопируйте строку вида e1cib/data/Справочник.Номенклатура?ref=8a1c00155d0b2e0111ef4f2d7c3a9b18.

Часть после ref= — это 32 шестнадцатеричных символа без дефисов. Это тот же GUID, но в порядке байтов, в котором он лежит в поле _IDRRef в SQL. Чтобы получить привычный вид xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, группы надо переставить:

Символы в refДлинаКуда идут в GUID
25–328первая группа
21–244вторая группа
17–204третья группа
1–44четвёртая группа
5–1612пятая группа

Для ref=8a1c00155d0b2e0111ef4f2d7c3a9b18 получится 7c3a9b18-4f2d-11ef-8a1c-00155d0b2e01. Проверим: символы 25–32 — 7c3a9b18, 21–24 — 4f2d, 17–20 — 11ef, 1–4 — 8a1c, 5–16 — 00155d0b2e01.

Функция для такой перестановки, если GUID из ссылок приходится разбирать регулярно:

Функция GUIDИзНавигационнойСсылки(НавигационнаяСсылка) Экспорт
    Поз = СтрНайти(НавигационнаяСсылка, "ref=");
    Если Поз = 0 Тогда
        Возврат "";
    КонецЕсли;
    Hex = Сред(НавигационнаяСсылка, Поз + 4, 32);
    Возврат Сред(Hex, 25, 8) + "-" + Сред(Hex, 21, 4) + "-"
        + Сред(Hex, 17, 4) + "-" + Сред(Hex, 1, 4) + "-" + Сред(Hex, 5, 12);
КонецФункции

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

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

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

Ссылка = Справочники.Номенклатура.НайтиПоКоду("00-00000015");
Если ЗначениеЗаполнено(Ссылка) Тогда
    GUID = Строка(Ссылка.УникальныйИдентификатор());
    Сообщить("GUID: " + GUID);
КонецЕсли;

Обратная задача — найти объект по известному GUID. Для этого менеджер объекта строит ссылку методом ПолучитьСсылку():

GUIDСтрокой = "7c3a9b18-4f2d-11ef-8a1c-00155d0b2e01";
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(GUIDСтрокой));

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

ПолучитьСсылку() не проверяет, есть ли объект в базе. Она всегда возвращает ссылку нужного типа. Если записи с таким GUID нет, в формах появится «битая» ссылка с текстом <Объект не найден> и идентификатором. Поэтому проверка через ПолучитьОбъект() или запросом обязательна.

В запросе GUID не выбрать

В языке запросов нет функции, которая вернёт уникальный идентификатор строкой. Поэтому выбирают ссылку, а GUID получают уже в коде:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    Номенклатура.Ссылка КАК Ссылка,
|    Номенклатура.Код КАК Код,
|    Номенклатура.Наименование КАК Наименование
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|    НЕ Номенклатура.ЭтоГруппа";

Таблица = Запрос.Выполнить().Выгрузить();
Таблица.Колонки.Добавить("GUID", Новый ОписаниеТипов("Строка"));

Для Каждого СтрокаТаблицы Из Таблица Цикл
    СтрокаТаблицы.GUID = Строка(СтрокаТаблицы.Ссылка.УникальныйИдентификатор());
КонецЦикла;

Таблицу можно вывести в табличный документ или сохранить в файл. Так собирают список GUID по всему справочнику — это и есть массовый просмотр идентификаторов.

Где выполнять код

  • 🧪 Во внешней обработке: Файл → Новый → Внешняя обработка, форма с кнопкой, код в обработчике команды на сервере.
  • 🧰 В консоли кода или консоли запросов с обработкой результата, если такая обработка у вас есть.
  • 🧩 В расширении конфигурации, если GUID нужно выводить пользователям постоянно, например в отдельном поле формы.

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

Отладчик удобен, когда GUID нужен у объекта, который обрабатывается прямо сейчас: документ при проведении, элемент в процедуре обмена.

  1. Откройте базу в Конфигураторе и запустите отладку: Отладка → Начать отладку → Тонкий клиент или клавиша F5.
  2. Поставьте точку останова (F9) в модуле, где доступна переменная со ссылкой, например в ОбработкаПроведения модуля документа.
  3. Выполните действие в пользовательском режиме — отладчик остановится на строке.
  4. Нажмите Shift+F9 и в окне «Вычислить выражение» введите Строка(Ссылка.УникальныйИдентификатор()).
  5. Нажмите «Рассчитать» — в результате будет строка GUID. Её можно скопировать.

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

В клиент-серверной базе отладка серверного кода работает, только если на сервере 1С включена отладка. Её включение требует перезапуска службы агента сервера, а это обрывает сеансы всех пользователей. Делайте это в нерабочее время или на копии базы.

Остановка не обязательно должна быть в коде нужного объекта. В окне «Вычислить выражение» на любой точке останова можно найти объект по коду и сразу взять его GUID: Строка(Справочники.Номенклатура.НайтиПоКоду("00-00000015").УникальныйИдентификатор()).

GUID объекта метаданных в Конфигураторе

В палитре свойств Конфигуратора идентификатора справочника, документа или реквизита нет. Посмотреть его можно через выгрузку конфигурации в файлы.

  1. В Конфигураторе: Конфигурация → Выгрузить конфигурацию в файлы.
  2. Укажите пустую папку и формат выгрузки.
  3. Откройте нужный файл, например Catalogs\Номенклатура.xml.
  4. В корневом элементе объекта будет атрибут uuid:
<Catalog uuid="5b2a7f3e-1c4d-4e8a-9b6f-2d1e0c7a4f35">

У каждого реквизита, табличной части и формы внутри файла — свой uuid. Эти идентификаторы не меняются при переименовании объекта, поэтому механизм сравнения и объединения конфигураций узнаёт переименованный реквизит как тот же самый.

Для массового анализа это и есть самый удобный инструмент: выгрузка в файлы даёт все идентификаторы метаданных сразу, по ним можно искать текстовым поиском. Например, найти, какой объект скрывается за GUID из сообщения об ошибке обновления.

В типовых конфигурациях на БСП есть ещё справочник «Идентификаторы объектов метаданных». Его элементы — это ссылки, сопоставленные объектам конфигурации. Получить такой элемент можно функцией ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Справочник.Номенклатура"). У этого элемента свой GUID как у данных, он не совпадает с uuid из файлов выгрузки.

Сравнение способов получить идентификатор

СпособЧто даётНужен КонфигураторКогда удобен
Навигационная ссылка (Shift+F11)GUID данных в порядке байтов SQLнетразовая проверка у пользователя
УникальныйИдентификатор() в кодеGUID данных строкойнет, если есть внешняя обработкавыгрузка списка, интеграции
Отладчик, Shift+F9GUID данных строкойдаобъект в процессе проведения или обмена
Выгрузка конфигурации в файлыGUID метаданныхдаанализ структуры, сравнение версий
Выгрузка данных в XMLGUID данных в теге Refнетпроверка пакетов обмена
Где вы будете искать GUID?

GUID при обмене данными и интеграциях

Уникальный идентификатор — главный ключ сопоставления объектов между базами. Несколько правил, которые экономят дни разбора.

Копия базы сохраняет GUID. Выгрузка в .dt и загрузка в новую базу переносит идентификаторы как есть. Поэтому у тестовой копии и рабочей базы GUID одинаковые. Это удобно для отладки, но опасно, если копию по ошибке подключили к обмену: объекты из неё «узнаются» как рабочие и перезаписывают их.

Копирование элемента даёт новый GUID. Команда «Скопировать» (F9) в списке создаёт новый объект с новым идентификатором. Переименование, смена кода или пометка на удаление GUID не меняют.

При загрузке можно задать GUID заранее. Чтобы объект в базе-приёмнике получил тот же идентификатор, что в источнике, используют УстановитьСсылкуНового():

GUIDИсточника = Новый УникальныйИдентификатор("7c3a9b18-4f2d-11ef-8a1c-00155d0b2e01");
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(GUIDИсточника);

Объект = Ссылка.ПолучитьОбъект();
Если Объект = Неопределено Тогда
    Объект = Справочники.Номенклатура.СоздатьЭлемент();
    Объект.УстановитьСсылкуНового(Ссылка);
КонецЕсли;

Объект.Наименование = "Гвозди 50 мм";
Объект.Записать();

Битые ссылки появляются из-за GUID. Если документ пришёл раньше справочника, на который ссылается, в реквизите окажется ссылка с GUID несуществующего объекта. В форме это видно как <Объект не найден> (...) с идентификатором в скобках. Этот GUID можно скопировать и найти объект в базе-источнике методом ПолучитьСсылку().

ЗначениеЗаполнено() для битой ссылки возвращает Истина — ссылка-то непустая. Проверять существование объекта нужно через ПолучитьОбъект() или запросом по ссылке.

Поиск по GUID в СУБД. Администратор базы на MS SQL или PostgreSQL иногда ищет запись напрямую, например чтобы понять, в какой таблице лежит битая ссылка. Поле _IDRRef хранит те же 16 байт, что видны в ref= навигационной ссылки. Для примера выше условие отбора в MS SQL выглядит так: WHERE _IDRRef = 0x8A1C00155D0B2E0111EF4F2D7C3A9B18.

Запросы к таблицам 1С в СУБД — только на чтение. Изменение данных в обход платформы ломает целостность базы и не поддерживается.

GUID в форматах обмена. При записи объекта в XML через ЗаписатьXML() идентификатор попадает в элемент Ref. В стандартном интерфейсе OData ключ объекта называется Ref_Key, а обращение к элементу выглядит как Catalog_Номенклатура(guid'7c3a9b18-4f2d-11ef-8a1c-00155d0b2e01'). Поэтому GUID, полученный любым способом из этой статьи, сразу подходит для запроса к OData.

Частые вопросы

Можно ли изменить GUID у существующего элемента?
Нет. У записанного объекта идентификатор не меняется. Можно создать новый объект с нужным GUID через УстановитьСсылкуНового() и перенести ссылки на него, а старый пометить на удаление.
Может ли GUID повториться в двух разных базах?
Случайно — практически нет. Но копии одной базы и базы, связанные обменом, содержат объекты с одинаковыми GUID, и это нормально.
Важен ли регистр букв в GUID?
Нет. Новый УникальныйИдентификатор() принимает строку в любом регистре, а Строка() возвращает её в нижнем регистре.
Почему GUID в навигационной ссылке не совпадает с тем, что выдаёт код?
Это одно и то же значение, но в ссылке байты записаны в порядке хранения в SQL. Переставьте группы символов по таблице из раздела про навигационную ссылку.
Есть ли GUID у значений перечислений и записей регистров?
У записей регистров собственного GUID нет — запись определяется измерениями и регистратором. Значения перечислений в коде и обменах идентифицируют по имени значения.