Уникальный идентификатор ссылки в 1С 8.3: где его найти и как с ним работать

· 9 мин

Содержание

Быстрее всего посмотреть GUID объекта в 1С через отладчик: остановитесь на любой строке модуля формы и вычислите выражение Строка(Объект.Ссылка.УникальныйИдентификатор()). Без отладчика тот же идентификатор есть в навигационной ссылке: откройте элемент, в меню формы выберите «Получить ссылку», и в строке вида e1cib/data/Справочник.Контрагенты?ref=... после ref= будет 32-значный код объекта.

Нюанс в том, что код в навигационной ссылке записан не в привычном виде xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, а с переставленными группами — так, как он хранится в базе данных. Ниже — все способы: от интерфейса пользователя до SQL, с готовыми фрагментами кода на встроенном языке.

GUID в 1С: что это за идентификатор и у каких объектов он есть

GUID (в 1С — «уникальный идентификатор», тип УникальныйИдентификатор) — это 128-битное число, которое платформа присваивает каждому ссылочному объекту при записи. Пишется как 36 символов: 32 шестнадцатеричные цифры и 4 дефиса.

Пример: 5f3c9a12-8b7e-11ee-b962-0242ac120002.

GUID есть у всех объектов, у которых есть Ссылка:

  • 📁 элементы и группы справочников;
  • 📄 документы;
  • 📊 планы видов характеристик, планы счетов, планы видов расчёта;
  • 🔄 узлы планов обмена;
  • ✅ бизнес-процессы и задачи.

У записей регистров сведений, накопления и бухгалтерии GUID нет: их строки определяются набором измерений и регистратором, а не собственной ссылкой.

Зачем знать идентификатор на практике:

  • 🔗 сопоставить один и тот же объект в двух базах при обмене;
  • 🧩 передать ссылку во внешнюю систему (сайт, CRM, мобильное приложение);
  • 🛠 найти «битую» ссылку <Объект не найден> и понять, на что она указывала;
  • 🗄 найти строку объекта в таблице СУБД при разборе проблем.

Наименование, код и номер документа могут меняться и повторяться. GUID не меняется за всю жизнь объекта, поэтому для связи между системами берут именно его.

Как посмотреть GUID объекта в режиме Предприятия без программирования

Пользователь без прав на Конфигуратор может получить идентификатор через навигационную ссылку.

  1. Откройте карточку нужного элемента или документа.
  2. В заголовке формы нажмите кнопку меню формы (значок с тремя точками или «Ещё»).
  3. Выберите команду «Получить ссылку». Откроется окно со строкой ссылки.
  4. Скопируйте строку. Она выглядит так:
e1cib/data/Справочник.Контрагенты?ref=b9620242ac12000211ee8b7e5f3c9a12

Всё, что после ref=, — это GUID объекта в формате хранения. Дефисов нет, а группы цифр стоят в другом порядке.

Как перевести код из ссылки в обычный GUID

Возьмите 32 символа после ref= и разбейте их на пять частей по длине: 4, 12, 4, 4, 8. Затем соберите в обратном порядке.

Часть в ref=ДлинаПримерКуда идёт в GUID
14b9624-я группа
2120242ac1200025-я группа
3411ee3-я группа
448b7e2-я группа
585f3c9a121-я группа

Результат: 5f3c9a12-8b7e-11ee-b962-0242ac120002.

Обратная операция тоже работает: ссылку можно вставить в окно перехода по ссылке в главном меню программы, и платформа откроет объект. Это удобно, когда коллега прислал вам ссылку в мессенджере.

Навигационная ссылка содержит только идентификатор и тип объекта, имени базы в ней нет. Ссылка из рабочей базы, открытая в копии, приведёт к тому же объекту, если в копии он есть.

Как узнать GUID через отладчик

Отладчик — самый быстрый способ для разработчика. Нужен доступ к Конфигуратору или к среде EDT.

Подготовка

  1. Запустите базу в режиме отладки из Конфигуратора: меню Отладка → Начать отладку, клиент выберите по ситуации.
  2. Если сеанс уже открыт, подключите его к отладчику: в клиентском приложении включите отладку в текущем сеансе в параметрах системы, затем в Конфигураторе подключитесь через Отладка → Подключение.

Получение идентификатора

  1. Откройте в модуле формы объекта любой обработчик, который точно сработает, например ПриОткрытии или обработчик кнопки.
  2. Поставьте точку останова (F9).
  3. Откройте форму объекта в Предприятии. Выполнение остановится.
  4. Вызовите окно вычисления выражения (Shift+F9) и введите:
Строка(Объект.Ссылка.УникальныйИдентификатор())

