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

· 9 мин

Содержание

GUID любого справочника, документа, плана видов характеристик или перечисления в 1С 8.3 возвращает метод ссылки УникальныйИдентификатор(). Самый быстрый способ увидеть его глазами — в отладчике вычислить выражение Строка(Ссылка.УникальныйИдентификатор()). Результат выглядит так: 5f3a9c1e-2b4d-11ee-8a1c-00155d012345.

Частое заблуждение — искать GUID в карточке объекта, рядом с кодом и наименованием. Там его нет: в пользовательском режиме платформа его не показывает. Код и номер — это реквизиты для людей, а уникальный идентификатор — внутренний ключ записи, который не меняется при переименовании, перенумерации и перемещении между группами. Ниже все рабочие способы его получить: от отладчика до прямого чтения таблицы в СУБД.

Что такое GUID в 1С и у каких объектов он есть

Каждая ссылка в базе 1С:Предприятия 8 хранит 16-байтный уникальный идентификатор. В строковом виде это 36 символов: 32 шестнадцатеричные цифры и 4 дефиса.

Идентификатор есть у объектов ссылочного типа:

  • 📁 справочники;
  • 📄 документы;
  • 📊 планы видов характеристик, планы счетов, планы видов расчёта;
  • 🔁 планы обмена и узлы обмена;
  • 🗂 бизнес-процессы и задачи;
  • 🔢 значения перечислений.

У записей регистров сведений, накопления и бухгалтерии собственного GUID нет. Запись регистра определяется набором измерений или регистратором с номером строки. Константы тоже без идентификатора.

Пустая ссылка тоже имеет GUID — нулевой: 00000000-0000-0000-0000-000000000000. Если код вернул именно его, вы взяли пустое значение реквизита, а не объект.

Предопределённые элементы получают GUID при создании базы. В двух разных базах одной конфигурации идентификаторы предопределённого элемента «Основной склад» или ставки «20%» в общем случае различаются. Для синхронизации их сопоставляют по имени предопределённых данных, а не по GUID.

Способ 1. Отладчик: вычислить идентификатор без доработок

Подходит, когда у вас есть доступ к Конфигуратору и нужно посмотреть GUID одного-двух объектов.

  1. Откройте базу в Конфигураторе.
  2. Запустите отладку: Отладка → Начать отладку → Тонкий клиент (или клавиша F5).
  3. Остановитесь в любом месте, где доступна ссылка на нужный объект. Проще всего поставить точку останова в модуле формы объекта, например в обработчике ПриОткрытии, и открыть элемент.
  4. Нажмите Shift+F9 — откроется окно «Вычислить выражение».
  5. Введите выражение и нажмите «Рассчитать»:
Строка(Объект.Ссылка.УникальныйИдентификатор())

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

Отладка в клиент-серверной базе требует, чтобы на сервере 1С была разрешена отладка. Включать её на рабочем сервере в разгар дня не стоит: это решение администратора, и оно влияет на всех пользователей кластера.

Значение из окна можно скопировать. Если выражение помещено в «Табло», оно пересчитывается на каждом шаге, что удобно при переборе объектов в цикле.

Способ 2. Навигационная ссылка: GUID в пользовательском режиме

Без Конфигуратора идентификатор можно извлечь из навигационной ссылки. Откройте объект и нажмите Shift+F11 — это команда «Получить ссылку». Появится строка вида:

e1cib/data/Справочник.Номенклатура?ref=8a1c00155d01234511ee2b4d5f3a9c1e

После ref= стоят те же 16 байт, но в другом порядке, без дефисов. Это порядок, в котором байты лежат в поле _IDRRef таблицы СУБД. Чтобы получить привычный GUID, разбейте 32 символа на группы и переставьте:

Позиции в refДлинаКуда идёт в GUID
25–328первая группа
21–244вторая группа
17–204третья группа
1–44четвёртая группа
5–1612пятая группа

Пример: ref=8a1c00155d01234511ee2b4d5f3a9c1e превращается в 5f3a9c1e-2b4d-11ee-8a1c-00155d012345.

Обратная функция на встроенном языке:

Функция GUIDИзRef(Ref) Экспорт
    Возврат Сред(Ref, 25, 8) + "-" + Сред(Ref, 21, 4) + "-"
        + Сред(Ref, 17, 4) + "-" + Лев(Ref, 4) + "-" + Сред(Ref, 5, 12);
КонецФункции

Этот же порядок байтов виден в «битых» ссылках. Если объект удалён, а ссылка на него осталась, в поле отображается <Объект не найден> (45:8a1c00155d01234511ee2b4d5f3a9c1e). Число до двоеточия — номер таблицы, после — идентификатор в формате ref.

