Где взять уникальный идентификатор ссылки в 1С 8.3 и как найти объект по нему

· 9 мин

Содержание

Чтобы узнать GUID объекта 1С, выполните в отладчике или консоли кода выражение Строка(Ссылка.УникальныйИдентификатор()). Результат — строка вида 5f1c2a90-3b7e-11ef-8d4a-00155d012c07. В формах пользователя GUID не показывается, поэтому без кода, отладчика или навигационной ссылки его не увидеть.

Уникальный идентификатор есть у каждой ссылки: элемента справочника, документа, плана видов характеристик, счёта, задачи, бизнес-процесса, значения перечисления. Способы одинаково работают в любой конфигурации на платформе 1С: Предприятие 8.3, поэтому привязки к БП, ЗУП или УТ нет. Главное — не перепутать три формата записи GUID.

Что такое GUID ссылки и в каких форматах он встречается

GUID — 128-битное число, которое платформа присваивает объекту при первой записи. Он не меняется при переименовании, смене кода или номера. По нему объект однозначно находится в базе, даже если у двух элементов одинаковое наименование.

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

Где встречаетсяКак выглядитПорядок байтов
УникальныйИдентификатор(), XMLСтрока(), OData, XML-обменыaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeeобычный, с дефисами
Навигационная ссылка e1cib/data/...?ref=32 hex-символа без дефисовпереставлен
Поле _IDRRef в таблице СУБД0x + 32 hex-символа, binary(16)переставлен так же
«Битая» ссылка <Объект не найден> (42:...)номер таблицы + 32 hex-символапереставлен так же

Перестановка устроена так. Возьмите GUID aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee. Во внутреннем виде он хранится как dddd + eeeeeeeeeeee + cccc + bbbb + aaaaaaaa. Последние две группы встают в начало, первая группа уходит в конец.

Если поиск по GUID ничего не находит, сначала проверьте формат. Частая причина — в поиск подставили строку из навигационной ссылки или из SQL как обычный GUID.

Есть и второй вид идентификаторов — у объектов метаданных (справочник «Номенклатура» как объект конфигурации, его реквизиты, формы). Это не GUID данных. Он виден в XML-файлах при выгрузке конфигурации в файлы (атрибут uuid), а в конфигурациях на БСП — в справочнике «Идентификаторы объектов метаданных». Дальше речь про GUID данных.

Консоль кода и отладчик: самый быстрый способ узнать GUID

Когда нужно посмотреть идентификатор одного-двух объектов, код писать не нужно.

Через отладчик конфигуратора или EDT

  1. Поставьте точку останова в любой процедуре, где доступна ссылка: например, в обработчике ПриОткрытии формы элемента.
  2. Запустите отладку (F5) и откройте нужный объект.
  3. Когда выполнение остановится, вызовите окно «Вычислить выражение» (Shift+F9).
  4. Введите Строка(Объект.Ссылка.УникальныйИдентификатор()) и нажмите «Рассчитать».

В форме документа или элемента справочника основной реквизит формы обычно называется Объект. Если форма нестандартная, сначала посмотрите имя основного реквизита в её реквизитах.

Через внешнюю обработку «консоль кода»

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

Пример кода для консоли:

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

Внешние обработки в базах на БСП открываются только у пользователей с правом на интерактивное открытие внешних отчётов и обработок. В рабочей базе запускайте консоль под администратором и не выполняйте код, который что-то записывает, без резервной копии.

Без кода: навигационная ссылка

Откройте объект и получите ссылку на него: Shift+F11 или команда «Получить ссылку» в меню формы. В буфер обмена попадёт строка вида:

e1cib/data/Справочник.Номенклатура?ref=8d4a00155d012c0711ef3b7e5f1c2a90

Те 32 символа после ref= — это GUID, но в переставленном порядке (см. таблицу выше). Чтобы получить привычный вид, разложите их по формуле из раздела про SQL.

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

Для массовых задач — выгрузки, сверки, интеграций — идентификатор берут программно.

Ссылка → строка

// Вариант 1: объект УникальныйИдентификатор, затем строка
СтрокаGUID = Строка(Ссылка.УникальныйИдентификатор());

// Вариант 2: сразу строка, удобно для XML и JSON
СтрокаGUID = XMLСтрока(Ссылка);

Оба варианта дают одно и то же: 36 символов в нижнем регистре с дефисами. У пустой ссылки идентификатор 00000000-0000-0000-0000-000000000000.