В модуле объекта вместо Объект.Ссылка пишите Ссылка, в обработке со списком — Элементы.Список.ТекущаяСтрока, если в списке выделена строка ссылочного типа.

Для нового, ещё не записанного объекта Ссылка пустая, и вы получите 00000000-0000-0000-0000-000000000000. Сначала запишите элемент, потом смотрите GUID.

Получение GUID объекта в коде: готовые примеры

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

Из ссылки в строку

УИД = Ссылка.УникальныйИдентификатор();
СтрокаУИД = Строка(УИД);
// СтрокаУИД = "5f3c9a12-8b7e-11ee-b962-0242ac120002"

Тот же результат даёт XMLСтрока(Ссылка) — для ссылочных значений функция возвращает GUID строкой. Это удобно при формировании JSON и XML вручную.

Из строки обратно в ссылку

Чтобы получить ссылку по известному идентификатору, нужен менеджер конкретного типа:

СтрокаУИД = "5f3c9a12-8b7e-11ee-b962-0242ac120002";
УИД = Новый УникальныйИдентификатор(СтрокаУИД);
Ссылка = Справочники.Контрагенты.ПолучитьСсылку(УИД);

Если Ссылка.ПолучитьОбъект() = Неопределено Тогда
	Сообщить("Объекта с таким GUID в базе нет");
Иначе
	Сообщить("Найден: " + Строка(Ссылка));
КонецЕсли;

Метод ПолучитьСсылку() не проверяет, существует ли объект. Он всегда вернёт ссылку, даже на несуществующий элемент. Проверка через ПолучитьОбъект() или запросом обязательна.

Из навигационной ссылки в GUID

Функция переставляет группы по схеме из таблицы выше:

Функция GUIDИзНавигационнойСсылки(НавСсылка)
	Поз = СтрНайти(НавСсылка, "ref=");
	Если Поз = 0 Тогда
		Возврат "";
	КонецЕсли;
	Код = Сред(НавСсылка, Поз + 4, 32);
	Возврат Сред(Код, 25, 8) + "-" + Сред(Код, 21, 4) + "-"
		+ Сред(Код, 17, 4) + "-" + Сред(Код, 1, 4) + "-" + Сред(Код, 5, 12);
КонецФункции

Проверка на примере: код b9620242ac12000211ee8b7e5f3c9a12 даёт 5f3c9a12-8b7e-11ee-b962-0242ac120002.

Обратно, из ссылки в навигационную строку, переводит функция ПолучитьНавигационнуюСсылку(Ссылка).

Создание объекта с заданным GUID

При загрузке из другой системы иногда нужно, чтобы новый элемент получил тот же идентификатор, что и в источнике:

НовыйЭлемент = Справочники.Контрагенты.СоздатьЭлемент();
НовыйЭлемент.УстановитьСсылкуНового(Справочники.Контрагенты.ПолучитьСсылку(УИД));
НовыйЭлемент.Наименование = "ООО Ромашка";
НовыйЭлемент.Записать();

Перед этим проверьте, что объекта с таким GUID ещё нет, иначе запись завершится ошибкой.

GUID в консоли запросов

В языке запросов нет функции, которая вернула бы GUID строкой. Запрос возвращает саму ссылку, а идентификатор из неё получают уже в коде.

Поиск объекта по известному GUID

Передайте ссылку параметром:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	Контрагенты.Ссылка,
|	Контрагенты.Наименование,
|	Контрагенты.ПометкаУдаления
|ИЗ
|	Справочник.Контрагенты КАК Контрагенты
|ГДЕ
|	Контрагенты.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка",
	Справочники.Контрагенты.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаУИД)));
Результат = Запрос.Выполнить();

Пустой результат значит, что объекта с таким GUID в этой таблице нет. Заодно это надёжная проверка существования.

Вывод GUID списком

Если нужно выгрузить идентификаторы пачкой, обойдите выборку и добавьте колонку в коде:

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	Сообщить(Выборка.Наименование + ";" + Строка(Выборка.Ссылка.УникальныйИдентификатор()));
КонецЦикла;

Многие внешние консоли запросов позволяют выполнить произвольный код над результатом. Тогда этот же фрагмент вставляют туда, и идентификаторы попадают в таблицу результата.

GUID в Конфигураторе, файлах конфигурации и таблицах СУБД

Здесь важно не путать два разных идентификатора.

ЧтоГде виденПример применения
GUID данных (элемента, документа)в коде, навигационной ссылке, в поле _IDRRef таблицы СУБДобмены, интеграции, поиск битых ссылок
GUID объекта метаданных (справочника, реквизита)в выгрузке конфигурации в XMLсравнение конфигураций, работа в EDT и Git

