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

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

Как создать уникальный идентификатор в 1С

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

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

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

Ниже разобраны конкретные методы с примерами кода, особенности работы в запросах и внешних системах, а также типичные ошибки, которые приводят к «битым» ссылкам и рассинхронизации обменов.

Что такое уникальный идентификатор в 1С и как он устроен

Уникальный идентификатор в платформе 1С соответствует стандарту GUID/UUID: это 32 шестнадцатеричных символа, сгруппированных дефисами в формате вида 5f4d3a2b-1c9e-4f8a-b7d6-2e3c4a5b6d7e. Вероятность совпадения двух случайно сгенерированных значений настолько мала, что коллизиями на практике пренебрегают.

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

Важно понимать разницу между GUID ссылки и GUID объекта-значения. Ссылка — это «указатель» на объект в базе, и её идентификатор фиксирован на всю жизнь объекта. Значение типа УникальныйИдентификатор, созданное функцией, — просто данные, не привязанные ни к какой записи.

Как сгенерировать новый GUID в коде

Самый простой способ создать уникальный идентификатор — вызвать конструктор без параметров. Платформа сгенерирует случайное значение:

bsl
НовыйИД = Новый УникальныйИдентификатор();
Сообщить(Строка(НовыйИД)); // например, 8a3f2c1d-5e6b-4a9f-b8c7-1d2e3f4a5b6c

Конструктор принимает и строковый параметр — тогда создаётся идентификатор с заданным значением. Это нужно, когда GUID приходит из внешней системы (файла обмена, веб-сервиса, JSON) и его требуется преобразовать в типизированное значение:

ИД = Новый УникальныйИдентификатор("5f4d3a2b-1c9e-4f8a-b7d6-2e3c4a5b6d7e");

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

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

Для любой ссылки метод УникальныйИдентификатор() возвращает её идентификатор. Типичный пример — выгрузка товара в файл обмена:

ГУИДНоменклатуры = НоменклатураСсылка.УникальныйИдентификатор();

СтрокаГУИД = Строка(ГУИДНоменклатуры); // для записи в XML или JSON

Метод работает на тонком, толстом и веб-клиенте, а также на сервере, поэтому один и тот же код подходит для любого режима исполнения. Для несуществующих (пустых) ссылок метод вернёт идентификатор, состоящий из нулей.

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

Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура");

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

ГУИД = Выборка.Ссылка.УникальныйИдентификатор();

КонецЦикла;

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

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

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

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

Критически важный нюанс: ПолучитьСсылку() возвращает ссылку даже если объекта с таким GUID в базе нет. Проверить существование нужно отдельно — через запрос или проверкой на пустоту реквизита:

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

// объекта с таким GUID нет — это "битая" ссылка

КонецЕсли;

Как создать объект с заданным GUID

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

Порядок действий
  1. 1
    Создайте объект: НовыйТовар = Справочники.Номенклатура.СоздатьЭлемент()
  2. 2
    Получите ссылку по нужному GUID: НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(ИД)
  3. 3
    Установите её объекту: НовыйТовар.УстановитьСсылкуНового(НоваяСсылка)
  4. 4
    Заполните реквизиты и вызовите НовыйТовар.Записать()
  5. 5
    Проверьте, что объект записался и его GUID совпадает с исходным

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

Особенности работы с GUID в обменах и внешних системах

При интеграции с внешними системами (сайтами, CRM, веб-сервисами) GUID передаётся в виде строки. Здесь важны два момента. Первый — регистр и формат: сторонние системы могут возвращать идентификатор без дефисов или в другом представлении, и строку нужно привести к стандартному виду перед созданием значения.

Второй момент — так называемый «COM-формат». При обмене через COM-соединение или в некоторых планах обмена GUID записывается с переставленными группами символов (побайтовый порядок). Если ссылка по GUID из внешней системы не находится, хотя объект точно существует, — почти наверняка проблема именно в несовпадении представлений.

Для отладки интеграций удобно завести обработку с двумя полями: в одно вставляется строка GUID, другое показывает найденную ссылку и её представление. Такая проверка за секунды показывает, битая ссылка это или ошибка формата.
ПЗ
Практическое замечание

Типичные ошибки и как их избежать

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

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

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

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

Строка GUID
Норма

36 символов, 4 дефиса, шестнадцатеричные цифры

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

Нет дефисов, лишние символы, длина отличается

Ссылка по GUID
Норма

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

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

ПолучитьОбъект() возвращает Неопределено

Совпадение при обмене
Норма

GUID в источнике и приёмнике идентичны

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

Группы символов переставлены местами

FAQ

Можно ли изменить GUID уже записанного объекта?

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

Чем GUID отличается от кода справочника или номера документа?

Код и номер — пользовательские реквизиты, уникальные только внутри одной базы (и то не всегда). GUID генерируется платформой, не виден пользователю по умолчанию и уникален глобально, поэтому используется для связи объектов между разными базами и системами.

Почему ПолучитьСсылку() вернул ссылку, а объекта в базе нет?

Это штатное поведение: метод конструирует ссылку из GUID, не обращаясь к данным. Существование объекта проверяют отдельно — вызовом ПолучитьОбъект() (вернёт Неопределено) или запросом по ссылке.

Что означает ссылка «Объект не найден» с GUID в скобках?

Это «битая» ссылка: в каком-то реквизите хранится идентификатор объекта, который был физически удалён из базы. Такие ссылки ищут штатной проверкой ссылочной целостности и либо восстанавливают объект по GUID, либо очищают реквизит.

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

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

Итог

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

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