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

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

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

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

Уникальный идентификатор (GUID) в 1С — это строка из 36 символов вида «b8f2a1c4-3d5e-4a6b-9c7d-2e8f1a0b3c4d», которая однозначно определяет объект базы данных: элемент справочника, документ, запись регистра. Он нужен при обмене данными между базами, интеграции с внешними системами, поиске «потерянных» объектов и отладке. В отличие от кода или номера, GUID никогда не меняется в течение жизни объекта и не повторяется у других объектов.

Задача «выразить как уникальный идентификатор» возникает в нескольких типовых ситуациях: нужно получить GUID имеющейся ссылки, восстановить ссылку по известному GUID, передать идентификатор во внешнюю систему через HTTP-сервис или файл обмена. Во встроенном языке 1С для этого есть штатные средства, и ниже разобраны все основные сценарии с готовым кодом.

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

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

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

Как получить GUID из ссылки во встроенном языке

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

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

Если ЗначениеЗаполнено(ТоварСсылка) Тогда

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

Сообщить(Строка(ГУИД)); // например: b8f2a1c4-3d5e-4a6b-9c7d-2e8f1a0b3c4d

КонецЕсли;

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

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

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| НЕ Номенклатура.ПометкаУдаления";

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

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

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

КонецЦикла;

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

Как по строке GUID получить ссылку на объект

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

Порядок действий
  1. 1
    Получите строку GUID, например из файла обмена или внешней системы
  2. 2
    Создайте значение: Новый УникальныйИдентификатор(СтрокаGUID)
  3. 3
    Вызовите Справочники.Номенклатура.ПолучитьСсылку(ГУИД) для нужного вида объекта
  4. 4
    Проверьте результат через Пустая() и через запрос на существование объекта
  5. 5
    При необходимости выполните НайтиПоРеквизиту или прямой запрос по Ссылка = &Ссылка
СтрокаГУИД = "b8f2a1c4-3d5e-4a6b-9c7d-2e8f1a0b3c4d";

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

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

// Проверка: существует ли объект в базе

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

Запрос.УстановитьПараметр("Ссылка", ТоварСсылка);

Если Запрос.Выполнить().Пустой() Тогда

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

КонецЕсли;

Тонкость в том, что ПолучитьСсылку() всегда возвращает ссылку, даже если объекта с таким GUID никогда не существовало — это будет «ссылка на несуществующий объект». Поэтому проверка существования через запрос обязательна, иначе при записи данных с такой ссылкой в базе появятся битые ссылки.

Как задать GUID новому объекту при загрузке данных

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

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

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

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

НовыйТовар.УстановитьСсылкуНового(НоваяСсылка);

НовыйТовар.Наименование = "Загруженный товар";

НовыйТовар.Записать();

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

Где посмотреть GUID без программирования

Разработчику или администратору GUID часто нужен разово, без написания обработки. Есть несколько практических способов. В конфигураторе через пункт «Сервис → Вывести список» можно вывести список объектов, но GUID там не показывается — поэтому надёжнее воспользоваться консолью кода (внешней обработкой) или стандартной командой «Получить ссылку» в форме объекта: в клиенте 1С по кнопке «Ещё → Получить ссылку» отображается навигационная ссылка вида e1cib/data/Справочник.Номенклатура?ref=b8f2..., где после «ref=» идёт GUID во внутреннем (переставленном) представлении.

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

Способы получить GUID

Кодом УникальныйИдентификатор()

Универсально и точно, подходит для обменов и интеграций; требует запуска кода или обработки

Кнопка «Получить ссылку» в форме

Быстро и без программирования, но GUID выводится во внутреннем формате с перестановкой байтов — для внешних систем его нужно преобразовать

Консоль запросов / внешняя обработка

Удобно для разового анализа и массового вывода; требует права на запуск внешних обработок

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

Типичные ошибки
01
Сравнение GUID как строк без приведения регистра и формата — внутреннее и каноническое представления не совпадают, сравнение даёт ложный результат
02
Использование ПолучитьСсылку() без проверки существования объекта — в базе появляются битые ссылки
03
Попытка получить GUID у несохранённого объекта без УстановитьСсылкуНового() — ссылка ещё не назначена, идентификатор пустой
04
Передача GUID из навигационной ссылки (после ref=) напрямую во внешнюю систему — это переставленный формат, внешняя система его не распознает
05
Смена GUID существующего объекта прямой правкой таблиц СУБД — нарушение целостности базы и рассинхронизация узлов обмена

Отдельно стоит помнить про ограничение типа: УникальныйИдентификатор нельзя хранить как реквизит произвольного объекта напрямую во всех конфигурациях — обычно его сохраняют в строковом реквизите длиной 36 символов. При поиске по такому реквизиту используйте точное совпадение строки и следите за регистром букв: разные системы могут возвращать GUID в верхнем или нижнем регистре.

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

Итог

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

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

Частые вопросы

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

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

Почему GUID из кнопки «Получить ссылку» не совпадает с тем, что выводит код?

В навигационной ссылке после «ref=» GUID записан во внутреннем формате платформы с переставленными группами байтов. Кодом Строка(Ссылка.УникальныйИдентификатор()) вы получаете канонический вид. Это один и тот же идентификатор в разных представлениях; для внешних систем используйте канонический.

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

Метод вернёт корректную ссылку нужного типа, но объект в базе отсутствовать не перестанет — это «ссылка на несуществующий объект». Проверяйте существование запросом по условию Ссылка = &Ссылка перед использованием.

Как найти все битые ссылки по GUID?

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

Можно ли использовать GUID как ключ поиска при обмене вместо кода?

Да, это рекомендуемая практика: код может совпадать у разных объектов и меняться, а GUID стабилен. Синхронизацию по GUID применяют в планах обмена и в типовых механизмах конвертации данных, а код используют как резервный критерий поиска.