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