Уникальный идентификатор ссылки в 1С 8.3: где его найти и как с ним работать
Содержание
Быстрее всего посмотреть 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 объекта в режиме Предприятия без программирования
Пользователь без прав на Конфигуратор может получить идентификатор через навигационную ссылку.
- Откройте карточку нужного элемента или документа.
- В заголовке формы нажмите кнопку меню формы (значок с тремя точками или «Ещё»).
- Выберите команду «Получить ссылку». Откроется окно со строкой ссылки.
- Скопируйте строку. Она выглядит так:
e1cib/data/Справочник.Контрагенты?ref=b9620242ac12000211ee8b7e5f3c9a12
Всё, что после ref=, — это GUID объекта в формате хранения. Дефисов нет, а группы цифр стоят в другом порядке.
Как перевести код из ссылки в обычный GUID
Возьмите 32 символа после ref= и разбейте их на пять частей по длине: 4, 12, 4, 4, 8. Затем соберите в обратном порядке.
Часть в ref= | Длина | Пример | Куда идёт в GUID |
|---|---|---|---|
| 1 | 4 | b962 | 4-я группа |
| 2 | 12 | 0242ac120002 | 5-я группа |
| 3 | 4 | 11ee | 3-я группа |
| 4 | 4 | 8b7e | 2-я группа |
| 5 | 8 | 5f3c9a12 | 1-я группа |
Результат: 5f3c9a12-8b7e-11ee-b962-0242ac120002.
Обратная операция тоже работает: ссылку можно вставить в окно перехода по ссылке в главном меню программы, и платформа откроет объект. Это удобно, когда коллега прислал вам ссылку в мессенджере.
Навигационная ссылка содержит только идентификатор и тип объекта, имени базы в ней нет. Ссылка из рабочей базы, открытая в копии, приведёт к тому же объекту, если в копии он есть.
Как узнать GUID через отладчик
Отладчик — самый быстрый способ для разработчика. Нужен доступ к Конфигуратору или к среде EDT.
Подготовка
- Запустите базу в режиме отладки из Конфигуратора: меню
Отладка → Начать отладку, клиент выберите по ситуации. - Если сеанс уже открыт, подключите его к отладчику: в клиентском приложении включите отладку в текущем сеансе в параметрах системы, затем в Конфигураторе подключитесь через
Отладка → Подключение.
Получение идентификатора
- Откройте в модуле формы объекта любой обработчик, который точно сработает, например
ПриОткрытииили обработчик кнопки. - Поставьте точку останова (
F9). - Откройте форму объекта в Предприятии. Выполнение остановится.
- Вызовите окно вычисления выражения (
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 |
Идентификаторы метаданных
- В Конфигураторе выполните
Конфигурация → Выгрузить конфигурацию в файлы. - Откройте XML-файл нужного объекта, например
Catalogs/Контрагенты.xml. - В корневом теге объекта есть атрибут
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 и как их избежать
<Объект не найден> в реквизите
Так платформа показывает ссылку на объект, которого в базе нет. Рядом в скобках выводится номер таблицы и код ссылки, например <Объект не найден> (45:b9620242ac12000211ee8b7e5f3c9a12). Код после двоеточия — тот же формат хранения, что и в навигационной ссылке. Переведите его в GUID и найдите объект в базе-источнике или в резервной копии.
Причины обычно такие:
- 🗑 объект удалили непосредственно, без контроля ссылок;
- 🔄 документ пришёл по обмену раньше справочника, на который он ссылается;
- 🧩 ссылку создали через
ПолучитьСсылку()без проверки существования.
Одинаковые GUID в двух базах
Копия базы, сделанная выгрузкой .dt или копированием файла, содержит те же идентификаторы. Если потом в обеих базах вести учёт и настроить между ними обмен, объекты с одинаковым GUID склеятся, хотя по смыслу это уже разные записи. Для новой самостоятельной базы лучше начинать с пустой и переносить данные обменом.
Сравнение строки с идентификатором
Строка(УИД) возвращает цифры в нижнем регистре. Если внешняя система присылает GUID заглавными буквами, прямое сравнение строк даст «не равно». Сравнивайте значения типа УникальныйИдентификатор или приводите обе строки к одному регистру через НРег().
Строка неверного формата
Конструктор Новый УникальныйИдентификатор(Строка) вызывает исключение, если строка не похожа на GUID: лишние пробелы, фигурные скобки, обрезанный код. Оберните преобразование в Попытка ... Исключение и уберите лишние символы через СокрЛП() и СтрЗаменить().
Путаница типов
Один и тот же GUID теоретически может встретиться в таблицах разных справочников. Поэтому одного идентификатора мало: вместе с ним всегда передавайте тип объекта — имя справочника или документа.
Частые вопросы
Меняется ли GUID при перепроведении документа или изменении реквизитов?
Можно ли изменить GUID у существующего объекта?
УстановитьСсылкуНового(), переносят данные и заменяют ссылки на старый объект.Сохраняются ли GUID при выгрузке и загрузке базы через .dt?
Есть ли GUID у пустой ссылки?
00000000-0000-0000-0000-000000000000. По нему удобно проверять, заполнен ли реквизит, если ссылка пришла извне строкой.