Идентификаторы метаданных

  1. В Конфигураторе выполните Конфигурация → Выгрузить конфигурацию в файлы.
  2. Откройте XML-файл нужного объекта, например Catalogs/Контрагенты.xml.
  3. В корневом теге объекта есть атрибут uuid — это GUID справочника как объекта метаданных. Такие же атрибуты есть у реквизитов, табличных частей и форм.

Эти идентификаторы определяют, что объект в двух конфигурациях — один и тот же. Поэтому при переименовании справочника данные не теряются: платформа узнаёт его по uuid, а не по имени.

GUID в таблицах SQL Server и PostgreSQL

В клиент-серверной базе ссылка хранится в поле _IDRRef типа binary(16) в таблицах вида _Reference45, _Document112. Байты записаны в той же перестановке, что и в навигационной ссылке. Значит, код после ref= можно сразу искать в СУБД:

SELECT *
FROM _Reference45
WHERE _IDRRef = 0xB9620242AC12000211EE8B7E5F3C9A12;

Соответствие имени справочника и номера таблицы показывает функция ПолучитьСтруктуруХраненияБазыДанных().

Таблицы базы 1С можно только читать. Любая запись в таблицы СУБД в обход платформы ломает целостность базы и не поддерживается фирмой-разработчиком. Изменения — только средствами 1С.

GUID при обмене данными и интеграциях

Почти все механизмы обмена опираются на идентификатор.

  • 🔄 Типовые обмены через EnterpriseData и конвертацию данных. В XML-сообщении у объекта есть элемент со ссылкой, где лежит его GUID. При загрузке программа сначала ищет объект с таким идентификатором, потом — по правилам поиска (ИНН, коду, номеру).
  • 🌐 OData-интерфейс. Ключ объекта — поле Ref_Key. Обращение к конкретному элементу выглядит так: Catalog_Контрагенты(guid'5f3c9a12-8b7e-11ee-b962-0242ac120002').
  • 🧾 JSON и HTTP-сервисы. При сериализации через СериализаторXDTO ссылка записывается как GUID. При ручной сборке JSON берите XMLСтрока(Ссылка).
  • 🗂 Внешние системы. Сайту или CRM передают GUID, а не код: код может совпасть у элементов в разных группах или поменяться после перенумерации.

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

Где вам нужен GUID?

Ошибки при работе с GUID и как их избежать

<Объект не найден> в реквизите

Так платформа показывает ссылку на объект, которого в базе нет. Рядом в скобках выводится номер таблицы и код ссылки, например <Объект не найден> (45:b9620242ac12000211ee8b7e5f3c9a12). Код после двоеточия — тот же формат хранения, что и в навигационной ссылке. Переведите его в GUID и найдите объект в базе-источнике или в резервной копии.

Причины обычно такие:

  • 🗑 объект удалили непосредственно, без контроля ссылок;
  • 🔄 документ пришёл по обмену раньше справочника, на который он ссылается;
  • 🧩 ссылку создали через ПолучитьСсылку() без проверки существования.

Одинаковые GUID в двух базах

Копия базы, сделанная выгрузкой .dt или копированием файла, содержит те же идентификаторы. Если потом в обеих базах вести учёт и настроить между ними обмен, объекты с одинаковым GUID склеятся, хотя по смыслу это уже разные записи. Для новой самостоятельной базы лучше начинать с пустой и переносить данные обменом.

Сравнение строки с идентификатором

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

Строка неверного формата

Конструктор Новый УникальныйИдентификатор(Строка) вызывает исключение, если строка не похожа на GUID: лишние пробелы, фигурные скобки, обрезанный код. Оберните преобразование в Попытка ... Исключение и уберите лишние символы через СокрЛП() и СтрЗаменить().

Путаница типов

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

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

Меняется ли GUID при перепроведении документа или изменении реквизитов?
Нет. Идентификатор присваивается при первой записи и остаётся тем же до удаления объекта. Перепроведение, смена номера или наименования на него не влияют.
Можно ли изменить GUID у существующего объекта?
Штатно нет. Если нужен другой идентификатор, создают новый объект с УстановитьСсылкуНового(), переносят данные и заменяют ссылки на старый объект.
Сохраняются ли GUID при выгрузке и загрузке базы через .dt?
Да, выгрузка информационной базы переносит данные вместе с идентификаторами. После загрузки все ссылки и навигационные ссылки работают так же.
Есть ли GUID у пустой ссылки?
Есть, он состоит из нулей: 00000000-0000-0000-0000-000000000000. По нему удобно проверять, заполнен ли реквизит, если ссылка пришла извне строкой.
Подходит ли GUID для поиска в универсальном списке без кода?
Нет, поиск в списках работает по видимым полям. Объект по GUID находят навигационной ссылкой или запросом с параметром.