К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как узнать GUID объекта в 1С

Как узнать GUID объекта в 1С: через встроенный язык, консоль кода, запрос, COM-соединение и поиск по уникальному идентификатору с примерами кода.

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

Знать GUID объекта чаще всего нужно в трёх ситуациях: при настройке обмена данными между конфигурациями, при поиске «битых» ссылок вида «Объект не найден» и при интеграции с внешними системами, где 1С-объект идентифицируется именно по идентификатору. Ниже разобраны все рабочие способы получить GUID — от простого программного до поиска обратной задачи, когда есть GUID и нужно найти сам объект.

Что такое GUID в 1С и где он хранится

Каждая ссылка на объект базы данных в 1С содержит уникальный идентификатор — 128-битное значение, которое в текстовом виде выглядит как строка формата 8f3a2b1c-4d5e-6f7a-8b9c-0d1e2f3a4b5c. Идентификатор генерируется платформой в момент создания объекта и остаётся неизменным на протяжении всей его жизни, включая выгрузку и загрузку через планы обмена.

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

В таблицах SQL-базы GUID хранится в поле ссылки (обычно _IDRRef) в бинарном виде. При просмотре данных напрямую через SQL Server или PostgreSQL идентификатор выглядит иначе, чем в 1С, — байты переставлены в обратном порядке. Этот нюанс важен при интеграциях на уровне СУБД.

Как узнать GUID через встроенный язык

Основной способ — метод УникальныйИдентификатор(), который есть у любой ссылки на объект базы. Он возвращает значение типа «УникальныйИдентификатор», которое легко преобразуется в строку. Этот метод работает для справочников, документов, планов видов характеристик, планов счетов и других ссылочных типов.

Типовой фрагмент кода выглядит так:

// Получаем ссылку любым способом, например по коду

СсылкаНаЭлемент = Справочники.Номенклатура.НайтиПоКоду("000000123");

Если Не СсылкаНаЭлемент.Пустая() Тогда

ГУИДСтрокой = Строка(СсылкаНаЭлемент.УникальныйИдентификатор());

Сообщить(ГУИДСтрокой);

КонецЕсли;

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

bsl
Ссылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("000000001", ТекущаяДатаСеанса());
Сообщить(Строка(Ссылка.УникальныйИдентификатор()));

Как узнать GUID без программирования

Если нет возможности писать код, существует несколько обходных путей. Самый известный — через адресную строку браузера в веб-клиенте или через ссылку «Получить ссылку» в тонком клиенте. Команда «Ещё → Получить ссылку» (или сочетание клавиш в зависимости от версии платформы) показывает навигационную ссылку вида e1cib/data/Справочник.Номенклатура?ref=..., где часть после ref= — это и есть идентификатор, но в специальном внутреннем представлении платформы, а не в привычном формате GUID.

Преобразовать такое представление в стандартный GUID можно небольшой функцией перестановки байтов — такие функции давно опубликованы в типовых обработках и на профильных ресурсах. Проще, однако, воспользоваться готовой внешней обработкой «Консоль кода» или «Инструменты разработчика», где GUID отображается одной командой.

Ещё один вариант без кода — выгрузка через универсальный обмен данными (обработка «Универсальный обмен данными в формате XML»). В выгруженном XML-файле у каждого объекта есть атрибут с идентификатором, который можно найти поиском по наименованию объекта.

Поиск GUID через запрос и консоль запросов

Язык запросов 1С не имеет функции, напрямую возвращающей GUID ссылки, — поле «Ссылка» в запросе нельзя преобразовать в строку идентификатора. Поэтому чистым запросом GUID не получить. Однако консоль запросов обычно используют в связке с обходом результата в коде: запрос выбирает нужные ссылки, а цикл по выборке выводит их идентификаторы.

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка,

| Номенклатура.Наименование КАК Наименование

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| НЕ Номенклатура.ПометкаУдаления";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

Сообщить(Выборка.Наименование + " | "

+ Строка(Выборка.Ссылка.УникальныйИдентификатор()));

КонецЦикла;

Для больших объёмов результат удобнее выводить в табличный документ или таблицу значений с последующим сохранением в Excel — так получится готовая таблица соответствия «объект — GUID» для передачи во внешнюю систему.

Обратная задача: как найти объект по GUID

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

ГУИД = Новый УникальныйИдентификатор("8f3a2b1c-4d5e-6f7a-8b9c-0d1e2f3a4b5c");

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

// Проверка, существует ли объект в базе

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

Запрос.УстановитьПараметр("Ссылка", Ссылка);

Если Запрос.Выполнить().Пустой() Тогда

Сообщить("Объект с таким GUID не найден (битая ссылка)");

КонецЕсли;

Если тип объекта заранее неизвестен, придётся перебирать менеджеры всех ссылочных типов через метаданные и проверять существование объекта в каждом. Для этого удобны готовые обработки «поиск объекта по GUID», которые делают перебор автоматически и сразу показывают найденный объект.