Способ 3. Встроенный язык: метод УникальныйИдентификатор() и обратная операция

Программно GUID получают одной строкой:

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

Короче и без промежуточного объекта — функция XMLСтрока(). Для ссылки она возвращает именно строковый GUID:

ИдентификаторСтрокой = XMLСтрока(Ссылка);

Обратная задача — найти объект по известному GUID:

Идентификатор = Новый УникальныйИдентификатор("5f3a9c1e-2b4d-11ee-8a1c-00155d012345");
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор);

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

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

Как хранить чужой GUID в реквизите

Если нужно запомнить идентификатор объекта из внешней системы, не храните его строкой произвольной длины. В 1С есть отдельный тип реквизита УникальныйИдентификатор: он занимает 16 байт, а не 36 символов, и по нему быстрее работает отбор.

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

Внешняя обработка для пользователей

Когда GUID нужен регулярно, а в Конфигуратор пускать никого не хочется, соберите маленькую внешнюю обработку :

  1. В Конфигураторе: Файл → Новый → Внешняя обработка.
  2. Добавьте реквизит Объект1С с составным типом. Удобно выбрать все ссылочные типы сразу через флажки групп («Любая ссылка» на справочники, документы и т. д.).
  3. Добавьте реквизит GUID типа «Строка» длиной 36.
  4. Создайте форму, выведите оба реквизита и кнопку «Показать GUID».
  5. В модуле формы:
&НаКлиенте
Процедура ПоказатьGUID(Команда)
    Если ЗначениеЗаполнено(Объект.Объект1С) Тогда
        Объект.GUID = XMLСтрока(Объект.Объект1С);
    Иначе
        Объект.GUID = "";
    КонецЕсли;
КонецПроцедуры

XMLСтрока() доступна на клиенте, поэтому серверный вызов здесь не нужен. Сохраните обработку и открывайте через Файл → Открыть. Права на открытие внешних обработок у пользователя должны быть.

Перед тем как искать объект по GUID
Выполнено: 0 / 5

Способ 4. Запрос: как получить GUID через язык запросов

В языке запросов 1С нет функции, которая вернула бы идентификатор колонкой. Выбирается ссылка, а GUID вычисляется уже в коде при обходе результата:

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

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить(СтрШаблон("%1 | %2 | %3",
        Выборка.Код, Выборка.Наименование, XMLСтрока(Выборка.Ссылка)));
КонецЦикла;

Если запускаете запрос в консоли запросов, ищите в ней возможность выполнить код над результатом или выгрузить ссылки. Многие консоли показывают в колонке только представление объекта, а не идентификатор.

Обратный поиск по GUID в запросе тоже идёт через ссылку. Сначала соберите её методом ПолучитьСсылку(), затем передайте параметром:

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

Это заодно надёжная проверка существования, которая не читает объект целиком.

Способ 5. COM-соединение: GUID для внешней программы

Внешнее приложение — скрипт, другая база, сервис интеграции — может подключиться к базе через V83.COMConnector и получить GUID тем же методом. Пример на встроенном языке из другой базы:

Коннектор = Новый COMОбъект("V83.COMConnector");
Соединение = Коннектор.Connect("File=""D:\Bases\Torg"";Usr=""Обмен"";Pwd=""***""");

Товар = Соединение.Справочники.Номенклатура.НайтиПоКоду("00-00000123");
Если НЕ Товар.Пустая() Тогда
    GUID = Соединение.XMLСтрока(Товар);
    Сообщить(GUID);
КонецЕсли;

Функции глобального контекста (XMLСтрока, Строка) вызывайте через объект Соединение. Значение типа УникальныйИдентификатор, полученное через COM, — это внешний COM-объект, и локальная Строка() его корректно не преобразует.

Для клиент-серверной базы строка подключения выглядит так: Srvr="имя_сервера";Ref="имя_базы";Usr="...";Pwd="...".

Компонента COMConnector регистрируется отдельно для 32- и 64-разрядной платформы. Разрядность вызывающей программы должна совпадать с разрядностью зарегистрированной компоненты, иначе объект не создастся.

Для интеграций сейчас чаще используют HTTP-сервисы или стандартный интерфейс OData. В OData идентификатор отдаётся в поле Ref_Key в обычном формате с дефисами, а не в порядке ref.

Способ 6. Поле _IDRRef: GUID при прямом доступе к СУБД

