Разработка и Конфигурация · 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С:Предприятие
- 2Нажмите «Еще» и выберите команду «Получить ссылку»
- 3Скопируйте фрагмент после ref= из показанной строки
- 4Если нужен стандартный формат GUID с дефисами — получите его через код или консоль
- 5Проверьте результат поиском объекта обратным методом
Как найти объект по известному идентификатору
Обратная задача возникает при приеме данных из внешних систем: пришел GUID, нужно найти или создать объект. Для этого у менеджера каждого ссылочного типа есть метод ПолучитьСсылку(), принимающий значение типа УникальныйИдентификатор.
СтрокаИзВнешнейСистемы = "8a3f2c1d-5e6b-4a7c-9d8e-1f2a3b4c5d6e";
GUID = Новый УникальныйИдентификатор(СтрокаИзВнешнейСистемы);
СсылкаНаТовар = Справочники.Номенклатура.ПолучитьСсылку(GUID);
// Проверка, существует ли объект с такой ссылкой
Запрос = Новый Запрос("ВЫБРАТЬ 1 ИЗ Справочник.Номенклатура ГДЕ Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", СсылкаНаТовар);
Если Запрос.Выполнить().Пустой() Тогда
Сообщить("Объект с таким GUID в базе отсутствует");
КонецЕсли;
Ключевой момент: ПолучитьСсылку() всегда возвращает ссылку, даже если объекта с таким GUID в базе нет. Поэтому проверять существование нужно отдельно — запросом, как в примере, или через попытку обращения к реквизитам (обращение к реквизиту «битой» ссылки вызовет ошибку, что менее надежно). Конструкция вида «если ссылка пустая» здесь не сработает — ссылка формально не пустая.
Если тип объекта заранее неизвестен, GUID можно перебрать по всем ссылочным менеджерам через метаданные, но это медленный вариант, пригодный только для разовой диагностики, а не для рабочего обмена.
GUID = Новый УникальныйИдентификатор(СтрокаGUID); Ссылка = Справочники.Номенклатура.ПолучитьСсылку(GUID);Особенности для разных типов объектов
Поведение идентификаторов немного различается в зависимости от вида объекта метаданных. Сводка ниже помогает быстро сориентироваться.
| Тип объекта | Есть GUID | Способ получения |
|---|---|---|
| Справочники | Да | Ссылка.УникальныйИдентификатор() |
| Документы | Да | Ссылка.УникальныйИдентификатор() |
| Планы счетов, виды характеристик | Да | Ссылка.УникальныйИдентификатор() |
| Планы обмена (узлы) | Да | Ссылка.УникальныйИдентификатор() |
| Задачи, бизнес-процессы | Да | Ссылка.УникальныйИдентификатор() |
| Регистры сведений, накопления | Нет | Идентификация по ключу записи |
| Перечисления | Нет (как у ссылок) | Идентификация по имени значения |
Для регистров сведений в интеграциях обычно передают набор значений измерений или GUID регистратора. Для перечислений в обменах используют имя значения из конфигурации — метод XMLСтрока() или обращение по индексу.
Идентификаторы в запросах и динамических списках
В языке запросов прямого метода получения GUID нет: запрос возвращает ссылку, а идентификатор извлекается уже в коде при обходе выборки. Это частая причина лишних трудностей у начинающих разработчиков — они пытаются получить строку GUID прямо в тексте запроса.
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ НЕ ПометкаУдаления");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаGUID = Строка(Выборка.Ссылка.УникальныйИдентификатор());
// дальнейшая обработка
КонецЦикла;
Если нужно сравнить ссылки в запросе по идентификатору, передавайте в параметр не строку GUID, а саму ссылку, полученную через ПолучитьСсылку(). Сравнение строковых представлений в запросе не предусмотрено.
Риски и ограничения при работе с GUID
Принудительное назначение идентификаторов через УстановитьСсылкуНового() — мощный, но опасный инструмент. Если в двух базах одному GUID назначить разные объекты, обмен данными начнет затирать данные или выдавать конфликты сопоставления. Назначайте ссылки вручную только в контролируемых сценариях миграции, где соответствие GUID строго проверено.
Еще одно ограничение касается производительности: массовый перебор ссылок ради получения строковых GUID в цикле по большой таблице создает заметную нагрузку. Для выгрузки сотен тысяч идентификаторов лучше использовать пакетную обработку с ограничением размера порции.
Наконец, помните, что при удалении объекта и создании нового «такого же» идентификатор будет другим. Если внешняя система хранит GUID, а объект в 1С удалили и завели заново, связь потеряется — для таких случаев в интеграциях предусматривают поиск по кодам или регистры соответствия.
Как проверить результат
Строка из 36 символов с дефисами, формат 8-4-4-4-12
Пустая строка или ошибка «Метод не обнаружен»
Запрос по ссылке вернул запись, реквизиты объекта читаются
Запрос пустой — объекта с таким GUID нет
Внешняя система находит объект по этому же идентификатору
Идентификатор скопирован из «Получить ссылку» без преобразования
Частые вопросы
Можно ли изменить GUID существующего объекта?
Штатными средствами — нет: идентификатор неизменен на протяжении жизни объекта. Обходной путь — создать новый объект с нужным GUID через УстановитьСсылкуНового() и перенести в него данные старого, но старый объект при этом придется удалить, а все ссылки на него в базе — переназначить.
Одинаковые ли GUID у объекта в разных базах после обмена?
В типовых механизмах синхронизации — обычно да: объект создается в базе-приемнике с тем же идентификатором, что и в источнике. Но если объект в приемнике был создан вручную до обмена, GUID будут разными, и система сопоставит их по правилам поиска, а не по идентификатору.
Как получить GUID в привычном виде из строки «Получить ссылку»?
Строка после ref= содержит идентификатор во внутреннем формате платформы. Самый надежный способ — скопировать ссылку целиком, открыть ее через «Переход по ссылке» или программно получить объект и вызвать УникальныйИдентификатор() у его ссылки.
Почему ПолучитьСсылку() возвращает ссылку на несуществующий объект?
Это штатное поведение: метод формирует ссылку по идентификатору без обращения к данным. Существование объекта проверяется отдельно запросом к таблице или попыткой чтения реквизитов. Такая ссылка называется «битой», если объекта под ней нет.
Есть ли GUID у предопределенных элементов?
Да, предопределенные элементы справочников и планов видов характеристик — обычные ссылочные объекты, у них есть идентификатор. Дополнительно они идентифицируются по имени предопределенных данных, что в обменах часто удобнее GUID.
Как выгрузить GUID всех элементов справочника в файл?
Выполните запрос по таблице справочника, в цикле получайте Строка(Ссылка.УникальныйИдентификатор()) и записывайте результат в текстовый файл, CSV или JSON через ЗаписьJSON. Для больших объемов обрабатывайте данные порциями, чтобы не перегружать память.
Что важно запомнить
GUID получают методом УникальныйИдентификатор() у ссылки; обратный поиск делают через ПолучитьСсылку() с обязательной проверкой существования объекта запросом. Идентификатор есть только у ссылочных типов, он неизменен и уникален. Ручное назначение GUID — только в контролируемых миграциях и после резервного копирования.