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