Разработка и Конфигурация · 10 мин
Как получить GUID ссылки в 1С
Как получить GUID ссылки в 1С: метод УникальныйИдентификатор, обработки, код для 8.3, восстановление объекта по GUID и типичные ошибки.
GUID (глобальный уникальный идентификатор) ссылки в 1С — это 32-символьное шестнадцатеричное значение, которое однозначно идентифицирует объект базы данных: элемент справочника, документ, план обмена и другие ссылочные объекты. Знание GUID нужно при интеграции с внешними системами, при настройке обменов между базами, при поиске «битых» ссылок и при восстановлении удалённых объектов.
В отличие от кода или номера документа, GUID не виден пользователю в интерфейсе и не меняется на протяжении всей жизни объекта. Даже если переименовать элемент справочника или перенумеровать документ, идентификатор останется прежним. Именно поэтому GUID используется как надёжный ключ при синхронизации данных между разными информационными базами.
Получить GUID можно несколькими способами: штатным методом встроенного языка, через универсальные обработки, через запрос к базе или вычислением по внутреннему представлению ссылки. Ниже разобраны рабочие варианты с примерами кода, их ограничения и типичные ошибки.
Способ 1: метод УникальныйИдентификатор() во встроенном языке
Основной и рекомендуемый способ — вызов метода УникальныйИдентификатор() у любой ссылки. Он доступен во всех актуальных версиях платформы 1С:Предприятие 8.3 и работает как на клиенте, так и на сервере. Метод возвращает значение типа «УникальныйИдентификатор», которое для отображения или передачи во внешнюю систему преобразуют в строку.
Товар = Справочники.Номенклатура.НайтиПоКоду("000000123");
Если ЗначениеЗаполнено(Товар) Тогда
ГУИД = Строка(Товар.УникальныйИдентификатор());
Сообщить("GUID элемента: " + ГУИД);
КонецЕсли;
Результатом будет строка вида «8a3f5c2e-1b4d-4e6f-9a0b-1c2d3e4f5a6b». Именно в таком формате GUID обычно передают в веб-сервисы, планы обмена и внешние базы. Обратите внимание: метод вызывается именно у ссылки, а не у объекта. Если у вас есть объект данных (например, ДокументОбъект), сначала обратитесь к его свойству Ссылка.
Для массового получения идентификаторов удобнее использовать запрос — это снижает количество обращений к базе и ускоряет обработку больших списков. В запросе функция УникальныйИдентификатор недоступна напрямую, поэтому GUID получают уже после выборки, перебирая ссылки в цикле, либо через представление ссылки в СУБД.
Способ 2: получение GUID через запрос и обработку
Если нужно получить GUID сразу для многих объектов, выбирайте ссылки запросом, а идентификаторы вычисляйте в цикле. Это стандартная практика для выгрузок и интеграций.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ГУИД = Строка(Выборка.Ссылка.УникальныйИдентификатор());
// дальнейшая обработка: запись в таблицу, файл, HTTP-запрос
КонецЦикла;
Для разовых задач без программирования подойдут универсальные обработки, например консоль кода или обработки поиска объекта по GUID, которые распространяются в сообществе разработчиков. Такие инструменты позволяют ввести ссылку и сразу увидеть её идентификатор, либо наоборот — найти объект по строке GUID. Перед использованием любой внешней обработки проверяйте её совместимость с вашей версией платформы и конфигурацией.
Обратная задача: найти объект по GUID
Часто требуется не получить GUID, а наоборот — по известному идентификатору найти объект в базе. Для этого создают значение типа «УникальныйИдентификатор» из строки и передают его методу ПолучитьСсылку() соответствующего менеджера (справочника, документа и т.д.).
СтрокаГУИД = "8a3f5c2e-1b4d-4e6f-9a0b-1c2d3e4f5a6b";
Идентификатор = Новый УникальныйИдентификатор(СтрокаГУИД);
СсылкаНаТовар = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор);
Если СсылкаНаТовар.ПолучитьОбъект() = Неопределено Тогда
Сообщить("Объект с таким GUID не найден или удалён");
Иначе
Сообщить("Найден: " + СсылкаНаТовар);
КонецЕсли;
Критически важный момент: ПолучитьСсылку() возвращает ссылку всегда, даже если объекта с таким GUID в базе нет. Поэтому существование объекта проверяют отдельно — попыткой получить объект через ПолучитьОбъект() или запросом к реквизиту ссылки. Пропуск этой проверки — одна из самых частых причин появления «битых» ссылок и ошибок в интеграциях.
Если тип объекта заранее неизвестен (GUID мог принадлежать любому справочнику или документу), перебирают менеджеры нужных типов метаданных в цикле, либо используют сериализацию ссылки через ЗначениеВСтрокуВнутр() и сравнение внутреннего представления.
- 1Определите тип объекта, которому принадлежит GUID (справочник, документ и т.д.)
- 2Создайте идентификатор: Новый УникальныйИдентификатор(СтрокаГУИД)
- 3Получите ссылку: Менеджер.ПолучитьСсылку(Идентификатор)
- 4Проверьте существование объекта через ПолучитьОбъект() или запрос
- 5При отсутствии объекта зафиксируйте ошибку, а не создавайте объект молча
GUID и внутреннее представление ссылки
В файловых и клиент-серверных базах ссылка хранится в виде внутреннего двоичного значения, из которого GUID можно извлечь программно. Этим пользуются, когда нужно сопоставить данные на уровне СУБД или восстановить ссылку из «битого» значения вида «Объект не найден (123:aabbccdd...)».
Строка «битой» ссылки содержит GUID в переставленном виде: байты идентификатора записаны в обратном порядке по группам. Существуют известные алгоритмы преобразования такого шестнадцатеричного представления обратно в стандартный GUID. Это позволяет восстановить идентификатор удалённого объекта и, например, создать новый объект с тем же GUID через УстановитьСсылкуНового() — такой приём применяют при восстановлении данных, когда на удалённый объект ссылаются другие записи.
Где GUID используется на практике
Наиболее частый сценарий — обмен данными между базами 1С или с внешними системами: сайтом, CRM, складским ПО. В планах обмена GUID служит ключом сопоставления объектов, поэтому при настройке синхронизации важно, чтобы идентификаторы передавались без искажений — в виде строки стандартного формата.
Второй сценарий — диагностика. Когда в отчёте или журнале регистрации видна «битая» ссылка, по её внутреннему представлению вычисляют GUID и выясняют, какой именно объект был удалён. Третий сценарий — интеграционные API: многие HTTP-сервисы на базе 1С принимают и возвращают именно GUID, поскольку коды и номера могут повторяться или меняться.
Сравнение вариантов
Универсальный штатный способ; требует возможности выполнить код или добавить его в конфигурацию
Быстро для разовых задач без программирования; нужно проверять совместимость и источник обработки
Единственный вариант для «битых» ссылок и работы на уровне СУБД; требует аккуратности и понимания формата
Типичные ошибки при работе с GUID
Первая ошибка — попытка получить GUID у объекта, а не у ссылки. У ДокументОбъект метода УникальныйИдентификатор() нет, нужно обращаться к Объект.Ссылка.УникальныйИдентификатор(). Вторая ошибка — отсутствие проверки существования объекта после ПолучитьСсылку(), из-за чего в данные записываются ссылки на несуществующие объекты.
Третья ошибка — неверный формат строки при создании идентификатора. Конструктор Новый УникальныйИдентификатор() принимает только строку стандартного вида с дефисами; строка без дефисов или с лишними символами вызовет исключение. Четвёртая ошибка — предположение, что одинаковые наименования или коды в разных базах означают одинаковые GUID: при независимом создании объектов идентификаторы будут разными, и сопоставлять их нужно через план обмена или таблицу соответствий.
Проверка результата
После получения GUID убедитесь, что строка имеет длину 36 символов и формат 8-4-4-4-12 с дефисами. Для обратной проверки выполните поиск объекта по полученному GUID: если объект найден и совпадает с исходным, идентификатор получен корректно.
При массовой выгрузке сверяйте количество выгруженных GUID с количеством обработанных ссылок и проверяйте отсутствие пустых значений. Пустая строка вместо GUID обычно означает, что в цикл попало значение «Неопределено» или пустая ссылка.
Как проверить результат
36 символов, группы 8-4-4-4-12 через дефисы
Другая длина, нет дефисов, нешестнадцатеричные символы
По GUID находится именно исходный объект
Объект не найден или найден другой объект
Количество GUID равно количеству ссылок, пустых нет
Пустые строки, дубли, расхождение счётчиков
Что важно запомнить
GUID получают методом Ссылка.УникальныйИдентификатор(), обратный поиск делают через Новый УникальныйИдентификатор() и ПолучитьСсылку() с обязательной проверкой существования объекта. Операции восстановления по GUID выполняйте только на копии базы.
Частые вопросы
Можно ли увидеть GUID объекта без программирования?
Штатными средствами типового интерфейса — нет. Используйте внешнюю обработку поиска по GUID, консоль кода или попросите разработчика вывести идентификатор в дополнительный реквизит формы.
Меняется ли GUID при изменении объекта?
Нет. Идентификатор присваивается один раз при создании объекта и не меняется при редактировании, переименовании или перенумерации. GUID исчезает вместе с физическим удалением объекта из базы.
Одинаковы ли GUID у объекта в разных копиях базы?
Да, если копия получена резервным копированием или загрузкой выгрузки — идентификаторы сохраняются. Но если объект создавался заново в каждой базе независимо, его GUID будут разными даже при совпадающих наименовании и коде.
Что делать, если ПолучитьСсылку() вернула ссылку, но объекта нет?
Это нормальное поведение метода. Проверьте существование через ПолучитьОбъект() (вернёт Неопределено) или запросом по ссылке. Если объект нужно восстановить, создайте новый объект и привяжите его к этой ссылке через УстановитьСсылкуНового() — только на копии базы.
Как получить GUID из строки «Объект не найден»?
Внутри такой строки после двоеточия записано шестнадцатеричное внутреннее представление ссылки. Его преобразуют в стандартный GUID перестановкой байтов по известному алгоритму — готовые функции доступны в типовых инструментах разработчика и публикациях сообщества.