Где взять уникальный идентификатор ссылки в 1С 8.3 и как найти объект по нему
Содержание
Чтобы узнать 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
- Поставьте точку останова в любой процедуре, где доступна ссылка: например, в обработчике
ПриОткрытииформы элемента. - Запустите отладку (
F5) и откройте нужный объект. - Когда выполнение остановится, вызовите окно «Вычислить выражение» (
Shift+F9). - Введите
Строка(Объект.Ссылка.УникальныйИдентификатор())и нажмите «Рассчитать».
В форме документа или элемента справочника основной реквизит формы обычно называется Объект. Если форма нестандартная, сначала посмотрите имя основного реквизита в её реквизитах.
Через внешнюю обработку «консоль кода»
Консоль кода — внешняя обработка, которая выполняет произвольный текст на встроенном языке в режиме 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 или навигационной ссылке и показывает все реквизиты, включая скрытые;
- 🧭 поиск битых ссылок — находит
<Объект не найден>по всей базе.
Для СУБД подойдёт обычный клиент: SQL Server Management Studio, psql, DBeaver. С ними работает формула из раздела про _IDRRef.
Перед запуском чужой обработки в рабочей базе откройте её в конфигураторе и проверьте модуль на запись данных и обращения к внешним адресам.
Частые ошибки при работе с GUID и как их исправить
<Объект не найден> (42:8d4a00155d012c0711ef3b7e5f1c2a90) — в реквизите лежит ссылка на объект, которого нет в базе. Число 42 — номер таблицы в базе, дальше — GUID во внутреннем порядке. Переведите его в обычный вид функцией выше и ищите объект в базе-источнике. Если он там есть, перенесите его с тем же GUID через УстановитьСсылкуНового() или повторите обмен.
Ссылка найдена, а объект пустой. Это ловушка ПолучитьСсылку(): функция вернула ссылку на несуществующую запись. Проверяйте ПолучитьОбъект() = Неопределено.
Ошибка преобразования значения при Новый УникальныйИдентификатор(). В строке лишние символы: фигурные скобки, пробелы, перевод строки из Excel, кавычки. Очистите строку СокрЛП() и уберите {}. Строка из 32 символов без дефисов тоже не подойдёт — это внутренний формат.
GUID предопределённого элемента различается в двух базах. Предопределённые элементы создаются в каждой базе отдельно, поэтому их GUID не совпадают. Сопоставляйте их по имени предопределённых данных: ИмяПредопределенныхДанных в объекте или ПредопределенноеЗначение() в коде.
Сравнение строк GUID не находит совпадений. Внешние системы часто отдают идентификатор в верхнем регистре, а 1С пишет его в нижнем. Сравнивайте строки после НРег() или сравнивайте не строки, а объекты УникальныйИдентификатор, созданные из этих строк.
После копирования элемента GUID другой. Так и должно быть: копия — новый объект с новым идентификатором. Сохранить GUID можно только переносом, а не копированием.
Может ли GUID объекта 1С измениться?
Совпадают ли GUID в копии базы, выгруженной в .dt?
.dt все ссылки сохраняются, поэтому копия и оригинал имеют одинаковые GUID. Этим пользуются для сверки данных между рабочей и тестовой базой.Есть ли GUID у строк табличной части и записей регистров?
Можно ли узнать GUID без прав администратора?
Shift+F11 может получить любой пользователь, у которого открывается объект. Из неё GUID восстанавливается перестановкой групп. Отладка и внешние обработки обычно требуют повышенных прав.Почему GUID в XML-выгрузке не совпадает с тем, что в SQL?
_IDRRef — переставленный. Переведите один в другой формулой из раздела про _IDRRef.