Порядок действий при поиске объекта по GUID
  1. 1
    Скопируйте строку GUID из сообщения об ошибке или внешней системы
  2. 2
    Откройте консоль кода или внешнюю обработку в режиме предприятия
  3. 3
    Создайте значение: Новый УникальныйИдентификатор(СтрокаGUID)
  4. 4
    Получите ссылку через ПолучитьСсылку() для предполагаемого типа объекта
  5. 5
    Проверьте существование объекта запросом к таблице
  6. 6
    Если тип неизвестен — переберите ссылочные типы через метаданные

GUID при обмене данными и в типовых механизмах

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

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

Отдельный случай — восстановление объекта по GUID после удаления. Если объект удалён физически, но его GUID известен и есть копия объекта в другой базе, можно перенести данные и принудительно назначить новому объекту старый идентификатор через УстановитьСсылкуНового() до записи. Это рабочий приём при устранении битых ссылок.

Частые ошибки и ограничения

Самая распространённая ошибка — попытка получить GUID у значения, которое не является ссылкой: у строки, числа или объекта типа «ДанныеФормыСтруктура» на форме. Метод УникальныйИдентификатор() доступен только ссылочным типам. Если в переменной лежит объект, сначала обратитесь к Объект.Ссылка.

Вторая типичная ситуация — путаница между GUID и навигационной ссылкой. Строка из «Получить ссылку» содержит идентификатор в ином кодировании, и внешняя система, ожидающая стандартный GUID, такое значение не примет. Всегда проверяйте формат: стандартный GUID содержит 32 шестнадцатеричных символа и 4 дефиса.

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

Типичные ошибки
01
Вызов УникальныйИдентификатор() у объекта вместо ссылки — получение ошибки или не того значения
02
Передача во внешнюю систему строки из навигационной ссылки вместо стандартного GUID
03
Отсутствие проверки существования объекта после ПолучитьСсылку() — ошибка при обращении к реквизитам
04
Попытка получить GUID чистым запросом без обхода выборки в коде

Как проверить результат

После получения GUID убедитесь, что он корректен и пригоден для вашей задачи. Строка должна иметь вид xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx и состоять только из шестнадцатеричных символов. Для контроля можно выполнить обратное преобразование: создать из строки Новый УникальныйИдентификатор() и получить ссылку — если вернулся исходный объект, идентификатор верный.

При передаче GUID во внешнюю систему проверьте регистр символов и отсутствие фигурных скобок: некоторые системы выдают GUID в формате {8f3a...}, и перед использованием в 1С скобки нужно убрать. Сама 1С к регистру букв в конструкторе идентификатора относится терпимо, но внешние системы — не всегда.

Контрольные точки

Как проверить результат

Формат строки GUID
Норма

36 символов, 4 дефиса, только 0-9 и a-f

Тревожный признак

Фигурные скобки, лишние символы, длина отличается

Обратное преобразование
Норма

По GUID через ПолучитьСсылку() возвращается исходный объект

Тревожный признак

Ссылка получена, но объекта в базе нет (битая ссылка)

Источник идентификатора
Норма

Получен через УникальныйИдентификатор()

Тревожный признак

Скопирован из навигационной ссылки без преобразования

Подводя итог: для разовой задачи достаточно консоли кода и метода УникальныйИдентификатор(), для массовой выгрузки — запроса с обходом выборки, для обратного поиска — ПолучитьСсылку() с обязательной проверкой существования. Этих трёх приёмов закрывают практически все сценарии работы с GUID в 1С.

Итог

Что важно запомнить

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

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

Можно ли узнать GUID объекта в пользовательском режиме без обработок?

Напрямую — нет, в интерфейсе GUID не отображается. Ближайший вариант — команда «Получить ссылку», но она выдаёт навигационную ссылку в особом формате. Для получения стандартного GUID понадобится консоль кода, внешняя обработка или выгрузка через обмен данными.

Меняется ли GUID объекта при переносе между базами?

Если перенос выполняется штатными механизмами обмена или выгрузки/загрузки XML — нет, идентификатор сохраняется. Если объект создаётся заново в другой базе вручную или кодом без УстановитьСсылкуНового(), он получит новый GUID.

Что делать, если в сообщении об ошибке «Объект не найден» указан непонятный код?

В тексте такой ошибки обычно присутствует идентификатор в скобках. Скопируйте его, создайте Новый УникальныйИдентификатор() из этой строки и переберите ссылочные типы через ПолучитьСсылку() с проверкой существования — так вы определите, объект какого типа был удалён.

Почему GUID в SQL-базе не совпадает с тем, что показывает 1С?

В таблицах СУБД идентификатор хранится в бинарном виде с переставленными байтами. Для сопоставления нужно преобразование порядка байтов — либо специальной функцией на стороне SQL, либо получать GUID только средствами платформы 1С.

Можно ли задать объекту нужный GUID вручную?

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

Есть ли GUID у записей регистров сведений?

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