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

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

Уникальный идентификатор 1С (GUID) как строка: получение и преобразование

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

Уникальный идентификатор (GUID) в 1С — это 128-битное значение, которое платформа автоматически присваивает каждому объекту базы: элементу справочника, документу, записи регистра. Внутри системы он хранится в специальном типе УникальныйИдентификатор, но при обмене данными, интеграции с внешними системами и поиске в базе его почти всегда нужно представить в виде строки вида 12345678-1234-1234-1234-1234567890ab.

Проблема в том, что преобразование GUID в строку и обратно — не совсем симметричная операция. Строковое представление GUID, которое видит пользователь в 1С, отличается от представления, которое используется в SQL, COM-соединениях и сторонних системах, — порядок байтов в них разный. Путаница между этими форматами — одна из самых частых причин «невидимых» объектов при обмене.

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

Что такое GUID в 1С и зачем переводить его в строку

Каждая ссылка на объект базы данных в 1С содержит внутри себя уникальный идентификатор. Он генерируется платформой при создании объекта и не меняется в течение всей жизни объекта. Именно GUID позволяет однозначно находить объект в любой информационной базе, куда он был перенесён, — в отличие от кода или номера, которые могут совпадать в разных базах.

В строковый вид GUID переводят в нескольких типовых ситуациях: выгрузка данных в файлы XML и JSON, передача ссылок через веб-сервисы и HTTP-API, хранение связей между объектами разных систем, поиск объекта по идентификатору, полученному извне. Сам тип УникальныйИдентификатор нельзя напрямую записать в текстовый файл или передать через HTTP — нужна строка.

Как получить строку из GUID объекта

Стандартный способ — обратиться к методу УникальныйИдентификатор() ссылки и преобразовать результат в строку. Во встроенном языке это выглядит так:

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

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

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

Функция Строка() возвращает представление GUID в «привычном» виде: пять групп шестнадцатеричных символов через дефис. Именно этот формат ожидают большинство внешних систем и именно его видит пользователь, например, при просмотре ссылки через «Ещё → Вывести список» или в отладчике.

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

bsl
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    СтрокаGUID = Строка(Выборка.Ссылка.УникальныйИдентификатор());
КонецЦикла;

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

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

Попытка

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

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

Исключение

Сообщить("Некорректный GUID: " + ОписаниеОшибки());

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

Важно понимать: ПолучитьСсылку() не проверяет, существует ли объект с таким GUID в базе. Она просто формирует ссылку. Если объекта нет, вы получите «битую ссылку» — при обращении к её реквизитам возникнет ошибка. Проверка существования выполняется запросом к базе или сравнением с пустой ссылкой после попытки чтения.

Восстановление ссылки из строки GUID
  1. 1
    Очистите строку от пробелов и фигурных скобок функциями СокрЛП и СтрЗаменить
  2. 2
    Создайте идентификатор: Новый УникальныйИдентификатор(СтрокаGUID)
  3. 3
    Получите ссылку через МенеджерОбъекта.ПолучитьСсылку(Идентификатор)
  4. 4
    Проверьте существование объекта запросом или попыткой чтения реквизита

Различие форматов GUID в 1С, SQL и COM

Главный подводный камень темы — порядок байтов. Строковое представление GUID внутри 1С и представление того же идентификатора в SQL Server (или при чтении через COM) не совпадают. SQL хранит GUID с перевёрнутыми группами байтов в первых трёх секциях, поэтому строка из SQL-запроса не будет соответствовать строке, которую показывает 1С.

Из-за этого прямое сравнение GUID-строк из разных источников даёт ложный результат: объекты физически одни и те же, а строки разные. При интеграции с прямыми запросами к базе SQL нужно либо применять функции перекодировки порядка байтов, либо передавать идентификаторы только средствами платформы (через COM-коннектор, веб-сервисы, планы обмена), где преобразование выполняется автоматически.

