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

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

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

Как получить UUID объекта 1С: через Ссылка.УникальныйИдентификатор(), в запросе, из строки и обратно. Примеры кода, типичные ошибки и ограничения.

UUID (уникальный идентификатор) — это 36-символьная строка вида «a1b2c3d4-e5f6-7890-abcd-ef1234567890», которая однозначно определяет объект базы 1С независимо от его кода или номера. Именно UUID используется при обмене данными между базами, в веб-сервисах, при интеграции с внешними системами и при формировании ссылок на объекты в HTTP-запросах.

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

Получить UUID можно несколькими способами: программно через метод ссылки, в консоли запросов, через COM-соединение, из строки навигационной ссылки и обратным преобразованием из строки в ссылку. Ниже разобраны все рабочие варианты с примерами кода и указанием ограничений каждого.

Что такое UUID объекта и где он хранится

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

Важно понимать: UUID принадлежит именно ссылке, а не объекту как набору данных. Если объект удалить и создать заново с теми же реквизитами — UUID будет другим. Это частая причина «потери» связей при восстановлении данных из неполных копий.

UUID в 1С соответствует стандарту GUID и представляется в виде пяти групп шестнадцатеричных символов, разделённых дефисами. При передаче во внешние системы обычно используется строковое представление в нижнем регистре.

Основной способ: метод УникальныйИдентификатор()

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

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

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

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

СтрокаУИД = Строка(УИД); // "a1b2c3d4-e5f6-7890-abcd-ef1234567890"

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

КонецЕсли;

Метод возвращает значение типа УникальныйИдентификатор, а не строку. Чтобы передать идентификатор в HTTP-запрос, JSON или сохранить в текстовое поле, нужно явно привести его к строке через Строка() или использовать сериализацию.

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

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

Как получить ссылку обратно из строки UUID

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

СтрокаУИД = "a1b2c3d4-e5f6-7890-abcd-ef1234567890";

УИД = Новый УникальныйИдентификатор(СтрокаУИД);

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

Если ТоварСсылка.ПолучитьОбъект() = Неопределено Тогда

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

КонецЕсли;

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

Если строка UUID пришла в верхнем регистре или с фигурными скобками (как в некоторых внешних системах), перед конструктором её нужно нормализовать: убрать скобки и привести к нижнему регистру. Конструктор Новый УникальныйИдентификатор() к регистру нетребователен, но лишние символы вызовут исключение.

Получение UUID в запросе и консоли запросов

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

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

Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ ПометкаУдаления = ЛОЖЬ";

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

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

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

КонецЦикла;

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

Для массовой выгрузки UUID в файл (например, для сверки двух баз) эффективнее выгружать пары «код — UUID» через запрос и запись в текстовый или JSON-файл, а не обходить объекты по одному через ПолучитьОбъект() — это существенно быстрее на больших таблицах.

Порядок действий при интеграции
  1. 1
    Получите ссылку на объект поиском по коду, наименованию или запросом
  2. 2
    Вызовите Ссылка.УникальныйИдентификатор() и приведите результат к строке
  3. 3
    Передайте строку во внешнюю систему или сохраните в реквизит обмена
  4. 4
    При обратном приёме создайте УникальныйИдентификатор из строки и получите ссылку через менеджер типа
  5. 5
    Проверьте существование объекта перед использованием ссылки

UUID из навигационной ссылки и внешних источников

В тонком и веб-клиенте у каждого открытого объекта есть навигационная ссылка вида e1cib/data/Справочник.Номенклатура?ref=80e1005056e5e2d811ef.... Шестнадцатеричное значение после ref= — это тот же идентификатор, но в специальном внутреннем формате платформы, а не в стандартном виде UUID.

Преобразование между внутренним форматом и стандартным UUID выполняется перестановкой байтов: группы в строке ref записаны в обратном порядке. Встроенной функции для этого нет, поэтому используют небольшую процедуру разбора строки. Альтернатива — функция ПолучитьНавигационнуюСсылку() для обратного направления, если нужно сформировать ссылку на объект для пользователя.

При работе через COM-соединение (V83.COMConnector) логика та же: у объекта ссылки, полученного через COM, доступен метод УникальныйИдентификатор(), возвращающий строку. Это удобно для сверки объектов между двумя базами без промежуточных файлов.

Типичные ошибки при работе с UUID

Первая распространённая ошибка — сравнение UUID как строк без учёта регистра. Внешняя система может вернуть идентификатор в верхнем регистре, а 1С хранит строковое представление в нижнем. Перед сравнением строки приводят к одному регистру функцией НРег().

Вторая ошибка — попытка получить UUID у значения, которое не является ссылкой: у структуры, у объекта после ДанныеФормыВЗначение() без проверки типа, у незаписанного объекта. Метод УникальныйИдентификатор() есть только у ссылок и у объектов, у которых ссылка уже установлена.

Третья группа проблем — хранение UUID в реквизитах ограниченной длины. Строка UUID занимает 36 символов; если реквизит объявлен как Строка(32), идентификатор обрежется без предупреждения, и обратное преобразование станет невозможным. Для хранения используйте Строка(36) или неограниченную строку.

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

Проверка результата и выбор способа

После получения UUID полезно убедиться, что преобразование выполнено корректно: строка должна содержать ровно 36 символов, состоять из шестнадцатеричных цифр и четырёх дефисов в позициях 9, 14, 19 и 24. Простейшая проверка — обратное преобразование: создать из строки УникальныйИдентификатор и сравнить с исходным.

Выбор способа зависит от задачи. Для разового просмотра достаточно консоли кода или отладчика. Для интеграции — метод ссылки с приведением к строке и обязательной проверкой существования при обратном преобразовании. Для сверки баз — пакетная выгрузка пар «ключ — UUID» через запрос.

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

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

Длина строки UUID
Норма

36 символов, дефисы в позициях 9, 14, 19, 24

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

32 символа без дефисов или обрезанная строка

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

Новый УникальныйИдентификатор(Строка) равен исходному УИД

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

Исключение или другое значение

Существование объекта по UUID
Норма

ПолучитьОбъект() возвращает объект

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

Возвращается Неопределено — объект отсутствует

Итог

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

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

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

Можно ли получить UUID у несохранённого объекта?

Да, если сначала вызвать у объекта метод ПолучитьСсылкуНового() — платформа сгенерирует ссылку с UUID до записи. Если объект просто создан через СоздатьЭлемент() без этого вызова, ссылка и UUID появятся только после записи.

Меняется ли UUID при перенумерации или изменении реквизитов?

Нет. UUID присваивается один раз при создании объекта и не зависит от кода, номера, наименования и любых реквизитов. Он исчезает только вместе с физическим удалением объекта из базы.

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

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

Почему внешняя система не находит объект по UUID из 1С?

Чаще всего причины в регистре символов, лишних фигурных скобках или пробелах в строке, либо в том, что был передан внутренний формат из навигационной ссылки вместо стандартного UUID. Приведите строку к нижнему регистру и проверьте её формат.

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

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

Одинаковы ли UUID одного объекта в разных копиях базы?

Да, если копия сделана полным копированием базы — UUID сохраняются. Но если объект создавался заново в каждой базе независимо, идентификаторы будут разными даже при совпадении кодов и наименований.