Строка → ссылка

GUID = Новый УникальныйИдентификатор("5f1c2a90-3b7e-11ef-8d4a-00155d012c07");
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(GUID);

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

ПолучитьСсылку() не проверяет, существует ли объект. Она всегда вернёт ссылку, даже на несуществующую запись. Проверяйте через ПолучитьОбъект() или запросом. Есть и второй путь: XMLЗначение(Тип("СправочникСсылка.Номенклатура"), СтрокаGUID).

GUID для всего списка запросом

В языке запросов функции для получения GUID нет. Выберите ссылки запросом, а идентификатор получите в цикле:

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

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.Наименование + " — " + XMLСтрока(Выборка.Ссылка));
КонецЦикла;

Для тысяч строк вместо Сообщить() пишите результат в ТаблицаЗначений или в файл через ЗаписьТекста.

Навигационная ссылка из кода

ПолучитьНавигационнуюСсылку(Ссылка) возвращает строку e1cib/data/...?ref=.... Удобно, когда идентификатор нужно отправить коллеге: он откроет объект через «Перейти по навигационной ссылке» в главном меню.

Задать GUID новому объекту

Если объект нужно создать с заранее известным идентификатором (перенос из другой базы, загрузка из внешней системы), используйте УстановитьСсылкуНового():

НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.УстановитьСсылкуНового(
    Справочники.Номенклатура.ПолучитьСсылку(
        Новый УникальныйИдентификатор("5f1c2a90-3b7e-11ef-8d4a-00155d012c07")));
НовыйЭлемент.Наименование = "Товар из внешней системы";
НовыйЭлемент.Записать();

Если объект с таким GUID уже есть, запись завершится ошибкой.

GUID на уровне СУБД: поле _IDRRef

В клиент-серверной базе на MS SQL Server или PostgreSQL GUID хранится в колонке _IDRRef таблицы объекта. Колонки-ссылки на другие объекты называются _Fld...RRef.

Как найти нужную таблицу

Имена таблиц обезличены: _Reference42, _Document187. Соответствие возвращает функция ПолучитьСтруктуруХраненияБазыДанных(). Выполните в консоли кода:

Метаданные_ = Новый Массив;
Метаданные_.Добавить(Метаданные.Справочники.Номенклатура);
Структура = ПолучитьСтруктуруХраненияБазыДанных(Метаданные_, Истина);
Для Каждого Стр Из Структура Цикл
    Сообщить(Стр.Метаданные + " → " + Стр.ИмяТаблицыХранения);
КонецЦикла;

Второй параметр Истина возвращает имена на языке СУБД. Без него получите имена вида Reference42 без подчёркивания.

Перевод _IDRRef в обычный GUID в T-SQL

SELECT
    _Description,
    LOWER(
        SUBSTRING(h, 25, 8) + '-' +
        SUBSTRING(h, 21, 4) + '-' +
        SUBSTRING(h, 17, 4) + '-' +
        SUBSTRING(h, 1, 4)  + '-' +
        SUBSTRING(h, 5, 12)
    ) AS guid_1c
FROM (
    SELECT _Description, CONVERT(varchar(32), _IDRRef, 2) AS h
    FROM _Reference42
) t;

Стиль 2 в CONVERT даёт hex-строку без префикса 0x. В PostgreSQL логика та же: строку получают через encode(_idrref, 'hex'), а куски — через substr().

Обратный перевод на встроенном языке

Функция GUIDВоВнутренний(СтрокаGUID)
    С = СтрЗаменить(СтрокаGUID, "-", "");
    Возврат Сред(С, 17, 16) + Сред(С, 13, 4) + Сред(С, 9, 4) + Сред(С, 1, 8);
КонецФункции

Для 5f1c2a90-3b7e-11ef-8d4a-00155d012c07 функция вернёт 8d4a00155d012c0711ef3b7e5f1c2a90 — тот же вид, что в навигационной ссылке и в _IDRRef.

Читать таблицы СУБД можно. Изменять данные 1С прямыми SQL-запросами нельзя: платформа не узнает об изменениях, итоги регистров и кэши разойдутся, а лицензионное соглашение такие действия не допускает.

В файловой базе (1Cv8.1CD) SQL-доступа нет. Там идентификаторы получают кодом или сторонними утилитами чтения файла базы — только на копии, не на рабочем файле.

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

Обмены на БСП

