Разработка и Конфигурация · 11 мин
Как создать GUID в 1С
Как создать GUID в 1С: метод УникальныйИдентификатор, генерация в запросе, коде и по ссылке. Примеры кода, проверка результата и типичные ошибки.
GUID (глобально уникальный идентификатор) в 1С — это 128-битное значение, которое однозначно определяет объект информационной базы: элемент справочника, документ, узел плана обмена и так далее. Встроенный язык предоставляет тип «УникальныйИдентификатор», и платформа сама следит за уникальностью значений, поэтому разработчику не нужно реализовывать алгоритм генерации вручную.
Чаще всего GUID создают для интеграции с внешними системами, сопоставления объектов между базами, формирования ключей в регистрах сведений и при обмене данными через веб-сервисы. Понимание того, как правильно получить, сгенерировать и сравнить идентификаторы, избавляет от массы трудноуловимых ошибок — от дублирования записей до «битых» связей между базами.
Ниже разобраны все практические способы: генерация нового GUID, получение идентификатора существующего объекта, создание идентификатора из строки, работа с GUID в запросах и типовые ошибки, которые допускают даже опытные разработчики.
Что такое GUID в 1С и где он используется
Уникальный идентификатор в 1С — это значение специального типа, которое записывается в виде строки из 36 символов: 32 шестнадцатеричные цифры, сгруппированные через дефисы, например 6f9619ff-8b86-d011-b42d-00cf4fc964ff. Каждая ссылка на объект базы данных имеет такой идентификатор, и именно он, а не код или номер, является настоящим первичным ключом записи в таблице SQL.
Практические сценарии, где без GUID не обойтись: обмен данными между базами 1С (по идентификаторам ищутся соответствия объектов), интеграция с сайтами и внешними сервисами, хранение связей в регистрах сведений, формирование уникальных имён временных файлов и ключей фоновых заданий. Важно понимать: GUID объекта присваивается платформой в момент создания ссылки и не меняется в течение всей жизни объекта.
Способ 1: генерация нового GUID в коде
Самый простой способ создать новый уникальный идентификатор — вызвать конструктор без параметров. Платформа сгенерирует случайное значение, гарантированно отличающееся от ранее созданных.
НовыйГУИД = Новый УникальныйИдентификатор;
Сообщить(Строка(НовыйГУИД));
// Пример вывода: a3f2c1d4-8e5b-4a9c-b7d2-1e6f8a0c3d5e
Конструктор также принимает строковый параметр — тогда GUID создаётся из заданной строки. Это нужно, когда идентификатор пришёл из внешней системы и его надо преобразовать в типизированное значение для сравнения или поиска:
ГУИДИзСтроки = Новый УникальныйИдентификатор("6f9619ff-8b86-d011-b42d-00cf4fc964ff");
Если передать строку в неверном формате, платформа выдаст ошибку преобразования. Поэтому при приёме идентификаторов из внешних источников стоит оборачивать вызов в попытку/исключение или предварительно проверять длину и состав строки.
НовыйГУИД = Новый УникальныйИдентификатор; // случайный GUID
ГУИДИзСтроки = Новый УникальныйИдентификатор("6f9619ff-8b86-d011-b42d-00cf4fc964ff");Способ 2: получить GUID существующего объекта
Когда идентификатор нужен не абстрактный, а конкретного элемента справочника или документа, используется метод УникальныйИдентификатор() ссылки. Он работает и на сервере, и на клиенте, не требуя получения объекта целиком — это важно для производительности.
ГУИДТовара = Справочники.Номенклатура.НайтиПоКоду("00000123").УникальныйИдентификатор();
СтрокаГУИД = Строка(ГУИДТовара); // для передачи во внешнюю систему
Обратная задача — найти объект по известному GUID — решается методом ПолучитьСсылку() менеджера соответствующего типа:
ГУИД = Новый УникальныйИдентификатор(СтрокаИзВнешнейСистемы);
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(ГУИД);
Если Ссылка.ПолучитьОбъект() = Неопределено Тогда
// Объект с таким GUID в базе отсутствует
КонецЕсли;
Учтите, что ПолучитьСсылку() вернёт ссылку даже для несуществующего объекта — проверка на существование выполняется отдельно, попыткой обращения к данным через ссылку.
Способ 3: GUID в запросе
В языке запросов 1С получить идентификатор ссылки можно функцией УНИКАЛЬНЫЙИДЕНТИФИКАТОР(). Это удобно при выгрузке данных для обмена, когда нужно выбрать GUID сразу для тысяч записей без обхода в цикле.
ВЫБРАТЬ
Товары.Ссылка КАК Ссылка,
УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Товары.Ссылка) КАК ГУИД
ИЗ
Справочник.Номенклатура КАК Товары
Обратная операция — поиск ссылки по GUID в запросе — напрямую не поддерживается: функции, обратной УНИКАЛЬНЫЙИДЕНТИФИКАТОР, в языке запросов нет. Если нужно сравнить ссылку с идентификатором из параметра, сначала преобразуйте строку в ссылку через ПолучитьСсылку() в коде, а уже ссылку передавайте в запрос параметром.
Сравнение способов создания и получения GUID
Выбор способа зависит от задачи: нужен новый идентификатор, идентификатор существующего объекта или преобразование строки. Таблица ниже помогает сориентироваться.
| Способ | Синтаксис | Когда применять |
|---|---|---|
| Конструктор без параметров | Новый УникальныйИдентификатор | Нужен новый случайный GUID для своих целей |
| Конструктор со строкой | Новый УникальныйИдентификатор("...") | GUID пришёл из внешней системы в виде строки |
| Метод ссылки | Ссылка.УникальныйИдентификатор() | Получить GUID существующего объекта базы |
| Функция запроса | УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Ссылка) | Массовая выгрузка идентификаторов в выборке |
Сравнение вариантов
Быстро и просто, но значение не связано ни с одним объектом базы — подходит для собственных ключей
Даёт постоянный идентификатор объекта; работает только для ссылочных типов
Оптимально для массовой выборки; не позволяет искать объект по GUID в обратную сторону
Практический пример: сопоставление объектов между базами
Типовая задача интеграции — хранить соответствие «наш объект ↔ GUID во внешней системе». Для этого обычно создают регистр сведений с измерением «Объект» и ресурсом «ИдентификаторВнешний» строкового типа. При выгрузке объекта его GUID сохраняется в регистр, при загрузке — по строке ищется ссылка.
Упрощённый фрагмент кода выглядит так:
// Сохранение соответствия
МенеджерЗаписи = РегистрыСведений.СоответствияОбъектов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Объект = СсылкаНаТовар;
МенеджерЗаписи.ИдентификаторВнешний = Строка(СсылкаНаТовар.УникальныйИдентификатор());
МенеджерЗаписи.Записать();
// Поиск по внешнему идентификатору
ГУИД = Новый УникальныйИдентификатор(СтрокаИзФайла);
НайденнаяСсылка = Справочники.Номенклатура.ПолучитьСсылку(ГУИД);
- 1Получите GUID объекта: Ссылка.УникальныйИдентификатор()
- 2Преобразуйте в строку для передачи: Строка(ГУИД)
- 3Передайте строку во внешнюю систему или сохраните в регистр сведений
- 4При обратном приёме создайте GUID из строки: Новый УникальныйИдентификатор(Строка)
- 5Найдите объект: Менеджер.ПолучитьСсылку(ГУИД) и проверьте его существование
Проверка результата и типичные ошибки
После генерации или преобразования GUID полезно убедиться, что значение корректно. Признаки правильного результата: строковое представление имеет длину 36 символов, содержит четыре дефиса в фиксированных позициях, а сравнение двух одинаковых идентификаторов оператором «=» даёт Истина. Пустой идентификатор имеет вид 00000000-0000-0000-0000-000000000000 — его появление обычно сигнализирует об ошибке в логике.
Наиболее частые ошибки при работе с GUID в 1С:
- попытка вызвать
УникальныйИдентификатор()у объекта, а не у ссылки — возникает ошибка «Метод объекта не обнаружен»; - сравнение GUID со строкой напрямую: типы разные, сравнение даст Ложь даже при совпадающем тексте — сначала преобразуйте строку через конструктор;
- использование
ПолучитьСсылку()без проверки существования объекта — ведёт к «битым ссылкам» в данных; - самостоятельная сборка GUID из случайных символов вместо конструктора — теряется гарантия уникальности и корректность формата;
- разный регистр букв в строковом представлении при сравнении строк с внешней системой — приводите обе стороны к одному регистру через
НРег().
Как проверить результат
36 символов, 4 дефиса, шестнадцатеричные цифры
Другая длина, лишние символы, пробелы
ГУИД1 = ГУИД2 даёт Истина для одинаковых значений
Сравнение со строкой всегда Ложь
Ссылка.ПолучитьОбъект() возвращает объект
Возвращается Неопределено — объекта нет в базе
Ограничения и нюансы
Тип «УникальныйИдентификатор» нельзя использовать как тип измерения регистра или реквизита напрямую в некоторых контекстах — чаще всего GUID хранят в строковом реквизите длиной 36 или 50 символов (с запасом на фигурные скобки, если внешняя система их добавляет). Также помните, что при обмене через COM-соединение GUID передаётся как строка и требует преобразования на принимающей стороне.
Ещё один нюанс касается планов обмена: при стандартной синхронизации платформа сама сопоставляет объекты по GUID, и ручное вмешательство в эти механизмы (например, принудительная установка идентификаторов через УстановитьСсылкуНового()) оправдано только при восстановлении соответствий после переноса данных. Необдуманное присвоение ссылок может нарушить целостность обмена.
При передаче GUID в HTTP-запросах и JSON используйте строковое представление в нижнем регистре без фигурных скобок — такой формат понимают большинство внешних систем, и не возникает расхождений при сравнении.
FAQ
Как создать GUID в 1С без привязки к объекту?
Вызовите конструктор без параметров: Новый УникальныйИдентификатор. Платформа сгенерирует случайное уникальное значение, которое можно хранить в строковом реквизите или использовать как ключ.
Как узнать GUID элемента справочника?
Получите ссылку на элемент (например, через НайтиПоКоду или НайтиПоНаименованию) и вызовите у неё метод УникальныйИдентификатор(). Для массовой выборки используйте функцию УНИКАЛЬНЫЙИДЕНТИФИКАТОР в запросе.
Можно ли найти объект по GUID из строки?
Да. Создайте идентификатор конструктором Новый УникальныйИдентификатор(СтрокаГУИД), затем вызовите Менеджер.ПолучитьСсылку(ГУИД) у нужного типа. Обязательно проверьте существование объекта, так как ссылка будет возвращена даже для отсутствующей записи.
Почему сравнение GUID со строкой возвращает Ложь?
Потому что «УникальныйИдентификатор» и «Строка» — разные типы, и оператор равенства не выполняет неявное преобразование. Преобразуйте строку в GUID конструктором или сам GUID в строку функцией Строка(), и только потом сравнивайте.
В каком реквизите хранить GUID в базе?
Тип «УникальныйИдентификатор» доступен для реквизитов, но на практике чаще используют строку длиной 36–50 символов: это упрощает обмен, индексацию и совместимость с внешними системами, которые могут добавлять фигурные скобки или другой регистр.
Меняется ли GUID объекта со временем?
Нет. Идентификатор присваивается ссылке при создании и остаётся неизменным до удаления объекта. Именно поэтому GUID надёжнее кода или номера для долгосрочного сопоставления объектов между системами.
Что важно запомнить
Новый GUID создаётся конструктором Новый УникальныйИдентификатор, идентификатор объекта — методом Ссылка.УникальныйИдентификатор(), поиск по строке — через ПолучитьСсылку() с обязательной проверкой существования. Сравнивайте GUID только с GUID, а строки — со строками.