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

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

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

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

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

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

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

Что такое уникальный идентификатор и где он хранится

В терминах платформы 1С:Предприятие уникальный идентификатор — это значение типа «УникальныйИдентификатор», соответствующее стандарту UUID (обычно версии 4, со случайной генерацией). В строковом виде он выглядит так: 8b3a4c2e-1f5d-4a6b-9c8d-2e7f1a3b5c6d — пять групп символов, разделённых дефисами.

Физически GUID хранится в таблице базы данных вместе со ссылкой на объект. На уровне СУБД (MS SQL, PostgreSQL) ссылка и идентификатор связаны: ссылка содержит в себе тип объекта и его GUID. Именно поэтому по идентификатору без указания типа объекта найти ссылку напрямую нельзя — нужно знать, к какой таблице (справочнику, виду документа) он относится.

Важно различать три сущности, которые часто путают:

  • Код — прикладной реквизит, может быть числовым или строковым, контролируется настройками нумерации и может меняться.
  • Номер документа — аналогично, прикладное значение, уникальность не гарантируется между периодами.
  • Уникальный идентификатор — системное значение, назначается платформой один раз и не меняется.

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

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

ТоварСсылка = Справочники.Номенклатура.НайтиПоКоду("000000123");

Если Не ТоварСсылка.Пустая() Тогда

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

Сообщить(Строка(ГУИД)); // например: 8b3a4c2e-1f5d-4a6b-9c8d-2e7f1a3b5c6d

КонецЕсли;

Если нужно массово выгрузить идентификаторы, удобно использовать запрос: у поля «Ссылка» в запросе доступен тот же метод через функцию языка запросов — точнее, идентификатор получают уже в обходе выборки, вызывая метод у значения поля Ссылка.

В пользовательском режиме без программирования GUID можно увидеть через «Все функции» → «Стандартные» → обработки выгрузки, либо через динамический список с добавленной колонкой, если конфигурация это позволяет. В типовых механизмах обмена идентификатор также отображается в регистрах соответствия объектов.

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

Если требуется сгенерировать GUID программно — например, для служебного ключа в регистре сведений, временной метки обмена или параметра внешней системы — используется конструктор:

НовыйГУИД = Новый УникальныйИдентификатор();      // случайный GUID

ГУИДИзСтроки = Новый УникальныйИдентификатор("8b3a4c2e-1f5d-4a6b-9c8d-2e7f1a3b5c6d");

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

Учтите: созданный вручную идентификатор сам по себе не связан ни с каким объектом базы. Он становится «настоящей» ссылкой только когда вы явно создаёте объект с заданным GUID (см. следующий раздел) или сохраняете его как значение реквизита.

Поиск объекта по идентификатору

Обратная задача — по строке GUID найти объект. Для этого у менеджера объекта есть метод ПолучитьСсылку(), которому передаётся значение типа «УникальныйИдентификатор»:

ГУИД = Новый УникальныйИдентификатор("8b3a4c2e-1f5d-4a6b-9c8d-2e7f1a3b5c6d");

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

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

Сообщить("Объект с таким GUID не найден (битая ссылка)");

Иначе

Сообщить("Найден: " + Ссылка);

КонецЕсли;

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

Также существуют два формата строкового представления GUID: стандартный (с дефисами) и «обратный» формат, который используется в COM-соединениях и некоторых механизмах обмена, — там байты переставлены. Если поиск по GUID не даёт результата, проверьте, не получена ли строка из OLE/COM-источника: её нужно предварительно преобразовать.

Создание объекта с заданным GUID

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

ГУИД = Новый УникальныйИдентификатор("8b3a4c2e-1f5d-4a6b-9c8d-2e7f1a3b5c6d");

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

НовыйЭлемент.УстановитьСсылкуНового(Справочники.Номенклатура.ПолучитьСсылку(ГУИД));

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

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

После такой записи объект будет иметь ровно тот GUID, который вы задали. Это рабочий способ устранения «битых ссылок»: выясняете GUID из текста ссылки-ошибки, создаёте объект-заглушку с этим идентификатором — и ссылки в документах снова становятся валидными.

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

Где GUID применяется на практике

Основные сценарии, в которых без уникального идентификатора не обойтись:

  • Планы обмена и РИБ. Платформа сопоставляет объекты узлов именно по GUID, если не настроены другие правила конвертации.
  • Интеграция по HTTP и веб-сервисам. Внешняя система хранит GUID объектов 1С как первичный ключ связи.
  • Регистры соответствия. В типовых механизмах синхронизации хранятся пары «GUID этой базы — ключ внешней системы».
  • Отладка и аудит. По GUID можно однозначно идентифицировать объект в журнале регистрации, технологическом журнале и логах обмена.
  • COM-соединения между базами. При передаче ссылок через COM идентификатор передаётся в специфическом формате и требует преобразования.

Чем идентифицировать объект

Код / номер

Подходит для поиска пользователем и печатных форм. Не гарантирует уникальность между базами и может меняться.

GUID ссылки

Подходит для обменов, интеграций и служебных связей. Не читаем человеком, требует знания типа объекта для поиска.

Свой реквизит с внешним ключом

Подходит, когда внешняя система задаёт свои ключи. Требует поддержки реквизита и индексов.

Типичные ошибки и ограничения

Работа с идентификаторами проста, но есть несколько ловушек, которые регулярно приводят к проблемам в обменах и интеграциях.

Типичные ошибки
01
Поиск объекта по GUID без учёта типа — получаете битую ссылку, хотя объект существует в другой таблице
02
Использование кода или номера как ключа синхронизации — при перенумерации связи между базами разваливаются
03
Игнорирование COM-формата GUID — строка с переставленными байтами не находит объект, и создаются дубли
04
Запись объекта с занятым GUID без проверки — риск конфликтов при последующих обменах
05
Хранение GUID как строки вместо типа УникальныйИдентификатор — лишние преобразования и ошибки сравнения

Ещё одно ограничение: GUID нельзя «вычислить» из наименования или кода — он случаен. Поэтому единственный способ узнать идентификатор объекта — прочитать его из базы. Если вы проектируете обмен, продумайте, как внешняя система будет получать GUID: через отдельный сервис, регистр соответствия или передачу вместе с данными объекта.

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

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

Получение GUID объекта
Норма

Метод вернул строку формата 8-4-4-4-12 символов

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

Пустая строка или ошибка — ссылка пустая или объект не записан

Поиск по GUID
Норма

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

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

Неопределено — неверный тип объекта или GUID из COM-формата

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

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

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

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

FAQ

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

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

Чем GUID отличается от «битой ссылки»?

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

Уникален ли GUID между разными информационными базами?

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

Как найти объект по GUID, если неизвестен его тип?

Прямого штатного метода нет. Варианты: перебрать менеджеры нужных видов объектов с вызовом ПолучитьСсылку и проверкой существования, либо выполнить запрос к СУБД напрямую (для анализа, не для записи). На больших базах перебор стоит ограничивать списком вероятных типов.

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

Да, тип «УникальныйИдентификатор» доступен для реквизитов справочников, документов и ресурсов регистров. Это удобно для хранения ключей внешних систем. Но помните: значение реквизита — это просто данные, оно не делает объект ссылкой с этим идентификатором.

Почему GUID из COM-соединения не находит объект?

При передаче через COM/OLE байты идентификатора переставляются, и строковое представление отличается от внутриплатформенного. Строку нужно преобразовать (переставить группы символов в обратном порядке внутри блоков) перед созданием УникальныйИдентификатор из неё.

Итог

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

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