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

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

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

Способы преобразовать уникальный идентификатор (GUID) в строку в 1С: функция XMLСтрока, оператор ВЫРАЗИТЬ в запросе, типовые приёмы и ошибки при сравнении и хранении.

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

Задача «выразить уникальный идентификатор как строку» возникает в трёх типовых сценариях: при написании запроса, где GUID нужно сравнить со строковым параметром; при обмене данными, когда идентификатор передаётся в XML, JSON или HTTP-запрос; при хранении ссылки на объект в реквизите строкового типа. Для каждого сценария есть свой корректный способ, и путать их нельзя.

Ниже разобраны все рабочие приёмы: функция XMLСтрока во встроенном языке, оператор ВЫРАЗИТЬ в языке запросов, получение GUID через свойство УникальныйИдентификатор() и обратное восстановление ссылки из строки. Отдельно рассмотрены ошибки, которые чаще всего приводят к «битым» ссылкам и несостыковкам при обмене.

Что представляет собой GUID в 1С и почему это не строка

Уникальный идентификатор — это 128-битное значение, которое платформа отображает в привычном виде: восемь шестнадцатеричных символов, дефис, четыре, дефис, четыре, дефис, четыре, дефис, двенадцать символов. Пример: a1b2c3d4-e5f6-7890-abcd-ef1234567890. Длина текстового представления — 36 символов.

Несмотря на то, что GUID выглядит как текст, тип «УникальныйИдентификатор» не является строкой. Попытка сложить его со строкой ("GUID: " + Ссылка.УникальныйИдентификатор()) вызовет ошибку преобразования, а сравнение GUID = "a1b2c3d4-..." всегда вернёт Ложь или ошибку в зависимости от контекста. Поэтому перед любой строковой операцией значение нужно явно привести к строке.

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

Преобразование GUID в строку во встроенном языке

Универсальный способ — функция XMLСтрока

Функция XMLСтрока(Значение) преобразует значение любого сериализуемого типа в его каноническое строковое представление. Для уникального идентификатора результатом будет строка из 36 символов в нижнем регистре. Это самый надёжный способ, потому что он работает не только с GUID, но и со ссылками, датами, булевыми значениями — удобно писать универсальные процедуры сериализации.

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

// Результат: "a1b2c3d4-e5f6-7890-abcd-ef1234567890"

Обратная функция — XMLЗначение(Тип("УникальныйИдентификатор"), СтрокаGUID) — восстанавливает значение типа «УникальныйИдентификатор» из строки. Пара XMLСтрока/XMLЗначение гарантирует симметричность: что сериализовали, то и десериализовали без потерь.

Прямое приведение через Строка()

Оператор Строка() тоже корректно преобразует уникальный идентификатор в текст. Результат совпадает с XMLСтрока — 36 символов с дефисами. Разница в том, что Строка() для ссылки вернёт представление объекта (например, «Поступление товаров 000001 от 12.03.2026»), а не GUID, поэтому сначала нужно получить сам идентификатор.

СтрокаGUID = Строка(ТекущаяСсылка.УникальныйИдентификатор());
bsl
// GUID -> Строка
СтрокаGUID = XMLСтрока(Ссылка.УникальныйИдентификатор());

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

// GUID -> Ссылка на объект
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(GUID);

Как выразить GUID как строку в запросе: оператор ВЫРАЗИТЬ

В языке запросов 1С нет прямой функции «GUID в строку», но есть оператор ВЫРАЗИТЬ(... КАК Строка(36)). Он позволяет привести поле ссылки или идентификатора к строковому типу. Классическая задача — сравнить ссылку со строковым параметром, полученным из внешней системы.

ВЫБРАТЬ

Номенклатура.Ссылка

ИЗ

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

ГДЕ

ВЫРАЗИТЬ(Номенклатура.Ссылка КАК Строка(36)) = &СтрокаGUID

У этого приёма есть важное ограничение: поведение ВЫРАЗИТЬ для ссылок зависит от версии платформы и СУБД. В ряде конфигураций приведение ссылки к строке возвращает не GUID, а внутреннее представление ссылки, и сравнение не срабатывает. Надёжнее передавать в запрос не строку, а саму ссылку или уникальный идентификатор.

Практическая рекомендация: если строка GUID пришла извне, преобразуйте её в ссылку до запроса и передавайте параметром уже ссылку. Сравнение ссылок в запросе работает быстро и использует индексы, тогда как ВЫРАЗИТЬ по строке отключает индексацию и на больших таблицах приводит к полному сканированию.

Обратное преобразование: из строки получить ссылку

Задача, обратная выражению GUID строкой, — восстановить объект по строковому идентификатору. Делается это в два шага: строка превращается в уникальный идентификатор, затем менеджер объекта возвращает ссылку по этому идентификатору.

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

СсылкаНаОбъект = Справочники.Номенклатура.ПолучитьСсылку(GUID);

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

// Объекта с таким GUID в базе нет

КонецЕсли;

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

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

