Разработка и Конфигурация · 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 уже существует в базе, УстановитьСсылкуНового() не вызовет ошибки сама по себе, но запись приведёт к конфликту уникальности. Поэтому перед установкой ссылки принято проверять, не занят ли идентификатор.
- 1Получите строку GUID из внешней системы или сгенерируйте её
- 2Создайте значение: Новый УникальныйИдентификатор(СтрокаGUID)
- 3Проверьте, что ПолучитьСсылку(GUID) не указывает на существующий объект (метод ПолучитьОбъект вернёт Неопределено)
- 4Создайте объект, вызовите УстановитьСсылкуНового(НоваяСсылка)
- 5Заполните реквизиты и запишите объект
- 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 различны, и без настройки сопоставления по полям поиска вы получите дубли.
Можно ли изменить GUID существующего объекта
Штатными средствами встроенного языка — нет: у уже записанного объекта идентификатор неизменен. Если бизнес-задача требует «другого GUID» (например, объект создан с ошибочным идентификатором), единственный корректный путь — создать новый объект с нужным GUID, перенести в него данные и все ссылки из старого объекта, после чего старый удалить. Операция трудоёмкая: ссылки могут находиться в десятках таблиц, включая регистры и планы обмена.
Для поиска всех мест использования ссылки применяйте стандартную функцию НайтиПоСсылкам() — она возвращает таблицу всех объектов и записей, где встречается ссылка. Замену выполняйте в одной транзакции и обязательно на копии базы с последующей проверкой.
Как проверить результат
Строка(Ссылка.УникальныйИдентификатор()) совпадает с переданным значением
GUID отличается — объект создан без УстановитьСсылкуНового или запись не выполнилась
ПолучитьСсылку(GUID).ПолучитьОбъект() возвращает объект
Возвращается Неопределено — проверьте регистр символов и формат строки
НайтиПоСсылкам() по старой ссылке возвращает пустую таблицу
Остались объекты со старой ссылкой — замена не завершена
Часто задаваемые вопросы
Может ли GUID повториться в разных базах случайно?
Теоретически вероятность существует, но для 128-битных случайных идентификаторов она настолько мала, что в инженерной практике считается нулевой. На практике одинаковые GUID в разных базах встречаются только когда базы являются копиями друг друга или объекты создавались с явно заданным идентификатором.
Почему GUID в SQL-таблице не совпадает с тем, что показывает 1С?
Платформа хранит идентификатор с собственным порядком байтов внутри групп. Значение в поле _IDRRef — это то же самое число, но с переставленными байтами. Для сопоставления нужна функция-конвертер порядка байтов, либо работайте с GUID только через встроенный язык.
Что произойдёт с GUID при загрузке базы из копии?
Ничего: все идентификаторы сохраняются в неизменном виде. Именно поэтому копия базы опасна при работающем обмене — две живые базы с одинаковыми GUID начнут конфликтовать. Перед включением обмена из копии отключайте регистрацию изменений и узлы обмена.
Как узнать GUID объекта без доступа к конфигуратору?
Через любую внешнюю обработку, выводящую Ссылка.УникальныйИдентификатор(), либо через консоль кода, если она доступна в вашей роли. Также GUID виден в навигационной ссылке объекта, которую можно получить командой «Получить ссылку» в форме объекта.
Можно ли сгенерировать GUID заранее и использовать позже?
Да. Конструктор Новый УникальныйИдентификатор() без параметров создаёт случайный идентификатор, который можно сохранить (например, во внешней системе) и позже назначить объекту через УстановитьСсылкуНового. Это стандартный приём для интеграций, где внешняя система выступает мастер-системой.
Что важно запомнить
GUID в 1С присваивается платформой при записи объекта, неизменен в течение его жизни и служит ключом сопоставления при обмене данными. Разработчик может задать идентификатор явно через УстановитьСсылкуНового. Помните о различии строковых представлений в 1С и SQL и никогда не правьте GUID напрямую в таблицах базы.