В XML-обменах GUID передаётся строкой в обычном формате. В конфигурациях на БСП соответствие объектов двух баз хранится в регистре сведений «Соответствия объектов информационных баз». Если в приёмнике создался дубль, ищите строку соответствия по GUID объекта-источника: она подскажет, с каким объектом приёмника он связан.

OData

В стандартном интерфейсе OData ссылка объекта приходит в поле Ref_Key, ссылки реквизитов — в полях с суффиксом _Key. Обратиться к одному объекту можно так:

/odata/standard.odata/Catalog_Номенклатура(guid'5f1c2a90-3b7e-11ef-8d4a-00155d012c07')?$format=json

COM-соединение и HTTP-сервисы

Через COM-соединение строку GUID проще всего получить вызовом XMLString() у объекта соединения: прямое приведение объекта УникальныйИдентификатор к строке на стороне внешнего приложения работает не всегда. В HTTP-сервисах отдавайте GUID через XMLСтрока() и принимайте через XMLЗначение().

Где вам нужен GUID?

Сторонние инструменты для поиска и просмотра GUID

Стандартных средств в пользовательском режиме мало, поэтому разработчики пользуются внешними наборами инструментов. Как правило, в них есть:

  • 🔍 консоль кода — выполнение произвольного кода и вывод GUID;
  • 📋 консоль запросов с расширенным выводом — показывает идентификатор ссылки прямо в результате;
  • 🗂 редактор объекта — открывает любой объект по GUID или навигационной ссылке и показывает все реквизиты, включая скрытые;
  • 🧭 поиск битых ссылок — находит <Объект не найден> по всей базе.

Для СУБД подойдёт обычный клиент: SQL Server Management Studio, psql, DBeaver. С ними работает формула из раздела про _IDRRef.

Перед запуском чужой обработки в рабочей базе откройте её в конфигураторе и проверьте модуль на запись данных и обращения к внешним адресам.

Частые ошибки при работе с GUID и как их исправить

<Объект не найден> (42:8d4a00155d012c0711ef3b7e5f1c2a90) — в реквизите лежит ссылка на объект, которого нет в базе. Число 42 — номер таблицы в базе, дальше — GUID во внутреннем порядке. Переведите его в обычный вид функцией выше и ищите объект в базе-источнике. Если он там есть, перенесите его с тем же GUID через УстановитьСсылкуНового() или повторите обмен.

Ссылка найдена, а объект пустой. Это ловушка ПолучитьСсылку(): функция вернула ссылку на несуществующую запись. Проверяйте ПолучитьОбъект() = Неопределено.

Ошибка преобразования значения при Новый УникальныйИдентификатор(). В строке лишние символы: фигурные скобки, пробелы, перевод строки из Excel, кавычки. Очистите строку СокрЛП() и уберите {}. Строка из 32 символов без дефисов тоже не подойдёт — это внутренний формат.

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

Сравнение строк GUID не находит совпадений. Внешние системы часто отдают идентификатор в верхнем регистре, а 1С пишет его в нижнем. Сравнивайте строки после НРег() или сравнивайте не строки, а объекты УникальныйИдентификатор, созданные из этих строк.

После копирования элемента GUID другой. Так и должно быть: копия — новый объект с новым идентификатором. Сохранить GUID можно только переносом, а не копированием.

Может ли GUID объекта 1С измениться?
Нет. Идентификатор присваивается при первой записи и не меняется при переименовании, смене кода или перемещении в другую группу. Новый GUID появится только у копии или у объекта, созданного заново.
Совпадают ли GUID в копии базы, выгруженной в .dt?
Да. При загрузке .dt все ссылки сохраняются, поэтому копия и оригинал имеют одинаковые GUID. Этим пользуются для сверки данных между рабочей и тестовой базой.
Есть ли GUID у строк табличной части и записей регистров?
У строк табличной части и записей регистров сведений собственной ссылки нет. Строку определяет ссылка на документ и номер строки, запись регистра — значения измерений и период.
Можно ли узнать GUID без прав администратора?
Навигационную ссылку через Shift+F11 может получить любой пользователь, у которого открывается объект. Из неё GUID восстанавливается перестановкой групп. Отладка и внешние обработки обычно требуют повышенных прав.
Почему GUID в XML-выгрузке не совпадает с тем, что в SQL?
Это один и тот же идентификатор в разных форматах. В XML — обычный порядок с дефисами, в _IDRRef — переставленный. Переведите один в другой формулой из раздела про _IDRRef.