Уникальный идентификатор ссылки в 1С 8.3: где его увидеть, как получить кодом и что с ним делать при обмене
Содержание
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С:Предприятие.
- Нажмите
Shift+F11— откроется окно с навигационной ссылкой на объект. Ту же команду «Получить ссылку» можно вызвать из меню формы, значок со звеньями цепи в заголовке окна. - Скопируйте строку вида
e1cib/data/Справочник.Номенклатура?ref=8a1c00155d0b2e0111ef4f2d7c3a9b18.
Часть после ref= — это 32 шестнадцатеричных символа без дефисов. Это тот же GUID, но в порядке байтов, в котором он лежит в поле _IDRRef в SQL. Чтобы получить привычный вид xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, группы надо переставить:
Символы в ref | Длина | Куда идут в GUID |
|---|---|---|
| 25–32 | 8 | первая группа |
| 21–24 | 4 | вторая группа |
| 17–20 | 4 | третья группа |
| 1–4 | 4 | четвёртая группа |
| 5–16 | 12 | пятая группа |
Для 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 нужен у объекта, который обрабатывается прямо сейчас: документ при проведении, элемент в процедуре обмена.
- Откройте базу в Конфигураторе и запустите отладку:
Отладка → Начать отладку → Тонкий клиентили клавишаF5. - Поставьте точку останова (
F9) в модуле, где доступна переменная со ссылкой, например вОбработкаПроведениямодуля документа. - Выполните действие в пользовательском режиме — отладчик остановится на строке.
- Нажмите
Shift+F9и в окне «Вычислить выражение» введитеСтрока(Ссылка.УникальныйИдентификатор()). - Нажмите «Рассчитать» — в результате будет строка GUID. Её можно скопировать.
Если GUID нужен у реквизита, а не у самого объекта, обратитесь к реквизиту: Строка(Контрагент.УникальныйИдентификатор()). В модуле формы на клиенте ссылка обычно лежит в Объект.Ссылка.
В клиент-серверной базе отладка серверного кода работает, только если на сервере 1С включена отладка. Её включение требует перезапуска службы агента сервера, а это обрывает сеансы всех пользователей. Делайте это в нерабочее время или на копии базы.
Остановка не обязательно должна быть в коде нужного объекта. В окне «Вычислить выражение» на любой точке останова можно найти объект по коду и сразу взять его GUID: Строка(Справочники.Номенклатура.НайтиПоКоду("00-00000015").УникальныйИдентификатор()).
GUID объекта метаданных в Конфигураторе
В палитре свойств Конфигуратора идентификатора справочника, документа или реквизита нет. Посмотреть его можно через выгрузку конфигурации в файлы.
- В Конфигураторе:
Конфигурация → Выгрузить конфигурацию в файлы. - Укажите пустую папку и формат выгрузки.
- Откройте нужный файл, например
Catalogs\Номенклатура.xml. - В корневом элементе объекта будет атрибут
uuid:
<Catalog uuid="5b2a7f3e-1c4d-4e8a-9b6f-2d1e0c7a4f35">
У каждого реквизита, табличной части и формы внутри файла — свой uuid. Эти идентификаторы не меняются при переименовании объекта, поэтому механизм сравнения и объединения конфигураций узнаёт переименованный реквизит как тот же самый.
Для массового анализа это и есть самый удобный инструмент: выгрузка в файлы даёт все идентификаторы метаданных сразу, по ним можно искать текстовым поиском. Например, найти, какой объект скрывается за GUID из сообщения об ошибке обновления.
В типовых конфигурациях на БСП есть ещё справочник «Идентификаторы объектов метаданных». Его элементы — это ссылки, сопоставленные объектам конфигурации. Получить такой элемент можно функцией ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Справочник.Номенклатура"). У этого элемента свой GUID как у данных, он не совпадает с uuid из файлов выгрузки.
Сравнение способов получить идентификатор
| Способ | Что даёт | Нужен Конфигуратор | Когда удобен |
|---|---|---|---|
Навигационная ссылка (Shift+F11) | GUID данных в порядке байтов SQL | нет | разовая проверка у пользователя |
УникальныйИдентификатор() в коде | GUID данных строкой | нет, если есть внешняя обработка | выгрузка списка, интеграции |
Отладчик, Shift+F9 | GUID данных строкой | да | объект в процессе проведения или обмена |
| Выгрузка конфигурации в файлы | GUID метаданных | да | анализ структуры, сравнение версий |
| Выгрузка данных в XML | GUID данных в теге Ref | нет | проверка пакетов обмена |
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?
Новый УникальныйИдентификатор() принимает строку в любом регистре, а Строка() возвращает её в нижнем регистре.