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

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

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

Как в 1С получить ссылку на объект по уникальному идентификатору: метод ПолучитьСсылку, работа с GUID в запросах, обмене и внешних системах.

Уникальный идентификатор (GUID) — это 36-символьная строка вида «8b3b9c2e-1234-4abc-9def-0123456789ab», которую платформа 1С присваивает каждому объекту базы: элементу справочника, документу, записи плана обмена. По этому идентификатору можно однозначно восстановить ссылку на объект, даже если код или наименование изменились.

Задача получения ссылки по GUID возникает регулярно: при интеграции с внешними системами (сайт, CRM, мобильное приложение), при обмене между базами 1С, при восстановлении «битых» ссылок и при отладке. Внешние системы хранят именно идентификаторы, а не внутренние ссылки, поэтому уметь преобразовывать GUID в ссылку и обратно — базовый навык разработчика и администратора 1С.

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

Что такое уникальный идентификатор в 1С и где он хранится

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

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

Получить GUID существующей ссылки можно методом УникальныйИдентификатор():

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

СтрокаGUID = Строка(GUID); // "8b3b9c2e-..."

Базовый способ: метод ПолучитьСсылку()

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

СтрокаGUID = "8b3b9c2e-1234-4abc-9def-0123456789ab";

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

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

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

Для документов синтаксис идентичен:

СсылкаДок = Документы.РеализацияТоваровУслуг.ПолучитьСсылку(Ид);
Порядок действий
  1. 1
    Определите тип объекта: справочник, документ или другой ссылочный тип
  2. 2
    Преобразуйте строку GUID в тип УникальныйИдентификатор через конструктор
  3. 3
    Вызовите ПолучитьСсылку(Ид) у менеджера нужного типа
  4. 4
    Проверьте, что ссылка указывает на существующий объект, запросом или через ПолучитьОбъект()
  5. 5
    Используйте ссылку: установите в реквизит, получите объект для редактирования

Проверка существования объекта по ссылке

Критически важный момент: ПолучитьСсылку() не проверяет, есть ли объект с таким GUID в базе. Метод всегда возвращает формально корректную ссылку, даже если объект удалён или никогда не существовал. Такая ссылка называется «битой», и при обращении к её реквизитам вы получите строку вида «<Объект не найден>».

Проверить существование объекта можно запросом — это самый быстрый способ, не требующий чтения всего объекта:

Запрос = Новый Запрос;

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

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

ОбъектСуществует = Не Запрос.Выполнить().Пустой();

Альтернативный вариант — попытаться получить объект и проверить на Неопределено:

Объект = Ссылка.ПолучитьОбъект();

Если Объект = Неопределено Тогда

// объекта нет в базе

КонецЕсли;

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

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

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

Ссылка после ПолучитьСсылку
Норма

Запрос по ссылке возвращает одну строку

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

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

Представление ссылки
Норма

Выводится наименование или номер объекта

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

Отображается «<Объект не найден>»

Тип ссылки
Норма

ТипЗнч(Ссылка) соответствует ожидаемому типу

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

GUID подан в менеджер другого типа

Получение GUID из ссылки и обратное преобразование в обмене

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

// Отдаём наружу

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

// Принимаем обратно

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

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

Если тип объекта заранее неизвестен (внешняя система присылает идентификаторы разных сущностей), передавайте вместе с GUID имя типа и выбирайте менеджер через Справочники[ИмяТипа] или Документы[ИмяТипа].

При обмене между базами 1С через типовые механизмы (конвертация данных, универсальный формат EnterpriseData) сопоставление по GUID выполняется автоматически, и вручную вызывать ПолучитьСсылку обычно не требуется. Ручная работа нужна при самописных обменах через HTTP, файлы или веб-сервисы.

GUID в запросах и поиск по строковому представлению

Передать GUID в запрос напрямую нельзя — запрос работает со ссылками, а не с идентификаторами. Поэтому строку GUID сначала преобразуют в ссылку через ПолучитьСсылку, а уже ссылку передают параметром. Это стандартный и единственный корректный путь.

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

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

Особые случаи и ограничения

Перечисления и предопределённые значения

У перечислений нет метода ПолучитьСсылку с GUID — значения перечислений определяются в конфигурации и идентифицируются по имени. Попытка применить к ним тот же подход приведёт к ошибке компиляции или выполнения.

Новый объект с заданным GUID

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

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

НовыйОбъект.УстановитьСсылкуНового(СсылкаИзИсточника);

НовыйОбъект.Наименование = "Загружено из обмена";

НовыйОбъект.Записать();

Разный порядок байтов в COM и SQL

При работе с GUID через COM-соединение, прямые запросы к SQL или внешние компоненты можно столкнуться с тем, что идентификатор выглядит «перевёрнутым»: группы байтов идут в другом порядке. Это следствие разного представления GUID в платформе 1С и в СУБД. Прямая работа с базой средствами SQL не поддерживается вендором и может нарушить целостность данных — используйте её только для чтения и только понимая риски.

Типичные ошибки при работе с GUID

Типичные ошибки
01
Использовать ПолучитьСсылку без проверки существования — в реквизит записывается битая ссылка, которая позже ломает отчёты и проведение документов
02
Передавать строку GUID напрямую в ПолучитьСсылку без конструктора Новый УникальныйИдентификатор — возникает ошибка несоответствия типов
03
Искать объект по GUID в неправильном типе: идентификатор контрагента подставляется в менеджер номенклатуры, итог — ссылка на несуществующий объект без какой-либо ошибки
04
Сравнивать GUID строковым сравнением с учётом регистра: внешняя система присылает идентификатор в верхнем регистре, и сравнение строк даёт ложное несовпадение
05
Пытаться получить GUID в тексте запроса — такой функции в языке запросов нет, идентификатор вычисляется только в коде

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

Как выбрать подход под свою задачу

Маршрут решения

Как выбрать действие

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

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

Итог

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

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

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

Можно ли получить ссылку по GUID, не зная тип объекта?

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

Почему ПолучитьСсылку вернул ссылку, а объекта в базе нет?

Метод не обращается к данным — он просто конструирует ссылку из типа и идентификатора. Если объект удалён или GUID ошибочен, вы получите «битую» ссылку. Проверяйте существование запросом или через ПолучитьОбъект() с проверкой на Неопределено.

Как получить GUID элемента справочника в пользовательском режиме?

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

Меняется ли GUID при переносе объекта между базами?

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

Можно ли использовать GUID в запросе напрямую?

Нет, язык запросов работает со ссылками, а не с идентификаторами, и функции получения GUID в запросе не существует. Сначала преобразуйте строку в ссылку через ПолучитьСсылку в коде, затем передайте ссылку параметром запроса.

Что делать, если GUID из SQL или COM выглядит «перевёрнутым»?

Это различие порядка байтов в представлении идентификатора между платформой и СУБД. Для разовой задачи существуют функции перестановки байтов, но надёжнее получать GUID штатно — через COM-объект 1С, веб-сервис или выгрузку из самой базы, а не прямыми запросами к таблицам.