Разработка и Конфигурация · 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 напрямую нельзя — запрос возвращает ссылку, а преобразование выполняется уже в коде при обходе результата. Это частое заблуждение у начинающих разработчиков.
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаGUID = Строка(Выборка.Ссылка.УникальныйИдентификатор());
КонецЦикла;Как получить GUID из строки и восстановить ссылку
Обратное преобразование выполняется конструктором Новый УникальныйИдентификатор(СтрокаGUID). Конструктор принимает строку строго в формате с дефисами — 36 символов. Если строка содержит лишние пробелы, фигурные скобки (часто встречаются в выгрузках из других систем) или неверное количество символов, будет вызвано исключение.
Попытка
Идентификатор = Новый УникальныйИдентификатор(СтрокаGUID);
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор);
Исключение
Сообщить("Некорректный GUID: " + ОписаниеОшибки());
КонецПопытки;
Важно понимать: ПолучитьСсылку() не проверяет, существует ли объект с таким GUID в базе. Она просто формирует ссылку. Если объекта нет, вы получите «битую ссылку» — при обращении к её реквизитам возникнет ошибка. Проверка существования выполняется запросом к базе или сравнением с пустой ссылкой после попытки чтения.
- 1Очистите строку от пробелов и фигурных скобок функциями СокрЛП и СтрЗаменить
- 2Создайте идентификатор: Новый УникальныйИдентификатор(СтрокаGUID)
- 3Получите ссылку через МенеджерОбъекта.ПолучитьСсылку(Идентификатор)
- 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 между системами
Универсально и читаемо; требует валидации формата на приёмной стороне
GUID передаётся объектом без ручного преобразования; работает только между базами 1С в Windows
Платформа сама сопоставляет GUID; подходит для регулярного обмена, избыточно для разовой выгрузки
Быстро на больших объёмах, но требует перекодировки байтов и обхода механизмов платформы
Проверка корректности преобразования
После обмена или загрузки убедитесь, что ссылки восстановились правильно. Самый надёжный способ — взять несколько объектов в базе-источнике, записать их GUID-строки и вручную сверить с тем, что получилось в базе-приёмнике. Совпадение строк означает корректную передачу.
Признаки проблемы: объект существует в обеих базах, но GUID различаются — значит, при загрузке был создан дубль вместо сопоставления. Либо ссылка есть, но обращение к реквизитам вызывает ошибку — это «битая ссылка», объект с таким GUID в базе отсутствует.
Как проверить результат
Полностью совпадает со строкой в источнике
Совпадает частично или отличается порядок символов — перепутан формат байтов
Реквизиты читаются без ошибок
Ошибка «Объект не найден» — битая ссылка
Совпадает с источником
Появились дубли с одинаковыми наименованиями, но разными GUID
Частые ошибки при работе с GUID как строкой
Первая ошибка — использование строки GUID как бизнес-ключа, видимого пользователю. GUID не предназначен для чтения человеком; для нумерации и поиска пользователями существуют код и номер. Вторая — сравнение ссылок через строковое представление вместо прямого сравнения ссылок: это медленнее и чревато ошибками регистра символов.
Третья типичная ошибка — попытка получить GUID несуществующей или пустой ссылки. У пустой ссылки GUID равен нулевому идентификатору 00000000-0000-0000-0000-000000000000, и его передача в обмен почти всегда означает дефект в логике выгрузки.
FAQ
Можно ли задать объекту свой GUID вручную?
Да, только для нового объекта до его записи: сначала создаётся ссылка через ПолучитьСсылку(Новый УникальныйИдентификатор(...)), затем она назначается методу УстановитьСсылкуНового(). Изменить GUID уже записанного объекта штатными средствами нельзя.
Почему GUID одного объекта в 1С и в SQL выглядит по-разному?
Потому что SQL Server хранит первые три группы байтов GUID в обратном порядке, а 1С показывает строковое представление в своём формате. Физически идентификатор один и тот же; для сопоставления нужна перекодировка порядка байтов.
Как проверить, что строка является корректным GUID?
Штатно — только через попытку создания: Новый УникальныйИдентификатор(Строка) внутри блока Попытка/Исключение. Предварительно можно проверить длину 36 символов и наличие дефисов в правильных позициях, чтобы отсечь явно неверные данные без исключений.
Что делать, если после обмена появились битые ссылки?
Битая ссылка означает, что GUID передан, а сам объект не загружен. Нужно проверить состав выгрузки: объект либо не попал в выборку, либо был отклонён при загрузке. После устранения причины обмен по этим объектам повторяют — ссылки восстановятся, так как GUID уже совпадает.
Можно ли искать объект по части GUID?
Нет, штатных средств поиска по фрагменту GUID нет — идентификатор используется только целиком. Если известна только часть строки, объект ищут по другим реквизитам: коду, номеру, наименованию.
Что важно запомнить
GUID переводится в строку через Строка(Ссылка.УникальныйИдентификатор()), обратно — через Новый УникальныйИдентификатор() и ПолучитьСсылку(). Всегда проверяйте существование объекта после восстановления ссылки и учитывайте разный порядок байтов GUID в 1С и SQL при прямых интеграциях.