Разработка и Конфигурация · 11 мин
Как получить уникальный идентификатор по ссылке в 1С
Как получить уникальный идентификатор (GUID) по ссылке в 1С: метод УникальныйИдентификатор(), обратное получение ссылки, примеры кода, типичные ошибки и FAQ.
Уникальный идентификатор (GUID) в 1С — это строка из 36 символов вида «b3f4a1c2-…», которая однозначно определяет объект базы данных независимо от его кода, наименования или номера. Получить GUID по ссылке нужно при интеграциях с внешними системами, при обмене данными, при формировании ссылок для веб-сервисов и при отладке, когда требуется точно найти конкретный объект.
Встроенный язык 1С предоставляет штатный метод УникальныйИдентификатор(), который вызывается непосредственно у объекта типа «Ссылка». Метод возвращает значение типа «УникальныйИдентификатор», которое легко преобразуется в строку для передачи наружу. Обратная операция — получение ссылки по известному GUID — тоже поддерживается через метод менеджера объекта ПолучитьСсылку().
Ниже разобраны основные способы получения идентификатора в коде, через консоль запросов и в COM-соединении, а также обратное преобразование, ограничения методов и типичные ошибки, которые приводят к «битым» ссылкам и ошибкам обмена.
Что такое уникальный идентификатор ссылки и где он хранится
Каждая ссылочная сущность в 1С — элемент справочника, документ, план счетов, узел плана обмена — при создании получает уникальный идентификатор. Он генерируется платформой один раз и не меняется на протяжении жизни объекта, даже если пользователь редактирует код, наименование или другие реквизиты. Именно поэтому GUID используют как надёжный ключ при синхронизации с внешними системами.
Важно понимать, что GUID — это не реквизит объекта: его нельзя увидеть в форме элемента и нельзя изменить вручную штатными средствами. Идентификатор хранится внутри служебных полей таблицы базы данных, и доступ к нему возможен только программно — через методы встроенного языка или через инструменты разработчика.
Тип «УникальныйИдентификатор» — отдельный примитивный тип платформы. Он отличается от строки: сравнение строки и идентификатора напрямую невозможно, поэтому при сопоставлении значений нужно явно приводить типы через Строка() или конструктор Новый УникальныйИдентификатор(Строка).
Базовый способ: метод УникальныйИдентификатор()
Самый простой и штатный способ — вызвать метод УникальныйИдентификатор() у переменной, содержащей ссылку. Метод не обращается к данным объекта, поэтому работает быстро и не требует прав на чтение реквизитов — достаточно самой ссылки.
ТоварСсылка = Справочники.Номенклатура.НайтиПоКоду("000000123");
Если Не ТоварСсылка.Пустая() Тогда
Идентификатор = ТоварСсылка.УникальныйИдентификатор();
СтрокаGUID = Строка(Идентификатор);
Сообщить(СтрокаGUID); // например: b3f4a1c2-12d4-4e5f-9a8b-0c1d2e3f4a5b
КонецЕсли;
Обратите внимание на проверку Пустая(): у пустой ссылки вызов метода вернёт идентификатор, состоящий из нулей (00000000-0000-0000-0000-000000000000). Такое значение бесполезно для интеграций и часто становится источником ошибок, если его без проверки передать во внешнюю систему.
Метод доступен для всех ссылочных типов: справочников, документов, планов видов характеристик, планов счетов, планов обмена, задач, бизнес-процессов. Для нессылочных объектов (регистров сведений, записей регистров накопления) метода нет — там идентификатор в принципе не предусмотрен моделью данных.
СтрокаGUID = Строка(Ссылка.УникальныйИдентификатор());Получение GUID в запросе и через консоль запросов
В языке запросов 1С нет функции, напрямую возвращающей GUID, — поле «Ссылка» в результате запроса имеет ссылочный тип. Однако идентификатор можно получить после выполнения запроса, обойдя выборку и вызвав метод у каждой ссылки. Для разового анализа это делают в консоли запросов или внешней обработке.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 10
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Строка(Выборка.Ссылка.УникальныйИдентификатор()));
КонецЦикла;
Если нужно сопоставить GUID с данными на уровне СУБД (например, при прямом чтении таблиц MS SQL), учтите, что в базе идентификатор хранится в бинарном виде с переставленными байтами — текстовое представление в SQL отличается от привычного формата 1С. Для корректной конвертации используют специальные функции преобразования на стороне SQL, а не простое чтение поля.
Обратная операция: получить ссылку по GUID
Часто требуется обратное действие: внешняя система прислала строку идентификатора, и нужно найти объект в базе. Для этого у менеджера объекта есть метод ПолучитьСсылку(), которому передают значение типа «УникальныйИдентификатор», созданное из строки конструктором.
СтрокаGUID = "b3f4a1c2-12d4-4e5f-9a8b-0c1d2e3f4a5b";
Попытка
Идентификатор = Новый УникальныйИдентификатор(СтрокаGUID);
Исключение
Сообщить("Некорректный формат GUID");
Возврат;
КонецПопытки;
ТоварСсылка = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор);
Если ТоварСсылка.ПолучитьОбъект() = Неопределено Тогда
Сообщить("Объект с таким GUID не найден (возможно, удалён)");
КонецЕсли;
Критически важный нюанс: ПолучитьСсылку() всегда возвращает ссылку, даже если объекта с таким идентификатором в базе нет. Проверять существование нужно отдельно — попыткой получить объект или через запрос к таблице. Если пропустить проверку и записать такую ссылку в реквизит другого объекта, в базе появится «битая ссылка» вида «Объект не найден».
GUID в COM-соединении и веб-сервисах
При работе через COM-коннектор (V83.COMConnector) тип «УникальныйИдентификатор» не передаётся между базами напрямую как объект. Стандартная практика — передавать строковое представление: на стороне источника вызвать Строка(Ссылка.УникальныйИдентификатор()), а на стороне приёмника восстановить ссылку конструктором и ПолучитьСсылку().
В HTTP- и SOAP-сервисах GUID обычно фигурирует как строка в URL или в теле сообщения. При проектировании API заранее зафиксируйте формат: регистр символов (1С возвращает нижний), наличие дефисов и поведение при несуществующем объекте — возвращать ошибку 404 или пустой результат. Это избавит интеграцию от неоднозначностей.
Для планов обмена и типовых механизмов синхронизации (EnterpriseData, универсальный формат) платформа сама сопоставляет объекты по GUID, поэтому в типовых обменах вручную работать с идентификаторами обычно не требуется — ручное вмешательство нужно лишь при нештатных сценариях.
Сравнение вариантов
Штатный способ в коде. Быстро, без обращения к данным объекта. Не работает для записей регистров.
Обратное преобразование из строки. Требует обязательной проверки существования объекта.
Универсально для интеграций. Требует контроля формата строки и регистра символов.
Типичные ошибки и как их проверить
Чаще всего проблемы возникают не из-за самого метода, а из-за работы с результатом. Первая группа ошибок — отсутствие проверок: передача GUID пустой ссылки (все нули), отсутствие проверки существования объекта после ПолучитьСсылку(), сравнение строки с идентификатором без приведения типов.
Вторая группа — путаница с идентификаторами при копировании баз. Если базу скопировали средствами СУБД, GUID объектов в копии совпадают с оригиналом, и обмены могут начать «путать» базы. Поэтому тестовые копии отключают от планов обмена до очистки регистраций.
Как проверить результат
36 символов, 5 групп через дефисы, шестнадцатеричные цифры
Другая длина, лишние символы, фигурные скобки
ПолучитьОбъект() возвращает объект, запрос находит запись
ПолучитьОбъект() возвращает Неопределено
Тип ссылки соответствует ожидаемому виду объекта
GUID найден, но у объекта другого вида
Практические рекомендации
Храните GUID во внешних системах как строку в нижнем регистре с дефисами — именно так его возвращает 1С, и такой формат проще сопоставлять при отладке. Если интеграция массовая, передавайте GUID пакетами и логируйте пары «код объекта — GUID», чтобы при расхождениях быстро находить проблемную запись.
При загрузке данных по GUID всегда оборачивайте конструктор Новый УникальныйИдентификатор() в попытку: строка из внешней системы может оказаться некорректной, и без обработки исключения обмен упадёт с ошибкой. После получения ссылки проверяйте и тип — один и тот же GUID не может встречаться в разных таблицах, но искать его нужно в той таблице, для которой он предназначен.
- 1Получите ссылку на объект (НайтиПоКоду, НайтиПоНаименованию, запрос).
- 2Проверьте, что ссылка не пустая: Ссылка.Пустая().
- 3Вызовите Ссылка.УникальныйИдентификатор() и при необходимости преобразуйте в строку через Строка().
- 4Для обратного поиска создайте Новый УникальныйИдентификатор(Строка) внутри Попытка/Исключение.
- 5Получите ссылку через Менеджер.ПолучитьСсылку() и проверьте существование объекта перед использованием.
Что важно запомнить
GUID получают методом Ссылка.УникальныйИдентификатор(), обратно — через ПолучитьСсылку() с конструктором из строки. Всегда проверяйте пустоту ссылки, корректность формата строки и существование объекта — это защищает базу от битых ссылок и ошибок обмена.
Частые вопросы
Можно ли получить GUID без программирования?
Штатных кнопок в пользовательском интерфейсе нет. Проще всего воспользоваться внешней обработкой «консоль кода» или включить режим технического специалиста и выполнить фрагмент кода с методом УникальныйИдентификатор() для нужной ссылки.
Изменится ли GUID при переносе объекта в другую базу?
Если объект переносится штатными средствами обмена или загрузкой с сохранением ссылки, GUID сохраняется. Если объект создаётся заново (например, вводом нового элемента), он получит новый идентификатор, и сопоставление придётся строить по другим ключам.
Что вернёт метод для пустой ссылки?
Идентификатор из одних нулей: 00000000-0000-0000-0000-000000000000. Такое значение нельзя использовать для поиска объекта, поэтому перед вызовом метода проверяйте ссылку функцией Пустая().
Как найти объект по GUID, если неизвестен его вид?
Нужно перебрать менеджеры ссылочных типов (справочники, документы и т.д.), для каждого вызвать ПолучитьСсылку() и проверить существование объекта. Это медленная операция, поэтому в интеграциях вид объекта всегда передают вместе с GUID.
Почему GUID из базы SQL не совпадает со строкой из 1С?
Платформа хранит идентификатор в таблицах СУБД в бинарном виде с перестановкой частей байтов. Для сопоставления нужна функция конвертации формата на стороне SQL, а не прямое сравнение строк.
Можно ли задать объекту свой GUID при создании?
Да: создайте новый объект, вызовите у него УстановитьСсылкуНового() со ссылкой, полученной через ПолучитьСсылку(Новый УникальныйИдентификатор(Строка)), и затем запишите объект. Так делают при синхронизации, когда ключ задаёт внешняя система.