Разработка и Конфигурация · 15 мин
Как узнать идентификатор объекта в 1С
Как узнать идентификатор объекта в 1С: GUID через запрос, встроенный язык, СКД и внешние инструменты. Разбор типов ссылок, ошибок и практических сценариев.
Идентификатор объекта (GUID, глобально уникальный идентификатор) — это внутренняя метка, по которой платформа 1С однозначно отличает один элемент справочника, документ или запись плана счетов от всех остальных. В отличие от кода или номера, которые могут повторяться и меняться, GUID присваивается объекту один раз при создании и не изменяется на протяжении всей жизни объекта в базе.
Знать GUID требуется в нескольких типовых ситуациях: при настройке обменов между базами, при поиске «битых» ссылок вида «Объект не найден», при интеграции с внешними системами через веб-сервисы и HTTP-запросы, а также при разборе расхождений после переноса данных. Пользователь в режиме «Предприятие» идентификатор не видит, поэтому для его получения применяют встроенный язык, консоль запросов или специальные обработки.
Ниже разобраны основные способы узнать идентификатор: программный, через запрос, через стандартные механизмы платформы и через внешние инструменты. Отдельно рассмотрены обратная задача — найти объект по известному GUID — и типичные ошибки, которые приводят к потере связей между объектами.
Что такое GUID объекта и чем он отличается от кода и номера
Каждая ссылочная сущность в 1С — элемент справочника, документ, элемент плана видов характеристик, счёт, узел плана обмена — хранится в таблице базы данных, и её первичным ключом фактически является уникальный идентификатор. Платформа формирует его автоматически в момент записи объекта, и изменить его штатными средствами нельзя.
Код справочника и номер документа — это прикладные реквизиты, видимые пользователю. Они могут дублироваться (при сбитой нумерации или ручном вводе), могут быть переприсвоены и не гарантируют уникальность между разными базами. GUID, напротив, уникален практически гарантированно: вероятность совпадения двух случайно сгенерированных идентификаторов пренебрежимо мала. Именно поэтому механизмы обмена и синхронизации опираются на GUID, а не на коды.
Важно понимать, что у одного объекта идентификатор один, но его строковое представление может выглядеть по-разному: в привычном виде «8-4-4-4-12» (например, a1b2c3d4-e5f6-7890-abcd-ef1234567890) и в «перевёрнутом» виде, который используется в таблицах SQL Server. Это один и тот же идентификатор, просто с другим порядком байтов.
Как узнать GUID программно через встроенный язык
Самый универсальный способ — выполнить небольшой фрагмент кода во внешней обработке, консоли кода или через «Выполнить произвольное выражение». Для ссылки на объект доступны два основных варианта.
Первый вариант — метод УникальныйИдентификатор(), который возвращает значение типа «УникальныйИдентификатор». Второй — функция XMLСтрока(), которая сразу преобразует ссылку в строковое представление GUID. Оба подхода дают один и тот же результат, но XMLСтрока() удобнее, когда идентификатор нужен именно как текст.
// Получаем ссылку на элемент справочника
СсылкаНаКонтрагента = Справочники.Контрагенты.НайтиПоКоду("000000123");
// Способ 1: через метод ссылки
Идентификатор = СсылкаНаКонтрагента.УникальныйИдентификатор();
// Способ 2: сразу в строку
ИдентификаторСтрокой = XMLСтрока(СсылкаНаКонтрагента);
Сообщить(ИдентификаторСтрокой); // например: a1b2c3d4-e5f6-7890-abcd-ef1234567890
Для документа логика идентична: сначала получают ссылку через Документы.РеализацияТоваровУслуг.НайтиПоНомеру() или выборкой, затем обращаются к УникальныйИдентификатор(). Если объект ещё не записан, идентификатор у объекта данных есть (он генерируется при создании объекта в памяти), но после записи он сохранится именно таким.
Ссылка = Справочники.Номенклатура.НайтиПоКоду("00-000001");
Если Не Ссылка.Пустая() Тогда
Сообщить(XMLСтрока(Ссылка));
Иначе
Сообщить("Элемент не найден");
КонецЕсли;Как получить идентификатор через запрос и консоль запросов
В языке запросов 1С нет прямой функции, возвращающей GUID, — поле «Ссылка» выводится как представление объекта. Однако есть рабочий приём: функция ПРЕДСТАВЛЕНИЕССЫЛКИ() возвращает навигационную ссылку, из которой GUID можно извлечь, а в ряде случаев идентификатор получают через соединение с таблицей констант или через программную обработку результата запроса.
На практике чаще поступают проще: выгружают ссылки запросом, а затем в цикле по результату обращаются к XMLСтрока() для каждой строки. Это удобно, когда нужно получить идентификаторы сразу для списка объектов — например, для выгрузки номенклатуры во внешнюю систему.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование + " | " + XMLСтрока(Выборка.Ссылка));
КонецЦикла;
Если под рукой есть типовая или сторонняя «Консоль запросов» с возможностью выполнения произвольного кода над результатом, задача решается без написания отдельной обработки. В управляемых формах также можно добавить на форму списка кнопку, выводящую GUID текущей строки, — это удобно для пользователей, которым идентификатор нужен регулярно.
Как узнать GUID без программирования
Если доступа к конфигуратору или консоли кода нет, идентификатор можно посмотреть через навигационную ссылку объекта. Откройте нужный элемент, вызовите команду «Получить ссылку» (в управляемом интерфейсе она обычно находится в меню «Ещё» формы объекта). Платформа покажет строку вида e1cib/data/Справочник.Контрагенты?ref=a1b2c3d4e5f67890abcdef1234567890 — хвост после «ref=» и есть GUID в шестнадцатеричном виде без дефисов.
Обратите внимание: в навигационной ссылке байты идентификатора записаны в порядке, отличном от привычного строкового представления. Для сопоставления с GUID, полученным через XMLСтрока(), потребуется перестановка групп байтов. Если нужно просто передать ссылку коллеге или открыть объект в тонком клиенте, навигационная ссылка работает напрямую без преобразований.
Ещё один вариант — типовая обработка «Поиск и замена значений» или универсальные подбор и обработка объектов (в конфигурациях на БСП — «Групповое изменение реквизитов» и консоль кода из подсистемы «Инструменты разработчика», если она внедрена). Через них можно вывести служебные свойства ссылки, включая уникальный идентификатор, без написания собственного кода с нуля.
GUID в обменах, SQL и внешних интеграциях
При синхронизации между базами 1С (например, между «Управлением торговлей» и «Бухгалтерией») соответствие объектов строится именно по GUID. Если объект в базе-приёмнике был удалён и создан заново вручную, у него будет другой идентификатор, и обмен начнёт создавать дубли. Лечение — либо удалить дубль и восстановить соответствие, либо перерегистрировать объекты и выполнить сопоставление заново.
В клиент-серверном варианте GUID хранится в таблицах SQL Server в поле вида _IDRRef типа binary(16). Прямые запросы к SQL — популярный способ массового анализа, но здесь действует жёсткое ограничение: читать данные можно, изменять их напрямую в SQL категорически нельзя — это нарушает внутренние связи платформы и почти гарантированно приводит к повреждению базы. Кроме того, порядок байтов в SQL-представлении отличается от строкового GUID, что требует аккуратного преобразования.
При интеграции через HTTP-сервисы, OData или веб-сервисы идентификатор передаётся строкой. Стандартный интерфейс OData, который можно включить в настройках публикации, отдаёт объекты с полем Ref_Key, содержащим GUID, — внешняя система может использовать его для последующих запросов и обновлений конкретных объектов.
Способы узнать GUID — что выбрать
Универсально и точно; требует права на выполнение кода или внешней обработки
Доступно любому пользователю без программирования; байты в обратном порядке, нужна аккуратность
Подходит для списков объектов; сам запрос GUID не вернёт, нужен цикл с XMLСтрока()
Быстро для массового анализа; только чтение, требует знания структуры таблиц и преобразования байтов
Типичные ошибки и как их избежать
Самая распространённая ошибка — попытка использовать код или номер вместо GUID при интеграции. Как только в одной из баз перенумеруют справочник или документ, связь развалится. Всегда передавайте во внешние системы именно идентификатор, а код используйте только как человекочитаемое поле.
Вторая группа ошибок связана с представлением идентификатора: путаница между обычным и «перевёрнутым» порядком байтов приводит к тому, что объект по GUID «не находится», хотя он существует. Перед поиском убедитесь, в каком виде получен идентификатор — из навигационной ссылки, из XMLСтрока() или из SQL — и при необходимости приведите его к стандартному формату.
Третья типичная ситуация — попытка получить GUID у значения, которое не является ссылкой: у записи регистра сведений, строки табличной части или примитивного типа идентификатора нет. Метод УникальныйИдентификатор() доступен только ссылкам на объектные данные. Для записей регистров придётся оперировать составом измерений и ключом записи.
Как проверить результат и убедиться в корректности
После получения идентификатора полезно выполнить обратную проверку: преобразуйте строку обратно через Новый УникальныйИдентификатор(Строка) и получите ссылку через ПолучитьСсылку(). Если запрос по этой ссылке возвращает исходный объект — цепочка корректна.
Для обменов контрольный признак — отсутствие дублей после синхронизации и совпадение количества сопоставленных объектов в отчёте о сопоставлении. Если в отчёте появляются объекты «не сопоставлено», хотя они заведомо есть в обеих базах, почти наверняка у одной из копий изменился GUID из-за удаления и повторного создания.
Как проверить результат
Новый УникальныйИдентификатор(Строка) создаётся без ошибки, ссылка находится в базе
Исключение «Недопустимое значение» или объект не найден
Формат 8-4-4-4-12 шестнадцатеричных символов
32 символа без дефисов — вероятно, порядок байтов из навигационной ссылки или SQL
Объекты сопоставлены, дублей нет
Дубли и несопоставленные строки — GUID изменился после пересоздания объекта
Если GUID нужны пользователям регулярно (например, для выгрузки в CRM), добавьте в форму списка справочника колонку или команду, выводящую XMLСтрока(Ссылка) в буфер обмена. Это избавит от постоянных обращений к разработчику и снизит риск ручных ошибок при копировании.
Частые вопросы
Можно ли изменить GUID существующего объекта?
Штатными средствами — нет: идентификатор фиксируется при создании объекта. Обходной путь — создать новый объект с нужным GUID через ПолучитьСсылку() и УстановитьСсылкуНового(), перенести данные и заменить ссылки, но это рискованная операция, которую выполняют только на копии базы.
Чем GUID отличается от навигационной ссылки?
Навигационная ссылка — это адрес объекта для открытия в клиенте 1С, она содержит тип объекта и его идентификатор. GUID — только сам идентификатор. Из навигационной ссылки GUID можно извлечь, но порядок байтов в ней отличается от строкового представления.
Почему по GUID объект не находится, хотя он есть в базе?
Чаще всего причина в «перевёрнутом» порядке байтов: идентификатор взят из навигационной ссылки или из таблицы SQL и не преобразован к стандартному виду. Вторая причина — поиск выполняется не в том менеджере объекта: GUID уникален, но тип (справочник, документ) нужно знать или перебирать.
Есть ли GUID у записей регистров и строк табличных частей?
Нет. Уникальный идентификатор есть только у ссылочных объектов: элементов справочников, документов, задач, счетов и т.п. Записи регистров идентифицируются комбинацией измерений (и регистратора для подчинённых регистров), строки табличных частей — ссылкой на владельца и номером строки.
Сохранится ли GUID при выгрузке и загрузке через обмен или перенос данных?
Да, если перенос выполнен корректно: типовые механизмы (Конвертация данных, универсальный обмен XML, планы обмена) специально сохраняют идентификаторы, чтобы объекты в разных базах совпадали. GUID теряется только если объект в приёмнике создали вручную заново или загрузили без сохранения ссылок.
Можно ли узнать GUID всех объектов сразу, например всей номенклатуры?
Да: выполните запрос по справочнику и в цикле по результату выведите XMLСтрока(Ссылка) для каждой строки, либо используйте готовую обработку выгрузки ссылок с идентификаторами. Для очень больших таблиц выгрузку лучше делать порциями, чтобы не перегружать память.
Что важно запомнить
GUID — неизменяемый идентификатор ссылочного объекта, основа обменов и интеграций. Узнать его проще всего через XMLСтрока(Ссылка) или навигационную ссылку, найти объект по GUID — через ПолучитьСсылку() с проверкой существования. Следите за порядком байтов в разных представлениях и никогда не правьте идентификаторы напрямую в SQL.