К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как получить уникальный идентификатор объекта в 1С

Как получить уникальный идентификатор объекта в 1С: метод УникальныйИдентификатор(), получение ссылки по GUID, типовые ошибки и примеры кода для разработчика.

Уникальный идентификатор (GUID, UUID) — это системный ключ, который платформа 1С присваивает каждой ссылке на объект базы: элементу справочника, документу, записи плана счетов и так далее. Он не зависит от кода, наименования и номера, не меняется при редактировании объекта и используется в обменах данными, веб-сервисах, интеграциях и механизмах сопоставления объектов между базами.

Разработчику идентификатор нужен в двух типовых ситуациях: когда из 1С требуется передать объект во внешнюю систему и когда по известному GUID нужно найти объект в базе. Обе задачи решаются штатными средствами встроенного языка, без внешних компонент. Ниже — конкретные способы получения идентификатора, обратный поиск ссылки по GUID, особенности для разных типов объектов и типичные ошибки.

Что такое уникальный идентификатор и где он используется

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

Идентификатор участвует в механизмах обмена данными: именно по нему планы обмена и типовые синхронизации сопоставляют объекты разных баз. Он же используется в HTTP-сервисах, REST-интеграциях, при выгрузке в форматы XML и JSON, а также в механизме «Получить ссылку» для быстрой навигации по базе.

Важно понимать ограничение: GUID есть только у ссылочных типов данных. У записей регистров сведений, накопления, бухгалтерии и расчета собственного идентификатора нет — там записи идентифицируются ключом записи (измерениями, периодом, регистратором).

Как получить GUID объекта в коде

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

// Получение GUID у существующей ссылки

СсылкаНаТовар = Справочники.Номенклатура.НайтиПоКоду("000000123");

Если Не СсылкаНаТовар.Пустая() Тогда

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

СтрокаGUID = Строка(Идентификатор);

Сообщить("GUID объекта: " + СтрокаGUID);

КонецЕсли;

Если объект создан в коде, но еще не записан, ссылки у него нет, а значит, и идентификатор получить нельзя. Платформа позволяет заранее назначить ссылку новому объекту через метод УстановитьСсылкуНового() — это стандартный прием при обменах, когда GUID должен совпадать в двух базах.

НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();

НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(

Новый УникальныйИдентификатор("8a3f2c1d-5e6b-4a7c-9d8e-1f2a3b4c5d6e"));

НовыйЭлемент.УстановитьСсылкуНового(НоваяСсылка);

НовыйЭлемент.Наименование = "Товар из внешней системы";

НовыйЭлемент.Записать();

Как узнать GUID без программирования

Не всегда есть возможность писать код. В типовых конфигурациях и в режиме тонкого клиента идентификатор можно увидеть штатными средствами.

Через функцию «Получить ссылку»

В форме любого объекта в режиме предприятия доступна кнопка «Еще → Получить ссылку» (в ряде конфигураций — команда «Получить ссылку» в меню формы). Платформа покажет строку вида e1cib/data/Справочник.Номенклатура?ref=8a3f2c1d5e6b4a7c9d8e1f2a3b4c5d6e. Фрагмент после ref= — это и есть идентификатор объекта, только без дефисов и с переставленными байтами в начале (внутреннее представление), поэтому для передачи во внешнюю систему его нужно привести к стандартному виду через код.

Через консоль запросов или внешнюю обработку

Если в базе установлена типовая консоль кода или консоль запросов, можно выполнить простой запрос и в цикле вывести Ссылка.УникальныйИдентификатор(). Это удобно, когда нужно получить идентификаторы сразу для списка объектов — например, выгрузить GUID всей номенклатуры для настройки интеграции.

Порядок действий без кода
  1. 1
    Откройте нужный объект в режиме 1С:Предприятие
  2. 2
    Нажмите «Еще» и выберите команду «Получить ссылку»
  3. 3
    Скопируйте фрагмент после ref= из показанной строки
  4. 4
    Если нужен стандартный формат GUID с дефисами — получите его через код или консоль
  5. 5
    Проверьте результат поиском объекта обратным методом

Как найти объект по известному идентификатору

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

СтрокаИзВнешнейСистемы = "8a3f2c1d-5e6b-4a7c-9d8e-1f2a3b4c5d6e";

GUID = Новый УникальныйИдентификатор(СтрокаИзВнешнейСистемы);

СсылкаНаТовар = Справочники.Номенклатура.ПолучитьСсылку(GUID);

// Проверка, существует ли объект с такой ссылкой

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

Запрос.УстановитьПараметр("Ссылка", СсылкаНаТовар);

Если Запрос.Выполнить().Пустой() Тогда

Сообщить("Объект с таким GUID в базе отсутствует");

КонецЕсли;

Ключевой момент: ПолучитьСсылку() всегда возвращает ссылку, даже если объекта с таким GUID в базе нет. Поэтому проверять существование нужно отдельно — запросом, как в примере, или через попытку обращения к реквизитам (обращение к реквизиту «битой» ссылки вызовет ошибку, что менее надежно). Конструкция вида «если ссылка пустая» здесь не сработает — ссылка формально не пустая.

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

bsl
GUID = Новый УникальныйИдентификатор(СтрокаGUID); Ссылка = Справочники.Номенклатура.ПолучитьСсылку(GUID);

