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

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

Как преобразовать строку в уникальный идентификатор в 1С

Способы преобразования строки в уникальный идентификатор (GUID) в 1С: конструктор, XMLЗначение, получение ссылки по GUID. Примеры кода, ошибки и проверка результата.

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

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

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

Как устроен уникальный идентификатор в 1С

Тип «УникальныйИдентификатор» — примитивный тип платформы. Значение состоит из 32 шестнадцатеричных символов, сгруппированных дефисами по шаблону 8-4-4-4-12. Именно в таком виде GUID отображается при выводе, записывается в XML и JSON и передаётся через HTTP-сервисы.

Важно понимать различие между идентификатором и ссылкой. Уникальный идентификатор — это просто значение, «число». Ссылка — это типизированный объект, который указывает на конкретный элемент конкретного справочника или документа. Из одного и того же GUID можно получить ссылки на разные объекты, и платформа не запрещает это делать — проверка существования объекта выполняется отдельно.

Способ 1: конструктор Новый УникальныйИдентификатор

Самый прямой способ — передать строку в конструктор типа. Платформа разберёт строку и вернёт значение типа «УникальныйИдентификатор»:

СтрокаGUID = "a1b2c3d4-e5f6-7890-abcd-ef1234567890";

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

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

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

bsl
СтрокаGUID = "a1b2c3d4-e5f6-7890-abcd-ef1234567890";
Попытка
    Идентификатор = Новый УникальныйИдентификатор(СтрокаGUID);
Исключение
    Сообщить("Строка не является корректным GUID: " + ОписаниеОшибки());
КонецПопытки;

Способ 2: функция XMLЗначение

Универсальный вариант, удобный при разборе данных из XML, JSON и веб-сервисов, — глобальная функция XMLЗначение. Она принимает тип и строковое представление значения:

Идентификатор = XMLЗначение(Тип("УникальныйИдентификатор"), СтрокаGUID);

Преимущество подхода в том, что тот же механизм работает для дат, чисел, булевых значений и других сериализуемых типов — код разбора получается единообразным. Это особенно удобно в универсальных загрузчиках, где тип поля определяется динамически.

Обратное преобразование выполняется функцией XMLСтрока: она вернёт каноническое строковое представление идентификатора, пригодное для записи в файл обмена или передачи во внешнюю систему.

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

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

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

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

Метод не обращается к базе данных и не проверяет, существует ли объект. Он просто «собирает» типизированную ссылку из GUID. Если объекта с таким идентификатором нет, вы получите «битую ссылку» — обращение к её реквизитам вызовет ошибку. Поэтому после получения ссылки существование объекта проверяют отдельно.

Стандартный способ проверки — запрос или функция общего назначения ОбщегоНазначения.СсылкаСуществует в конфигурациях на БСП. Простой вариант без БСП:

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

"ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА

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

|ГДЕ Т.Ссылка = &Ссылка");

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

ОбъектСуществует = Не Запрос.Выполнить().Пустой();

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

Проблема порядка байтов при обмене с внешними системами

Классическая ловушка интеграций — GUID, записанный внешней системой (например, из SQL Server или .NET), не совпадает со строковым представлением того же идентификатора в 1С. Причина в том, что платформа 1С при преобразовании GUID в строку и обратно использует собственный порядок следования байтов, отличный от стандартного для ряда платформ.

Симптом выглядит так: объект в 1С точно существует, строка выглядит как корректный GUID, но поиск по ней ничего не находит, а сравнение идентификаторов даёт «ложь». В таком случае нужно переставить байты в первых трёх группах строки по зеркальному принципу, либо согласовать формат на стороне внешней системы.

Надёжный способ избежать проблемы — передавать между системами не сырые байты, а строковое представление, сформированное штатно: в 1С это Строка(Ссылка.УникальныйИдентификатор()) или XMLСтрока. Тогда обе стороны оперируют одним и тем же текстом, и вопрос порядка байтов не возникает.

Обратные преобразования и смежные задачи

Часто требуется обратная операция — получить строку из ссылки. Делается это в два шага: сначала из ссылки извлекается идентификатор методом УникальныйИдентификатор(), затем он приводится к строке:

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

// или

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

Отдельная задача — разбор навигационной ссылки вида «e1cib/data/Справочник.Номенклатура?ref=...». Значение параметра ref — это тот же GUID, но в шестнадцатеричном виде без дефисов и с переставленными байтами. Для преобразования его в привычный формат используют промежуточный тип «ДвоичныеДанные» и ручную перестановку, либо готовые функции из библиотек интеграции.

Сравнение способов преобразования

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

Простой и читаемый вариант для строки в каноническом формате. Требует обработки исключений.

XMLЗначение(Тип, Строка)

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

Менеджер.ПолучитьСсылку(GUID)

Даёт сразу ссылку на объект, но не проверяет его существование — нужна отдельная проверка.

Проверка корректности строки до преобразования

Чтобы не ловить исключения, строку можно предварительно проверить регулярным выражением или простым анализом длины и символов. В управляемых формах и на сервере доступен объект РегулярноеВыражение (в тонком клиенте его нет — там проверяют вручную): длина строки должна быть ровно 36 символов, дефисы — на позициях 9, 14, 19, 24, остальные символы — шестнадцатеричные цифры.

Альтернатива без регулярных выражений — обернуть конструктор в Попытка/Исключение и считать неуспех признаком некорректной строки. Это допустимый и самый короткий вариант, если преобразование выполняется не в массовом цикле: генерация исключений на больших объёмах данных заметно замедляет обработку.

Типичные ошибки
01
Передача в конструктор строки без дефисов или с фигурными скобками — получение исключения вместо значения
02
Использование ПолучитьСсылку без проверки существования — битые ссылки и ошибки при обращении к реквизитам
03
Игнорирование порядка байтов при обмене с SQL/.NET — объект не находится, хотя существует
04
Сравнение идентификаторов как строк с разным регистром или форматом — ложные результаты сравнения
05
Генерация нового GUID вместо поиска существующего — дубли объектов при повторной загрузке

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

Можно ли преобразовать в GUID строку без дефисов?

Штатный конструктор требует канонический формат с дефисами. Если строка пришла без дефисов, вставьте их программно на позиции 9, 14, 19 и 24 через функции Сред и конкатенацию, после чего используйте конструктор обычным образом.

Чем отличается УникальныйИдентификатор от ссылки?

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

Почему ПолучитьСсылку возвращает ссылку на несуществующий объект?

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

Как передать GUID во внешнюю систему без проблем с порядком байтов?

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

Как проверить, что строка — корректный GUID, без исключений?

Проверьте длину (36 символов), положение дефисов (позиции 9, 14, 19, 24) и что остальные символы — шестнадцатеричные цифры. На сервере можно использовать объект РегулярноеВыражение; в тонком клиенте — ручной посимвольный разбор.

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

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

Итог

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

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