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

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

Как получить GUID объекта в 1С

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

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

Получить GUID можно несколькими способами — в зависимости от того, где вы работаете: в конфигураторе, в отладчике, через запрос или во внешней обработке. Ниже разобраны все рабочие варианты с готовым кодом.

Что такое GUID в 1С и когда он нужен

Каждая ссылка на объект базы (справочник, документ, план видов характеристик и др.) внутренне хранится как уникальный идентификатор. Именно GUID, а не код или наименование, гарантирует уникальность объекта в распределённых базах и при обменах.

Типичные ситуации, когда нужен GUID:

  • сопоставление объектов двух баз при ручной синхронизации;
  • поиск объекта по идентификатору из файла обмена или лога интеграции;
  • восстановление «битой ссылки» — когда в базе остался GUID, а объект удалён;
  • передача идентификатора во внешнюю систему (сайт, CRM, веб-сервис).

Как получить GUID объекта встроенным языком

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

// Получаем GUID элемента справочника

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

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

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

Сообщить(Строка(ГУИД)); // например: "a1b2c3d4-e5f6-7890-abcd-ef1234567890"

КонецЕсли;

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

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

Как узнать GUID через запрос

В языке запросов нет прямой функции вывода GUID, но есть обходной приём: представление ссылки в виде строки GUID получают через соединение с таблицей или через функцию ПРЕДСТАВЛЕНИЕССЫЛКИ — она, однако, возвращает навигационную ссылку, а не чистый GUID. Практичнее получить ссылку запросом, а GUID извлечь уже в коде:

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

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

"ВЫБРАТЬ ПЕРВЫЕ 1

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

|ИЗ

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

|ГДЕ

| Номенклатура.Код = &Код";

Запрос.УстановитьПараметр("Код", "000000123");

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

Если Выборка.Следующий() Тогда

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

КонецЕсли;

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

Как получить ссылку по GUID (обратная задача)

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

ГУИД = Новый УникальныйИдентификатор("a1b2c3d4-e5f6-7890-abcd-ef1234567890");

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

// Проверяем, существует ли объект реально

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

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

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

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

Иначе

Сообщить("Найден: " + Ссылка);

КонецЕсли;

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

Если под рукой нет конфигуратора с правами на запуск кода, есть пользовательские варианты:

  • Отладчик. Поставьте точку останова в модуле, где доступна ссылка, откройте табло (Shift+F9) и введите выражение Строка(Ссылка.УникальныйИдентификатор()).
  • Универсальные обработки. Обработки «Поиск объектов по GUID» из публикаций на профильных ресурсах позволяют ввести GUID и найти объект любого типа без изменения конфигурации.
  • Навигационная ссылка. Команда «Получить ссылку» в форме объекта возвращает строку вида e1cib/data/Справочник.Номенклатура?ref=... — хвост после ref= это шестнадцатеричное представление GUID (в перевёрнутом порядке байт, преобразование требует функции).
Порядок действий для разового поиска GUID
  1. 1
    Откройте внешнюю обработку или консоль кода в режиме предприятия
  2. 2
    Получите ссылку на объект: найдите его по коду, наименованию или запросом
  3. 3
    Вызовите Ссылка.УникальныйИдентификатор() и преобразуйте результат в строку
  4. 4
    Скопируйте полученную строку GUID для передачи или поиска
  5. 5
    Для обратной задачи используйте ПолучитьСсылку и обязательно проверьте существование объекта

GUID и битые ссылки

«Битая ссылка» — это ссылка на удалённый объект. В реквизитах документов и регистров она отображается как «<Объект не найден> (…:a1b2c3d4…)». Из этого представления можно извлечь GUID и попытаться восстановить объект методом ПолучитьСсылку() с последующим созданием объекта по этой ссылке — так работают обработки восстановления удалённых данных.

Строковое представление битой ссылки содержит GUID в особом формате (с перестановкой байтов), поэтому для корректного извлечения используют готовые функции преобразования, а не простое копирование подстроки.

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

Ограничения и особенности

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

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

Итог

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

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

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

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

Нет, штатными средствами GUID изменить нельзя — он назначается при создании и неизменен. Единственный способ «получить другой GUID» — создать новый объект и переназначить все ссылки на него.

Как получить GUID у только что созданного объекта?

После метода Записать() обратитесь к ссылке объекта: НовыйГУИД = Объект.Ссылка.УникальныйИдентификатор();. До записи у нового объекта ссылка уже существует (получена через ПолучитьСсылкуНового), поэтому GUID доступен и до записи.

Одинаков ли GUID объекта в двух базах при обмене?

Да, если обмен выполняется штатными механизмами (планы обмена, конвертация данных с сопоставлением по GUID) — идентификатор сохраняется. При загрузке «как новый объект» GUID будет сгенерирован заново.

Как найти объект по GUID, если неизвестен его тип?

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

Чем GUID отличается от навигационной ссылки?

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

Можно ли сравнивать два GUID оператором «=»?

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