Разработка и Конфигурация · 9 мин
Как создать уникальный идентификатор в 1С
Как создать уникальный идентификатор в 1С: функция Новый УникальныйИдентификатор, генерация GUID в запросах и обмене, типичные ошибки и проверка результата.
Уникальный идентификатор (GUID) в 1С — это 128-битное значение, которое платформа автоматически присваивает каждому объекту базы: документу, элементу справочника, записи регистра. Именно по GUID система связывает объекты при обмене данными между базами, поэтому умение создавать, получать и проверять идентификаторы нужно и разработчику, и администратору, обслуживающему интеграции.
Чаще всего задача сводится к одной из трёх ситуаций: сгенерировать новый GUID в коде, получить GUID существующего объекта по ссылке или восстановить ссылку по известному идентификатору. Все три сценария решаются штатными средствами встроенного языка без внешних компонентов.
Ниже разобраны конкретные методы с примерами кода, особенности работы в запросах и внешних системах, а также типичные ошибки, которые приводят к «битым» ссылкам и рассинхронизации обменов.
Что такое уникальный идентификатор в 1С и как он устроен
Уникальный идентификатор в платформе 1С соответствует стандарту GUID/UUID: это 32 шестнадцатеричных символа, сгруппированных дефисами в формате вида 5f4d3a2b-1c9e-4f8a-b7d6-2e3c4a5b6d7e. Вероятность совпадения двух случайно сгенерированных значений настолько мала, что коллизиями на практике пренебрегают.
Каждый ссылочный объект базы — элемент справочника, документ, узел плана обмена, задача — хранит свой GUID в системном поле. Именно этот идентификатор, а не код или номер, используется как глобальный ключ при выгрузке данных в другие информационные базы и внешние системы.
Важно понимать разницу между GUID ссылки и GUID объекта-значения. Ссылка — это «указатель» на объект в базе, и её идентификатор фиксирован на всю жизнь объекта. Значение типа УникальныйИдентификатор, созданное функцией, — просто данные, не привязанные ни к какой записи.
Как сгенерировать новый GUID в коде
Самый простой способ создать уникальный идентификатор — вызвать конструктор без параметров. Платформа сгенерирует случайное значение:
НовыйИД = Новый УникальныйИдентификатор();
Сообщить(Строка(НовыйИД)); // например, 8a3f2c1d-5e6b-4a9f-b8c7-1d2e3f4a5b6cКонструктор принимает и строковый параметр — тогда создаётся идентификатор с заданным значением. Это нужно, когда GUID приходит из внешней системы (файла обмена, веб-сервиса, JSON) и его требуется преобразовать в типизированное значение:
ИД = Новый УникальныйИдентификатор("5f4d3a2b-1c9e-4f8a-b7d6-2e3c4a5b6d7e");
Если переданная строка не соответствует формату GUID, платформа вызовет исключение. Поэтому при обработке внешних данных строку стоит либо проверять регулярным выражением, либо оборачивать преобразование в конструкцию Попытка...Исключение.
Как получить GUID существующего объекта
Для любой ссылки метод УникальныйИдентификатор() возвращает её идентификатор. Типичный пример — выгрузка товара в файл обмена:
ГУИДНоменклатуры = НоменклатураСсылка.УникальныйИдентификатор();
СтрокаГУИД = Строка(ГУИДНоменклатуры); // для записи в XML или JSON
Метод работает на тонком, толстом и веб-клиенте, а также на сервере, поэтому один и тот же код подходит для любого режима исполнения. Для несуществующих (пустых) ссылок метод вернёт идентификатор, состоящий из нулей.
Частая задача — получить GUID в запросе, например для выгрузки списка объектов. В языке запросов прямой функции нет, но идентификатор доступен как поле Ссылка с последующим вызовом метода уже в коде при обходе выборки:
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ГУИД = Выборка.Ссылка.УникальныйИдентификатор();
КонецЦикла;
Как восстановить ссылку по GUID
Обратное преобразование — из строки GUID в ссылку — выполняется методом ПолучитьСсылку() менеджера конкретного вида объекта. Это ключевой приём при загрузке данных из других баз:
ИД = Новый УникальныйИдентификатор(СтрокаИзФайла);
ТоварСсылка = Справочники.Номенклатура.ПолучитьСсылку(ИД);
Критически важный нюанс: ПолучитьСсылку() возвращает ссылку даже если объекта с таким GUID в базе нет. Проверить существование нужно отдельно — через запрос или проверкой на пустоту реквизита:
Если ТоварСсылка.ПолучитьОбъект() = Неопределено Тогда
// объекта с таким GUID нет — это "битая" ссылка
КонецЕсли;
Как создать объект с заданным GUID
Иногда требуется, чтобы объект в базе-приёмнике имел тот же идентификатор, что и в базе-источнике, — например, при ручной синхронизации справочников. Для этого новый объект создаётся, ему устанавливается ссылка с нужным GUID, и только после этого он записывается:
- 1Создайте объект: НовыйТовар = Справочники.Номенклатура.СоздатьЭлемент()
- 2Получите ссылку по нужному GUID: НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(ИД)
- 3Установите её объекту: НовыйТовар.УстановитьСсылкуНового(НоваяСсылка)
- 4Заполните реквизиты и вызовите НовыйТовар.Записать()
- 5Проверьте, что объект записался и его GUID совпадает с исходным
Если метод УстановитьСсылкуНового() не вызвать, платформа при записи назначит объекту собственный случайный GUID, и связь с источником потеряется. Если же ссылка с таким GUID уже существует в базе, запись нового объекта завершится ошибкой нарушения уникальности.
Особенности работы с GUID в обменах и внешних системах
При интеграции с внешними системами (сайтами, CRM, веб-сервисами) GUID передаётся в виде строки. Здесь важны два момента. Первый — регистр и формат: сторонние системы могут возвращать идентификатор без дефисов или в другом представлении, и строку нужно привести к стандартному виду перед созданием значения.
Второй момент — так называемый «COM-формат». При обмене через COM-соединение или в некоторых планах обмена GUID записывается с переставленными группами символов (побайтовый порядок). Если ссылка по GUID из внешней системы не находится, хотя объект точно существует, — почти наверняка проблема именно в несовпадении представлений.
Для отладки интеграций удобно завести обработку с двумя полями: в одно вставляется строка GUID, другое показывает найденную ссылку и её представление. Такая проверка за секунды показывает, битая ссылка это или ошибка формата.
Типичные ошибки и как их избежать
Отдельно стоит ошибка архитектурного плана: использование GUID как «человекочитаемого» ключа в отчётах и печатных формах. Идентификатор не предназначен для чтения пользователем — для этого есть коды, номера и наименования, а GUID должен оставаться служебным полем интеграций.
Как проверить результат
36 символов, 4 дефиса, шестнадцатеричные цифры
Нет дефисов, лишние символы, длина отличается
ПолучитьОбъект() возвращает объект
ПолучитьОбъект() возвращает Неопределено
GUID в источнике и приёмнике идентичны
Группы символов переставлены местами
FAQ
Можно ли изменить GUID уже записанного объекта?
Нет. Идентификатор ссылки назначается платформой один раз и не меняется. Если нужен объект с другим GUID, создают новый объект, устанавливают ему ссылку через УстановитьСсылкуНового() и переносят данные, а старый объект помечают на удаление.
Чем GUID отличается от кода справочника или номера документа?
Код и номер — пользовательские реквизиты, уникальные только внутри одной базы (и то не всегда). GUID генерируется платформой, не виден пользователю по умолчанию и уникален глобально, поэтому используется для связи объектов между разными базами и системами.
Почему ПолучитьСсылку() вернул ссылку, а объекта в базе нет?
Это штатное поведение: метод конструирует ссылку из GUID, не обращаясь к данным. Существование объекта проверяют отдельно — вызовом ПолучитьОбъект() (вернёт Неопределено) или запросом по ссылке.
Что означает ссылка «Объект не найден» с GUID в скобках?
Это «битая» ссылка: в каком-то реквизите хранится идентификатор объекта, который был физически удалён из базы. Такие ссылки ищут штатной проверкой ссылочной целостности и либо восстанавливают объект по GUID, либо очищают реквизит.
Можно ли сгенерировать GUID в запросе 1С?
Нет, язык запросов не имеет функции генерации идентификатора. GUID создаётся во встроенном языке функцией Новый УникальныйИдентификатор(), а в запросе доступно только чтение идентификатора уже выбранных ссылок при последующей обработке выборки в коде.
Что важно запомнить
Новый GUID создаётся функцией Новый УникальныйИдентификатор(), идентификатор объекта читается через Ссылка.УникальныйИдентификатор(), а обратное преобразование — через ПолучитьСсылку() с обязательной проверкой существования объекта. GUID существующей ссылки изменить нельзя, а при обменах с внешними системами проверяйте формат и порядок байтов идентификатора.