Восстановление объекта по строке GUID
  1. 1
    Проверьте, что строка имеет длину 36 символов и содержит дефисы в позициях 9, 14, 19, 24
  2. 2
    Создайте идентификатор: GUID = Новый УникальныйИдентификатор(СтрокаGUID) в блоке Попытка/Исключение
  3. 3
    Получите ссылку: Ссылка = МенеджерОбъекта.ПолучитьСсылку(GUID)
  4. 4
    Проверьте существование объекта запросом по ссылке или через ПолучитьОбъект()
  5. 5
    Если объект не найден — зафиксируйте несоответствие в журнале обмена, не создавайте объект молча

Хранение GUID в строковых реквизитах

Иногда GUID объекта нужно сохранить в строковом реквизите — например, в регистре сведений соответствия объектов при обмене или в поле комментария. Здесь критичны два момента: длина реквизита и регистр символов.

Длина строкового реквизита должна быть не меньше 36 символов. Частая ошибка — реквизит длиной 25 или 32 символа: GUID обрезается, и обратное преобразование становится невозможным. Если реквизит уже создан и заполнен обрезанными значениями, данные восстановлению не подлежат — придётся заново сопоставлять объекты.

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

Типичные ошибки
01
Строковый реквизит короче 36 символов — GUID обрезается, обратное восстановление невозможно
02
Сравнение строк GUID без приведения регистра — совпадения не находятся из-за верхнего/нижнего регистра
03
Использование Строка(Ссылка) вместо Строка(Ссылка.УникальныйИдентификатор()) — сохраняется представление объекта, а не GUID
04
Сравнение GUID со строкой напрямую без преобразования типов — условие никогда не выполняется
05
ВЫРАЗИТЬ(Ссылка КАК Строка) в запросе на больших таблицах — полное сканирование и деградация производительности

GUID в обмене данными: XML, JSON и HTTP

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

В планах обмена и универсальных форматах (EnterpriseData, XML-обмен между конфигурациями 1С) платформа сериализует ссылки автоматически, и вручную преобразовывать GUID не требуется. Ручная работа со строковым представлением нужна только для нестандартных интеграций: REST API, обмен с сайтом, внешние учётные системы.

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

Способы преобразования GUID в строку

XMLСтрока(GUID)

Универсальный и предпочтительный: работает с любыми сериализуемыми типами, есть обратная пара XMLЗначение

Строка(GUID)

Простой вариант для одного типа; результат идентичен XMLСтрока, но нельзя применять напрямую к ссылке

ВЫРАЗИТЬ(... КАК Строка(36)) в запросе

Для сравнения внутри запроса; медленно на больших таблицах, поведение зависит от СУБД

Представление ссылки

Не подходит для идентификации: возвращает наименование и номер объекта, а не GUID

Проверка корректности строки GUID

Перед преобразованием строки в идентификатор полезно убедиться, что строка вообще является GUID. Минимальная проверка — длина 36 символов и дефисы на позициях 9, 14, 19 и 24. Строгая проверка — регулярное выражение или попытка создать значение с перехватом исключения.

Функция ЭтоGUID(Строка)

Если СтрДлина(Строка) <> 36 Тогда

Возврат Ложь;

КонецЕсли;

Попытка

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

Возврат Истина;

Исключение

Возврат Ложь;

КонецПопытки;

КонецФункции

Отдельный частный случай — пустой GUID: 00000000-0000-0000-0000-000000000000. Такое значение формально корректно, но обычно означает отсутствие ссылки. В логике обмена его стоит обрабатывать как пустое значение, а не пытаться найти объект.

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

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

Длина строки после XMLСтрока
Норма

Ровно 36 символов с дефисами

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

Меньше 36 — значение обрезано реквизитом или это не GUID

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

Новый УникальныйИдентификатор(Строка) выполняется без исключения

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

Ошибка преобразования — строка повреждена или не в формате GUID

Поиск объекта по ссылке
Норма

Запрос по ссылке возвращает одну запись с ожидаемым объектом

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

Пустой результат — объекта нет в базе или GUID из другой информационной базы

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

Чем XMLСтрока отличается от Строка() при работе с GUID?

Для значения типа «УникальныйИдентификатор» результат одинаков — строка из 36 символов. Разница проявляется с другими типами: Строка(Ссылка) вернёт представление объекта, а XMLСтрока(Ссылка) — сериализованное значение. Для универсального кода предпочтительнее XMLСтрока, так как у неё есть обратная функция XMLЗначение.

Можно ли в запросе сравнить GUID со строкой без ВЫРАЗИТЬ?

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

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

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

Внешняя система присылает GUID без дефисов, что делать?

Конструктор Новый УникальныйИдентификатор требует стандартный формат с дефисами. Строку из 32 символов нужно предварительно отформатировать: вставить дефисы после 8-го, 12-го, 16-го и 20-го символа, после чего выполнять преобразование обычным способом.

Меняется ли GUID объекта при перезаписи или обмене?

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

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

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

Итог

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

GUID в строку переводится функцией XMLСтрока или Строка(Ссылка.УникальныйИдентификатор()), обратно — конструктором Новый УникальныйИдентификатор и методом ПолучитьСсылку. В запросах избегайте ВЫРАЗИТЬ к строке на больших таблицах — передавайте ссылку параметром. Для хранения GUID нужен реквизит не короче 36 символов и единый регистр при сравнении.