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