Уникальный идентификатор ссылки в 1С: где его увидеть и как достать кодом
Содержание
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 одного-двух объектов.
- Откройте базу в Конфигураторе.
- Запустите отладку:
Отладка → Начать отладку → Тонкий клиент(или клавишаF5). - Остановитесь в любом месте, где доступна ссылка на нужный объект. Проще всего поставить точку останова в модуле формы объекта, например в обработчике
ПриОткрытии, и открыть элемент. - Нажмите
Shift+F9— откроется окно «Вычислить выражение». - Введите выражение и нажмите «Рассчитать»:
Строка(Объект.Ссылка.УникальныйИдентификатор())
В форме элемента справочника или документа основной реквизит обычно называется Объект. В модуле объекта используйте Ссылка.УникальныйИдентификатор(), в форме списка — Элементы.Список.ТекущаяСтрока.УникальныйИдентификатор().
Отладка в клиент-серверной базе требует, чтобы на сервере 1С была разрешена отладка. Включать её на рабочем сервере в разгар дня не стоит: это решение администратора, и оно влияет на всех пользователей кластера.
Значение из окна можно скопировать. Если выражение помещено в «Табло», оно пересчитывается на каждом шаге, что удобно при переборе объектов в цикле.
Способ 2. Навигационная ссылка: GUID в пользовательском режиме
Без Конфигуратора идентификатор можно извлечь из навигационной ссылки. Откройте объект и нажмите Shift+F11 — это команда «Получить ссылку». Появится строка вида:
e1cib/data/Справочник.Номенклатура?ref=8a1c00155d01234511ee2b4d5f3a9c1e
После ref= стоят те же 16 байт, но в другом порядке, без дефисов. Это порядок, в котором байты лежат в поле _IDRRef таблицы СУБД. Чтобы получить привычный GUID, разбейте 32 символа на группы и переставьте:
Позиции в ref | Длина | Куда идёт в GUID |
|---|---|---|
| 25–32 | 8 | первая группа |
| 21–24 | 4 | вторая группа |
| 17–20 | 4 | третья группа |
| 1–4 | 4 | четвёртая группа |
| 5–16 | 12 | пятая группа |
Пример: 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Сс составным типом. Удобно выбрать все ссылочные типы сразу через флажки групп («Любая ссылка» на справочники, документы и т. д.). - Добавьте реквизит
GUIDтипа «Строка» длиной 36. - Создайте форму, выведите оба реквизита и кнопку «Показать GUID».
- В модуле формы:
&НаКлиенте
Процедура ПоказатьGUID(Команда)
Если ЗначениеЗаполнено(Объект.Объект1С) Тогда
Объект.GUID = XMLСтрока(Объект.Объект1С);
Иначе
Объект.GUID = "";
КонецЕсли;
КонецПроцедуры
XMLСтрока() доступна на клиенте, поэтому серверный вызов здесь не нужен. Сохраните обработку и открывайте через Файл → Открыть. Права на открытие внешних обработок у пользователя должны быть.
Способ 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Строка(), OData | 5f3a9c1e-2b4d-11ee-8a1c-00155d012345 | GUID с дефисами |
Навигационная ссылка ref= | 8a1c00155d01234511ee2b4d5f3a9c1e | байты СУБД |
Поле _IDRRef в СУБД | 0x8A1C00155D01234511EE2B4D5F3A9C1E | байты СУБД |
| Битая ссылка | (45:8a1c00155d01234511ee2b4d5f3a9c1e) | номер таблицы + байты СУБД |
Читать таблицы напрямую можно, менять — нельзя. Запись в обход платформы ломает кеши, итоги регистров и целостность ссылок, а фирма 1С такие изменения не поддерживает. Любой эксперимент — только на копии базы.
GUID в обменах данными: почему объекты не дублируются
Обмены 1С опираются на GUID, потому что код и наименование могут совпасть случайно или поменяться. В XML-сообщении обмена ссылка записывается строковым идентификатором — тем же, что возвращает XMLСтрока().
Как это работает на практике:
- 🔁 Одинаковые конфигурации (распределённая база, обмен по одинаковым правилам). Объект в приёмнике создаётся с тем же GUID, что в источнике. Найти его в другой базе можно через
ПолучитьСсылку()с тем же идентификатором. - 🔀 Разные конфигурации (БП ↔ УТ, БП ↔ ЗУП). GUID в базах обычно разные. Соответствие хранится в регистре сведений БСП, где лежат пары «ссылка в этой базе — идентификатор в другой». По нему обмен понимает, что «Иванов» из ЗУП — это уже существующий «Иванов» в БП.
- 🆕 Создание объекта с заданным GUID. Перед записью нового объекта вызовите
УстановитьСсылкуНового():
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.УстановитьСсылкуНового(
Справочники.Номенклатура.ПолучитьСсылку(
Новый УникальныйИдентификатор("5f3a9c1e-2b4d-11ee-8a1c-00155d012345")));
НовыйЭлемент.Наименование = "Товар из внешней системы";
НовыйЭлемент.Записать();
Так загружают данные из внешних систем, чтобы повторная загрузка находила тот же объект, а не плодила дубли. Если объект с таким GUID уже есть, запись завершится ошибкой.
Дубли после обмена почти всегда означают, что сопоставление по GUID не сработало. Проверьте, не очищали ли регистр соответствий и не загружали ли базу-приёмник заново из файла с другими идентификаторами.
Частые вопросы
Меняется ли GUID при копировании базы через .dt?
УстановитьСсылкуНового().