Разработка и Конфигурация · 12 мин
Как получить уникальный идентификатор объекта в 1С
Как получить уникальный идентификатор (GUID) объекта в 1С: код на встроенном языке, внешняя обработка, запросы, COM и веб-сервисы. Способы для разных платформ.
Уникальный идентификатор (GUID, Globally Unique Identifier) — это внутренний 36-символьный код, который платформа 1С присваивает каждому объекту базы: элементу справочника, документу, записи регистра. В отличие от кода или номера, GUID никогда не меняется и не повторяется даже между разными базами, поэтому именно его используют при обмене данными, интеграции с сайтами и внешними системами.
Задача «получить GUID» возникает в нескольких типовых ситуациях: нужно найти объект по ссылке из внешней системы, передать идентификатор в отчёт или обработку, сопоставить объекты двух баз при синхронизации. Способ получения зависит от того, где вы работаете — в конфигураторе, в пользовательском режиме, во внешней обработке или вне 1С вообще.
Ниже разобраны рабочие способы: через встроенный язык, через консоль запросов и обработки, через COM-соединение и HTTP-сервисы, а также обратная задача — найти объект по известному GUID. Отдельно описаны ограничения, типичные ошибки и проверка результата.
Что такое GUID в 1С и чем он отличается от кода и номера
GUID — это 128-битное значение, которое платформа генерирует при создании объекта и хранит в служебном поле таблицы базы данных. В текстовом виде он выглядит как 8a3f6c2e-1b4d-4e5a-9f7c-2d8e6a1b3c4d. Идентификатор формируется один раз и не меняется при перенумерации, переносе данных или изменении любых реквизитов объекта.
Код справочника и номер документа — это «человеческие» идентификаторы: они могут повторяться в разных базах, меняться при перенумерации, быть неуникальными в пределах вида при определённых настройках. GUID лишён этих недостатков, поэтому именно он выступает ключом в планах обмена, при регистрации изменений и в интеграциях через веб-сервисы.
Важно понимать: GUID хранится в базе в виде, отличном от строкового представления, а в SQL-таблицах — в «перевёрнутом» (инвертированном) виде. Поэтому искать GUID напрямую в Management Studio или другом SQL-клиенте нужно с учётом преобразования, иначе объект не найдётся.
Получение GUID средствами встроенного языка
Основной способ в коде — метод УникальныйИдентификатор(), доступный у любой ссылки на объект базы (справочник, документ, план счетов и т.д.). Метод возвращает значение типа УникальныйИдентификатор, которое при необходимости приводится к строке через Строка() или используется в сравнениях напрямую.
// Получение GUID из ссылки
СсылкаНаТовар = Справочники.Номенклатура.НайтиПоКоду("00-000123");
Если Не СсылкаНаТовар.Пустая() Тогда
СтрокаGUID = Строка(СсылкаНаТовар.УникальныйИдентификатор());
Сообщить(СтрокаGUID); // например: 8a3f6c2e-1b4d-4e5a-9f7c-2d8e6a1b3c4d
КонецЕсли;
Альтернатива — функция XMLСтрока(), которая для ссылочных типов возвращает тот же GUID в строковом виде. Она удобна в универсальных алгоритмах, где тип значения заранее неизвестен: СтрокаGUID = XMLСтрока(ЛюбаяСсылка);. Обратное преобразование выполняет XMLЗначение(Тип("СправочникСсылка.Номенклатура"), СтрокаGUID).
Для создания нового идентификатора «с нуля» (например, для сопоставления объектов при обмене) используется конструктор: Новый УникальныйИдентификатор() — генерирует случайный GUID, а Новый УникальныйИдентификатор("строка") — создаёт значение из строки.
СтрокаGUID = Строка(Ссылка.УникальныйИдентификатор());
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID));Обратная задача: найти объект по GUID
Когда идентификатор пришёл из внешней системы, объект ищут методом ПолучитьСсылку() у менеджера соответствующего типа. Метод не обращается к данным объекта — он формирует ссылку, и только потом нужно проверить, существует ли такой объект в базе.
Идентификатор = Новый УникальныйИдентификатор("8a3f6c2e-1b4d-4e5a-9f7c-2d8e6a1b3c4d");
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор);
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Если Запрос.Выполнить().Пустой() Тогда
Сообщить("Объект с таким GUID не найден");
КонецЕсли;
Если тип объекта заранее неизвестен (например, GUID может принадлежать и справочнику, и документу), тип придётся перебирать по менеджерам метаданных или хранить его вместе с идентификатором на стороне внешней системы. Универсального метода «найти что угодно по GUID» в платформе нет.
Как узнать GUID без программирования
Если под рукой нет конфигуратора, GUID можно посмотреть в пользовательском режиме. Самый доступный путь — любая универсальная обработка «Консоль кода» или «Редактор объекта» (такие входят во многие библиотеки и инструменты разработчика, например в «Инструменты разработчика»). Открываете объект в такой обработке — и идентификатор отображается как одно из полей ссылки.
Второй вариант — внешняя печатная форма или отчёт, куда добавлено поле с идентификатором. В СКД и в запросах ссылку можно вывести через представление, а GUID — вычисляемым полем, если отчёт строится с использованием встроенного языка в расширении.
Третий путь — адресная строка при работе через веб-клиент или тонкий клиент с навигационными ссылками. Навигационная ссылка вида e1cib/data/Справочник.Номенклатура?ref=... содержит идентификатор объекта в служебном формате. Скопировать её можно через команду «Получить ссылку» в меню формы объекта.
- 1Откройте объект (элемент справочника или документ) в режиме предприятия
- 2В меню формы выберите команду получения навигационной ссылки или откройте объект в обработке редактирования ссылок
- 3Скопируйте идентификатор — в навигационной ссылке он идёт после параметра ref=
- 4Проверьте результат: длина строки GUID — 36 символов с четырьмя дефисами
Получение GUID извне: COM, HTTP и запросы к базе
При интеграции «снаружи» идентификатор обычно передаётся через стандартные механизмы обмена. Если опубликован HTTP-сервис или используется стандартный OData-интерфейс (доступен в типовых конфигурациях при включении соответствующей настройки), GUID фигурирует в ответах как поле Ref_Key. Запрос вида GET /odata/standard.odata/Catalog_Номенклатура?$select=Ref_Key,Description вернёт идентификаторы вместе с наименованиями.
Через COM-соединение (V83.COMConnector) логика та же, что во встроенном языке: подключаетесь к базе, получаете ссылку и вызываете УникальныйИдентификатор(). Способ подходит для регламентных выгрузок на стороне Windows-сервера, но требует соответствующих прав и установленного компонента COM.
Прямые запросы к SQL-базе — крайняя мера только для чтения. GUID в таблицах хранится в поле _IDRRef в бинарном виде с переставленными байтами; для сопоставления со строковым видом применяют известное преобразование порядка байт. Изменять данные напрямую в SQL категорически нельзя — это нарушает целостность базы и лишает поддержки.
Сравнение способов
Самый быстрый и надёжный вариант внутри базы; требует права на выполнение кода
Подходит разовому просмотру без конфигуратора; нужна установленная обработка и права
Оптимален для внешних систем; требует публикации и настройки прав доступа
Только чтение, нужно преобразование бинарного формата; высокий риск ошибок
Где GUID используется на практике
Основной сценарий — синхронизация баз: в планах обмена и при регистрации изменений объекты сопоставляются именно по GUID. Если при обмене объект создаётся заново вместо обновления существующего, почти всегда причина в рассинхронизации идентификаторов — например, базу восстановили из копии, а регистрацию не очистили.
Второй сценарий — интеграция с сайтами, CRM и учётными системами. Внешняя система хранит GUID товара или контрагента и при обмене передаёт его в 1С, а 1С ищет объект через ПолучитьСсылку(). Такой подход устойчив к переименованиям и изменению кодов.
Третий сценарий — отладка и разбор инцидентов: по GUID из журнала регистрации или сообщения об ошибке обмена находят конкретный объект, даже если он уже помечен на удаление.
Проверка результата и ограничения
Корректный строковый GUID всегда имеет вид 8-4-4-4-12 шестнадцатеричных символов, разделённых дефисами, — итого 36 знаков. Если строка короче, длиннее или содержит символы вне диапазона 0-9 и a-f, при создании Новый УникальныйИдентификатор(Строка) возникнет ошибка преобразования — её стоит оборачивать в попытку/исключение при обработке данных из внешних источников.
Ограничения, о которых стоит помнить: у записей регистров сведений и накопления нет ссылки и GUID в привычном смысле — они идентифицируются ключом записи. У предопределённых элементов GUID фиксирован при создании конфигурации, но при обновлении конфигураций с переименованием предопределённых данных возможны нюансы. Удалённый физически объект не восстановить по GUID — идентификатор останется, а данных уже нет.
Как проверить результат
36 символов, четыре дефиса, только hex-символы
Лишние символы, скобки, неверная длина
Запрос по ссылке возвращает строку
Пустой результат запроса — объект отсутствует или тип указан неверно
Реквизиты возвращают осмысленные значения
Пустые значения у всех полей — признак битой ссылки
Итоговая логика проста: внутри базы GUID получают методом УникальныйИдентификатор(), объект по идентификатору ищут через ПолучитьСсылку() с обязательной проверкой существования, а для внешних систем используют OData или HTTP-сервисы. Прямая работа с SQL — только чтение и только с пониманием бинарного формата хранения.
Что важно запомнить
GUID — неизменный ключ объекта, получаемый методом УникальныйИдентификатор() у ссылки. Обратный поиск — ПолучитьСсылку() плюс проверка запросом. Для интеграций храните GUID вместе с типом объекта, а прямое редактирование идентификаторов в SQL недопустимо.
Частые вопросы
Можно ли задать объекту свой GUID вручную?
Да, при создании объекта программно: сначала формируется ссылка через ПолучитьСсылку(Новый УникальныйИдентификатор(...)), затем она присваивается новому объекту методом УстановитьСсылкуНового() до записи. В интерактивном режиме изменить GUID нельзя. Такой приём применяют при синхронизации, чтобы объект в приёмнике получил тот же идентификатор, что в источнике.
Меняется ли GUID при переносе объекта между базами?
Зависит от способа переноса. При обмене через планы обмена и типовые правила конвертации идентификатор сохраняется. При выгрузке-загрузке через произвольные обработки объект может быть создан заново — тогда GUID будет новым, если разработчик обработки явно не предусмотрел перенос идентификатора.
Как найти GUID удалённого объекта?
Если объект помечен на удаление, GUID доступен обычными способами. После физического удаления идентификатор можно найти только в журнале регистрации (в представлении данных), в регистрации изменений планов обмена или в архивных копиях базы. Восстановить сам объект по одному GUID невозможно.
Почему внешняя система не находит объект по переданному GUID?
Чаще всего причины три: объект физически удалён, база была восстановлена из копии с другой историей обмена, или GUID относится к другому типу объекта, чем ожидает запрос. Проверьте существование ссылки запросом и убедитесь, что тип (справочник или документ) указан верно.
Есть ли GUID у записей регистров?
Нет. Записи регистров сведений, накопления, бухгалтерии и расчёта не имеют ссылок и GUID — они идентифицируются набором измерений (и регистратора для подчинённых регистров). Для сопоставления таких записей при обмене используют составной ключ из значений измерений.
Безопасно ли передавать GUID во внешние системы?
Сам по себе идентификатор не содержит данных и его передача безопасна, но по GUID можно обратиться к объекту через опубликованные интерфейсы, если они не защищены. Поэтому доступ к OData и HTTP-сервисам всегда настраивают с аутентификацией и минимально необходимыми правами.