Особенности для разных типов объектов

Поведение идентификаторов немного различается в зависимости от вида объекта метаданных. Сводка ниже помогает быстро сориентироваться.

Тип объектаЕсть GUIDСпособ получения
СправочникиДаСсылка.УникальныйИдентификатор()
ДокументыДаСсылка.УникальныйИдентификатор()
Планы счетов, виды характеристикДаСсылка.УникальныйИдентификатор()
Планы обмена (узлы)ДаСсылка.УникальныйИдентификатор()
Задачи, бизнес-процессыДаСсылка.УникальныйИдентификатор()
Регистры сведений, накопленияНетИдентификация по ключу записи
ПеречисленияНет (как у ссылок)Идентификация по имени значения

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

Идентификаторы в запросах и динамических списках

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

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

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

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

// дальнейшая обработка

КонецЦикла;

Если нужно сравнить ссылки в запросе по идентификатору, передавайте в параметр не строку GUID, а саму ссылку, полученную через ПолучитьСсылку(). Сравнение строковых представлений в запросе не предусмотрено.

Типичные ошибки
01
Вызов УникальныйИдентификатор() у объекта вместо ссылки — получите ошибку или неверный результат; используйте Объект.Ссылка.УникальныйИдентификатор()
02
Попытка получить GUID у еще не записанного объекта — ссылки нет, идентификатор получить нельзя; сначала назначьте ссылку через УстановитьСсылкуНового()
03
Проверка существования объекта через Пустая() после ПолучитьСсылку() — ссылка всегда непустая, даже если объекта нет; проверяйте запросом
04
Передача строки из команды «Получить ссылку» во внешнюю систему без преобразования — внутренний формат отличается от стандартного GUID
05
Попытка получить GUID у записи регистра сведений — у записей регистров идентификатора нет, используйте ключ записи

Риски и ограничения при работе с GUID

Принудительное назначение идентификаторов через УстановитьСсылкуНового() — мощный, но опасный инструмент. Если в двух базах одному GUID назначить разные объекты, обмен данными начнет затирать данные или выдавать конфликты сопоставления. Назначайте ссылки вручную только в контролируемых сценариях миграции, где соответствие GUID строго проверено.

Еще одно ограничение касается производительности: массовый перебор ссылок ради получения строковых GUID в цикле по большой таблице создает заметную нагрузку. Для выгрузки сотен тысяч идентификаторов лучше использовать пакетную обработку с ограничением размера порции.

Наконец, помните, что при удалении объекта и создании нового «такого же» идентификатор будет другим. Если внешняя система хранит GUID, а объект в 1С удалили и завели заново, связь потеряется — для таких случаев в интеграциях предусматривают поиск по кодам или регистры соответствия.

Контрольные точки

Как проверить результат

Получен GUID в коде
Норма

Строка из 36 символов с дефисами, формат 8-4-4-4-12

Тревожный признак

Пустая строка или ошибка «Метод не обнаружен»

Обратный поиск по GUID
Норма

Запрос по ссылке вернул запись, реквизиты объекта читаются

Тревожный признак

Запрос пустой — объекта с таким GUID нет

Передача во внешнюю систему
Норма

Внешняя система находит объект по этому же идентификатору

Тревожный признак

Идентификатор скопирован из «Получить ссылку» без преобразования

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

Можно ли изменить GUID существующего объекта?

Штатными средствами — нет: идентификатор неизменен на протяжении жизни объекта. Обходной путь — создать новый объект с нужным GUID через УстановитьСсылкуНового() и перенести в него данные старого, но старый объект при этом придется удалить, а все ссылки на него в базе — переназначить.

Одинаковые ли GUID у объекта в разных базах после обмена?

В типовых механизмах синхронизации — обычно да: объект создается в базе-приемнике с тем же идентификатором, что и в источнике. Но если объект в приемнике был создан вручную до обмена, GUID будут разными, и система сопоставит их по правилам поиска, а не по идентификатору.

Как получить GUID в привычном виде из строки «Получить ссылку»?

Строка после ref= содержит идентификатор во внутреннем формате платформы. Самый надежный способ — скопировать ссылку целиком, открыть ее через «Переход по ссылке» или программно получить объект и вызвать УникальныйИдентификатор() у его ссылки.

Почему ПолучитьСсылку() возвращает ссылку на несуществующий объект?

Это штатное поведение: метод формирует ссылку по идентификатору без обращения к данным. Существование объекта проверяется отдельно запросом к таблице или попыткой чтения реквизитов. Такая ссылка называется «битой», если объекта под ней нет.

Есть ли GUID у предопределенных элементов?

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

Как выгрузить GUID всех элементов справочника в файл?

Выполните запрос по таблице справочника, в цикле получайте Строка(Ссылка.УникальныйИдентификатор()) и записывайте результат в текстовый файл, CSV или JSON через ЗаписьJSON. Для больших объемов обрабатывайте данные порциями, чтобы не перегружать память.

Итог

Что важно запомнить

GUID получают методом УникальныйИдентификатор() у ссылки; обратный поиск делают через ПолучитьСсылку() с обязательной проверкой существования объекта запросом. Идентификатор есть только у ссылочных типов, он неизменен и уникален. Ручное назначение GUID — только в контролируемых миграциях и после резервного копирования.