В MS SQL Server или PostgreSQL ссылка хранится в поле _IDRRef типа binary(16) (в PostgreSQL — bytea). Таблицы называются по номерам: _Reference45 для справочника, _Document112 для документа. Какой номер у вашего справочника, покажет функция:

Структура = ПолучитьСтруктуруХраненияБазыДанных(
    ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Метаданные.Справочники.Номенклатура));
Для Каждого СтрокаТаблицы Из Структура Цикл
    Сообщить(СтрокаТаблицы.ИмяТаблицыХранения + " — " + СтрокаТаблицы.Метаданные);
КонецЦикла;

Здесь используется общий модуль БСП, который есть в типовых конфигурациях. Без БСП создайте массив вручную и добавьте в него объект метаданных.

Запрос в MS SQL:

SELECT _Code, _Description, _IDRRef
FROM _Reference45
WHERE _Code = '00-00000123';

В _IDRRef вы увидите 0x8A1C00155D01234511EE2B4D5F3A9C1E — те же 32 символа, что в навигационной ссылке после ref=. Перевод в привычный GUID — по таблице из способа 2.

Где смотритеПример значенияФормат
УникальныйИдентификатор(), XMLСтрока(), OData5f3a9c1e-2b4d-11ee-8a1c-00155d012345GUID с дефисами
Навигационная ссылка ref=8a1c00155d01234511ee2b4d5f3a9c1eбайты СУБД
Поле _IDRRef в СУБД0x8A1C00155D01234511EE2B4D5F3A9C1Eбайты СУБД
Битая ссылка(45:8a1c00155d01234511ee2b4d5f3a9c1e)номер таблицы + байты СУБД

Читать таблицы напрямую можно, менять — нельзя. Запись в обход платформы ломает кеши, итоги регистров и целостность ссылок, а фирма 1С такие изменения не поддерживает. Любой эксперимент — только на копии базы.

GUID в обменах данными: почему объекты не дублируются

Обмены 1С опираются на GUID, потому что код и наименование могут совпасть случайно или поменяться. В XML-сообщении обмена ссылка записывается строковым идентификатором — тем же, что возвращает XMLСтрока().

Как это работает на практике:

  • 🔁 Одинаковые конфигурации (распределённая база, обмен по одинаковым правилам). Объект в приёмнике создаётся с тем же GUID, что в источнике. Найти его в другой базе можно через ПолучитьСсылку() с тем же идентификатором.
  • 🔀 Разные конфигурации (БП ↔ УТ, БП ↔ ЗУП). GUID в базах обычно разные. Соответствие хранится в регистре сведений БСП, где лежат пары «ссылка в этой базе — идентификатор в другой». По нему обмен понимает, что «Иванов» из ЗУП — это уже существующий «Иванов» в БП.
  • 🆕 Создание объекта с заданным GUID. Перед записью нового объекта вызовите УстановитьСсылкуНового():
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.УстановитьСсылкуНового(
    Справочники.Номенклатура.ПолучитьСсылку(
        Новый УникальныйИдентификатор("5f3a9c1e-2b4d-11ee-8a1c-00155d012345")));
НовыйЭлемент.Наименование = "Товар из внешней системы";
НовыйЭлемент.Записать();

Так загружают данные из внешних систем, чтобы повторная загрузка находила тот же объект, а не плодила дубли. Если объект с таким GUID уже есть, запись завершится ошибкой.

Дубли после обмена почти всегда означают, что сопоставление по GUID не сработало. Проверьте, не очищали ли регистр соответствий и не загружали ли базу-приёмник заново из файла с другими идентификаторами.

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

Меняется ли GUID при копировании базы через .dt?
Нет. Выгрузка и загрузка информационной базы сохраняют идентификаторы всех объектов. Меняются они только при пересоздании объектов, например при загрузке данных обработкой без УстановитьСсылкуНового().
Может ли у двух объектов в разных справочниках быть одинаковый GUID?
Теоретически да: уникальность гарантирована внутри одной таблицы. Поэтому для поиска по GUID нужно знать тип объекта — справочник или документ, и какой именно.
Как скопировать элемент справочника с тем же GUID?
Внутри одной базы — никак: два элемента одной таблицы не могут иметь одинаковый идентификатор. Перенести элемент с сохранением GUID можно только в другую базу.
Можно ли изменить GUID у существующего объекта?
Штатно — нет. Создают новый объект с нужным идентификатором и заменяют ссылки на старый, например обработкой поиска и удаления дублей в БСП.
Почему GUID в ссылке ref= не совпадает с результатом УникальныйИдентификатор()?
Это одно и то же значение в разном порядке байтов. Навигационная ссылка показывает байты так, как они лежат в СУБД.