Типовые сценарии использования GUID-строки

Обмен между базами 1С

При самописной выгрузке в XML или JSON GUID передают строкой, а на стороне загрузки ищут объект через ПолучитьСсылку(). Если объект не найден, типовое решение — создать новый элемент и принудительно установить ему ссылку с переданным GUID через УстановитьСсылкуНового(). Так сохраняется сквозная идентичность объектов в распределённых базах.

Интеграция с внешними системами

В HTTP-сервисах и API GUID обычно передаётся в URL или теле запроса как строка. На входе строку обязательно валидируют: проверяют длину 36 символов и допустимый алфавит (цифры, буквы a–f, дефисы), и только потом создают идентификатор. Это защищает от ошибок выполнения и попыток передать произвольные данные.

Поиск объекта по известному GUID

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

Способы передачи GUID между системами

Строка через XML/JSON

Универсально и читаемо; требует валидации формата на приёмной стороне

COM-соединение

GUID передаётся объектом без ручного преобразования; работает только между базами 1С в Windows

Планы обмена

Платформа сама сопоставляет GUID; подходит для регулярного обмена, избыточно для разовой выгрузки

Прямые SQL-запросы

Быстро на больших объёмах, но требует перекодировки байтов и обхода механизмов платформы

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

После обмена или загрузки убедитесь, что ссылки восстановились правильно. Самый надёжный способ — взять несколько объектов в базе-источнике, записать их GUID-строки и вручную сверить с тем, что получилось в базе-приёмнике. Совпадение строк означает корректную передачу.

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

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

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

Строка GUID после загрузки
Норма

Полностью совпадает со строкой в источнике

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

Совпадает частично или отличается порядок символов — перепутан формат байтов

Обращение к реквизитам ссылки
Норма

Реквизиты читаются без ошибок

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

Ошибка «Объект не найден» — битая ссылка

Количество элементов после обмена
Норма

Совпадает с источником

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

Появились дубли с одинаковыми наименованиями, но разными GUID

Частые ошибки при работе с GUID как строкой

Первая ошибка — использование строки GUID как бизнес-ключа, видимого пользователю. GUID не предназначен для чтения человеком; для нумерации и поиска пользователями существуют код и номер. Вторая — сравнение ссылок через строковое представление вместо прямого сравнения ссылок: это медленнее и чревато ошибками регистра символов.

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

Типичные ошибки
01
Сравнение GUID-строк из 1С и SQL без учёта порядка байтов — объекты «не находятся», создаются дубли
02
Вызов ПолучитьСсылку без проверки существования объекта — появляются битые ссылки
03
Передача в конструктор строки со скобками или пробелами — исключение в момент обмена
04
Поиск объекта по GUID перебором всех менеджеров без указания типа — сильная нагрузка на базу

FAQ

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

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

Почему GUID одного объекта в 1С и в SQL выглядит по-разному?

Потому что SQL Server хранит первые три группы байтов GUID в обратном порядке, а 1С показывает строковое представление в своём формате. Физически идентификатор один и тот же; для сопоставления нужна перекодировка порядка байтов.

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

Штатно — только через попытку создания: Новый УникальныйИдентификатор(Строка) внутри блока Попытка/Исключение. Предварительно можно проверить длину 36 символов и наличие дефисов в правильных позициях, чтобы отсечь явно неверные данные без исключений.

Что делать, если после обмена появились битые ссылки?

Битая ссылка означает, что GUID передан, а сам объект не загружен. Нужно проверить состав выгрузки: объект либо не попал в выборку, либо был отклонён при загрузке. После устранения причины обмен по этим объектам повторяют — ссылки восстановятся, так как GUID уже совпадает.

Можно ли искать объект по части GUID?

Нет, штатных средств поиска по фрагменту GUID нет — идентификатор используется только целиком. Если известна только часть строки, объект ищут по другим реквизитам: коду, номеру, наименованию.

Итог

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

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