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

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

Как формируется GUID в 1С

Разбираем, как формируется GUID в 1С: алгоритм генерации, структура идентификатора, получение GUID объекта, обмен данными и типичные ошибки разработчиков.

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

Типичное представление GUID в 1С выглядит как строка вида b2c4e8a1-3f5d-4a6b-9c1e-7d8f2a5b3c4e — пять групп шестнадцатеричных символов, разделённых дефисами. Однако внутри платформы хранится не строка, а бинарное значение типа УникальныйИдентификатор, и строковое представление — лишь один из способов его отображения.

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

Что такое GUID в 1С и где он хранится

Каждый объект ссылочного типа (элемент справочника, документ, узел плана обмена и т.д.) при записи в базу получает уникальный идентификатор. В файловой базе он хранится в служебном поле таблицы, в клиент-серверном варианте — в поле _IDRRef соответствующей таблицы SQL Server или PostgreSQL. Для регистров сведений с режимом «независимый» и других нессылочных структур идентификатор формируется иначе — на основе комбинации измерений.

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

Как платформа генерирует GUID при создании объекта

Когда вызывается Справочники.Номенклатура.СоздатьЭлемент() и затем Записать(), платформа в момент записи присваивает новой ссылке GUID. Генерация основана на алгоритме, близком к UUID версии 4: значение формируется из случайных битов с установленными служебными разрядами версии и варианта. Теоретическая вероятность коллизии настолько мала, что в практических задачах ей пренебрегают.

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

НовыйGUID = Новый УникальныйИдентификатор("b2c4e8a1-3f5d-4a6b-9c1e-7d8f2a5b3c4e");

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

НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();

НовыйЭлемент.УстановитьСсылкуНового(НоваяСсылка);

НовыйЭлемент.Наименование = "Товар из внешней системы";

НовыйЭлемент.Записать();

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

Как создать объект с заданным GUID
  1. 1
    Получите строку GUID из внешней системы или сгенерируйте её
  2. 2
    Создайте значение: Новый УникальныйИдентификатор(СтрокаGUID)
  3. 3
    Проверьте, что ПолучитьСсылку(GUID) не указывает на существующий объект (метод ПолучитьОбъект вернёт Неопределено)
  4. 4
    Создайте объект, вызовите УстановитьСсылкуНового(НоваяСсылка)
  5. 5
    Заполните реквизиты и запишите объект
  6. 6
    Проверьте: Ссылка.УникальныйИдентификатор() совпадает с исходной строкой

Структура GUID и два строковых представления

Стандартный GUID состоит из пяти групп: 8-4-4-4-12 шестнадцатеричных символов. В стандарте UUID часть битов кодирует версию алгоритма и вариант. Однако 1С хранит идентификатор в памяти и в SQL в собственном порядке байтов, поэтому строка, которую вы видите в поле _IDRRef при прямом запросе к SQL, не совпадает со строкой, возвращаемой методом УникальныйИдентификатор().

Перестановка затрагивает порядок байтов внутри групп. Чтобы преобразовать «SQL-представление» в «1С-представление» и обратно, применяют специальные функции-конвертеры, которые меняют местами байты в группах. Если вы пишете интеграцию на уровне SQL-запросов (что само по себе не рекомендуется без крайней необходимости), без учёта этой перестановки ссылки просто не сойдутся.

Как получить GUID существующего объекта

Самый простой способ в коде — вызвать метод ссылки:

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

Если нужно найти объект по известному GUID (типичная задача при приёме данных из внешней системы), используется обратный приём — ПолучитьСсылку():

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

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

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

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

КонецЕсли;

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

Роль GUID в обмене данными и интеграциях

В планах обмена и типовых механизмах синхронизации (EnterpriseData, универсальный формат) сопоставление объектов двух баз выполняется именно по GUID. Когда объект выгружается из базы-источника, в сообщение попадает его идентификатор; база-приёмник сначала ищет объект по GUID, и только если не находит — по ключевым полям (наименование, ИНН и т.п.) в зависимости от настроек правил конвертации.

Из этого следуют два практических вывода. Первый: при развёртывании распределённой системы копированием базы GUID всех объектов совпадают, и синхронизация начинается «с чистого листа» без дублей. Второй: если в двух базах одинаковые по смыслу элементы создавались независимо, их GUID различны, и без настройки сопоставления по полям поиска вы получите дубли.

Типичные ошибки
01
Сравнение GUID со строкой без преобразования типов — условие никогда не выполняется, поиск ссылки молча не работает
02
Использование кода или номера вместо GUID в интеграции — после перенумерации или переноса данных связи разрушаются
03
Игнорирование перестановки байтов при чтении _IDRRef напрямую из SQL — найденные ссылки не совпадают с реальными объектами
04
Установка ссылки нового без проверки занятости GUID — конфликт уникальности при записи или перезапись чужих данных
05
Хранение GUID во внешней системе в разном регистре символов и сравнение без нормализации — ложные «не найдено»

Можно ли изменить GUID существующего объекта

Штатными средствами встроенного языка — нет: у уже записанного объекта идентификатор неизменен. Если бизнес-задача требует «другого GUID» (например, объект создан с ошибочным идентификатором), единственный корректный путь — создать новый объект с нужным GUID, перенести в него данные и все ссылки из старого объекта, после чего старый удалить. Операция трудоёмкая: ссылки могут находиться в десятках таблиц, включая регистры и планы обмена.

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

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

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

GUID созданного объекта
Норма

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

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

GUID отличается — объект создан без УстановитьСсылкуНового или запись не выполнилась

Поиск объекта по GUID из внешней системы
Норма

ПолучитьСсылку(GUID).ПолучитьОбъект() возвращает объект

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

Возвращается Неопределено — проверьте регистр символов и формат строки

Ссылки после замены объекта
Норма

НайтиПоСсылкам() по старой ссылке возвращает пустую таблицу

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

Остались объекты со старой ссылкой — замена не завершена

Часто задаваемые вопросы

Может ли GUID повториться в разных базах случайно?

Теоретически вероятность существует, но для 128-битных случайных идентификаторов она настолько мала, что в инженерной практике считается нулевой. На практике одинаковые GUID в разных базах встречаются только когда базы являются копиями друг друга или объекты создавались с явно заданным идентификатором.

Почему GUID в SQL-таблице не совпадает с тем, что показывает 1С?

Платформа хранит идентификатор с собственным порядком байтов внутри групп. Значение в поле _IDRRef — это то же самое число, но с переставленными байтами. Для сопоставления нужна функция-конвертер порядка байтов, либо работайте с GUID только через встроенный язык.

Что произойдёт с GUID при загрузке базы из копии?

Ничего: все идентификаторы сохраняются в неизменном виде. Именно поэтому копия базы опасна при работающем обмене — две живые базы с одинаковыми GUID начнут конфликтовать. Перед включением обмена из копии отключайте регистрацию изменений и узлы обмена.

Как узнать GUID объекта без доступа к конфигуратору?

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

Можно ли сгенерировать GUID заранее и использовать позже?

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

Итог

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

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