Разработка и Конфигурация · 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 или сохранить в текстовое поле, нужно явно привести его к строке через Строка() или использовать сериализацию.
Обратите внимание: метод вызывается у ссылки, поэтому сначала нужно получить саму ссылку — через поиск по коду, наименованию, запросом или из реквизита другого объекта. У несохранённого объекта (созданного, но не записанного) ссылка уже существует, если вызвать ПолучитьСсылкуНового(), либо появится после записи.
УИД = СсылкаНаОбъект.УникальныйИдентификатор();
СтрокаУИД = Строка(УИД);Как получить ссылку обратно из строки UUID
Обратная задача возникает при обработке данных из внешних систем: есть строка с UUID, нужно найти объект в базе. Для этого создают значение типа УникальныйИдентификатор из строки, а затем получают ссылку через метод ПолучитьСсылку() менеджера соответствующего типа.
СтрокаУИД = "a1b2c3d4-e5f6-7890-abcd-ef1234567890";
УИД = Новый УникальныйИдентификатор(СтрокаУИД);
ТоварСсылка = Справочники.Номенклатура.ПолучитьСсылку(УИД);
Если ТоварСсылка.ПолучитьОбъект() = Неопределено Тогда
Сообщить("Объект с таким UUID не найден");
КонецЕсли;
Критический момент: ПолучитьСсылку() всегда возвращает ссылку, даже если объекта с таким UUID в базе нет. Поэтому результат обязательно проверяют — либо попыткой получить объект, либо запросом на существование. Если этого не сделать, в базе появятся «битые ссылки» вида «Объект не найден».
Если строка UUID пришла в верхнем регистре или с фигурными скобками (как в некоторых внешних системах), перед конструктором её нужно нормализовать: убрать скобки и привести к нижнему регистру. Конструктор Новый УникальныйИдентификатор() к регистру нетребователен, но лишние символы вызовут исключение.
Получение UUID в запросе и консоли запросов
В языке запросов нет прямой функции для получения UUID, но ссылку из запроса можно передать в код и уже там вызвать метод. Это стандартный приём при пакетной обработке:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ ПометкаУдаления = ЛОЖЬ";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Строка(Выборка.Ссылка.УникальныйИдентификатор()));
КонецЦикла;
Если нужно быстро узнать UUID одного объекта без написания обработки, удобно использовать консоль кода (встроенную в некоторые конфигурации или внешние инструменты разработчика): открыть объект, скопировать ссылку и выполнить одну строку кода. Это быстрее, чем писать запрос, когда речь о разовой проверке.
Для массовой выгрузки UUID в файл (например, для сверки двух баз) эффективнее выгружать пары «код — UUID» через запрос и запись в текстовый или JSON-файл, а не обходить объекты по одному через ПолучитьОбъект() — это существенно быстрее на больших таблицах.
- 1Получите ссылку на объект поиском по коду, наименованию или запросом
- 2Вызовите Ссылка.УникальныйИдентификатор() и приведите результат к строке
- 3Передайте строку во внешнюю систему или сохраните в реквизит обмена
- 4При обратном приёме создайте УникальныйИдентификатор из строки и получите ссылку через менеджер типа
- 5Проверьте существование объекта перед использованием ссылки
UUID из навигационной ссылки и внешних источников
В тонком и веб-клиенте у каждого открытого объекта есть навигационная ссылка вида e1cib/data/Справочник.Номенклатура?ref=80e1005056e5e2d811ef.... Шестнадцатеричное значение после ref= — это тот же идентификатор, но в специальном внутреннем формате платформы, а не в стандартном виде UUID.
Преобразование между внутренним форматом и стандартным UUID выполняется перестановкой байтов: группы в строке ref записаны в обратном порядке. Встроенной функции для этого нет, поэтому используют небольшую процедуру разбора строки. Альтернатива — функция ПолучитьНавигационнуюСсылку() для обратного направления, если нужно сформировать ссылку на объект для пользователя.
При работе через COM-соединение (V83.COMConnector) логика та же: у объекта ссылки, полученного через COM, доступен метод УникальныйИдентификатор(), возвращающий строку. Это удобно для сверки объектов между двумя базами без промежуточных файлов.
Типичные ошибки при работе с UUID
Первая распространённая ошибка — сравнение UUID как строк без учёта регистра. Внешняя система может вернуть идентификатор в верхнем регистре, а 1С хранит строковое представление в нижнем. Перед сравнением строки приводят к одному регистру функцией НРег().
Вторая ошибка — попытка получить UUID у значения, которое не является ссылкой: у структуры, у объекта после ДанныеФормыВЗначение() без проверки типа, у незаписанного объекта. Метод УникальныйИдентификатор() есть только у ссылок и у объектов, у которых ссылка уже установлена.
Третья группа проблем — хранение UUID в реквизитах ограниченной длины. Строка UUID занимает 36 символов; если реквизит объявлен как Строка(32), идентификатор обрежется без предупреждения, и обратное преобразование станет невозможным. Для хранения используйте Строка(36) или неограниченную строку.
Проверка результата и выбор способа
После получения UUID полезно убедиться, что преобразование выполнено корректно: строка должна содержать ровно 36 символов, состоять из шестнадцатеричных цифр и четырёх дефисов в позициях 9, 14, 19 и 24. Простейшая проверка — обратное преобразование: создать из строки УникальныйИдентификатор и сравнить с исходным.
Выбор способа зависит от задачи. Для разового просмотра достаточно консоли кода или отладчика. Для интеграции — метод ссылки с приведением к строке и обязательной проверкой существования при обратном преобразовании. Для сверки баз — пакетная выгрузка пар «ключ — UUID» через запрос.
Как проверить результат
36 символов, дефисы в позициях 9, 14, 19, 24
32 символа без дефисов или обрезанная строка
Новый УникальныйИдентификатор(Строка) равен исходному УИД
Исключение или другое значение
ПолучитьОбъект() возвращает объект
Возвращается Неопределено — объект отсутствует
Что важно запомнить
UUID получают методом Ссылка.УникальныйИдентификатор() и приводят к строке через Строка(). Обратно ссылку создают через Новый УникальныйИдентификатор(Строка) и ПолучитьСсылку() с обязательной проверкой существования объекта. Строка из навигационной ссылки — не готовый UUID, а внутренний формат с другим порядком байтов.
Частые вопросы
Можно ли получить UUID у несохранённого объекта?
Да, если сначала вызвать у объекта метод ПолучитьСсылкуНового() — платформа сгенерирует ссылку с UUID до записи. Если объект просто создан через СоздатьЭлемент() без этого вызова, ссылка и UUID появятся только после записи.
Меняется ли UUID при перенумерации или изменении реквизитов?
Нет. UUID присваивается один раз при создании объекта и не зависит от кода, номера, наименования и любых реквизитов. Он исчезает только вместе с физическим удалением объекта из базы.
Как найти объект по UUID, если неизвестен его тип?
Нужно перебрать менеджеры ссылочных типов (справочники, документы и т.д.) и для каждого выполнить ПолучитьСсылку(УИД) с проверкой существования. Это медленно на больших базах, поэтому при интеграциях тип объекта обычно передают вместе с UUID.
Почему внешняя система не находит объект по UUID из 1С?
Чаще всего причины в регистре символов, лишних фигурных скобках или пробелах в строке, либо в том, что был передан внутренний формат из навигационной ссылки вместо стандартного UUID. Приведите строку к нижнему регистру и проверьте её формат.
Можно ли задать объекту нужный UUID вручную?
Да: создайте ссылку через ПолучитьСсылку(Новый УникальныйИдентификатор(Строка)), затем установите её новому объекту методом УстановитьСсылкуНового() и запишите. Так делают при синхронизации, чтобы идентификаторы в двух базах совпадали.
Одинаковы ли UUID одного объекта в разных копиях базы?
Да, если копия сделана полным копированием базы — UUID сохраняются. Но если объект создавался заново в каждой базе независимо, идентификаторы будут разными даже при совпадении кодов и наименований.