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

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

Как найти элемент справочника 1С по GUID

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

GUID (глобальный уникальный идентификатор) в 1С — это 36-символьная строка вида 8b3b2c1a-5e6f-4a7b-9c8d-1e2f3a4b5c6d, которая однозначно определяет объект базы данных независимо от его кода и наименования. Поиск элемента справочника по GUID требуется при разборе ошибок обмена, при интеграции с внешними системами, при анализе битых ссылок и при отладке обработчиков загрузки данных.

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

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

Что такое GUID в 1С и где его взять

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

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

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

Если вы знаете, к какому справочнику относится идентификатор, задача решается одной строкой кода. Метод менеджера справочника ПолучитьСсылку создаёт ссылку из GUID:

СтрокаGUID = "8b3b2c1a-5e6f-4a7b-9c8d-1e2f3a4b5c6d";

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

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

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

Поэтому после получения ссылки всегда проверяйте её существование. Самый надёжный способ — запрос:

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

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

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

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

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

КонецЕсли;

Поиск по всем справочникам, когда тип объекта неизвестен

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

Функция НайтиОбъектПоGUID(СтрокаGUID)

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

Для Каждого МетаСправочник Из Метаданные.Справочники Цикл

Менеджер = Справочники[МетаСправочник.Имя];

Ссылка = Менеджер.ПолучитьСсылку(Идентификатор);

Запрос = Новый Запрос("ВЫБРАТЬ Т.Ссылка ИЗ Справочник."

+ МетаСправочник.Имя + " КАК Т ГДЕ Т.Ссылка = &Ссылка");

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

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

Возврат Ссылка;

КонецЕсли;

КонецЦикла;

Возврат Неопределено;

КонецФункции

Если объект может быть не только справочником, но и документом или планом видов характеристик, цикл расширяют на соответствующие коллекции метаданных: Метаданные.Документы, Метаданные.ПланыВидовХарактеристик, Метаданные.ПланыСчетов и другие ссылочные типы.

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

Порядок действий при неизвестном типе
  1. 1
    Скопируйте GUID из ошибки, файла обмена или внешней системы и уберите лишние пробелы и кавычки
  2. 2
    Откройте консоль кода в режиме предприятия с правами, достаточными для чтения всех справочников
  3. 3
    Выполните функцию перебора по метаданным справочников, документов и ПВХ
  4. 4
    Если объект найден — выведите его ссылку, тип и представление
  5. 5
    Если объект не найден нигде — проверьте, не из другой ли базы этот GUID

Поиск через запрос напрямую по GUID

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

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

Запрос.Текст =

"ВЫБРАТЬ Т.Ссылка, Т.Код, Т.Наименование, Т.ПометкаУдаления

|ИЗ Справочник.Контрагенты КАК Т

|ГДЕ Т.Ссылка = &ИскомаяСсылка";

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

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

Результат = Запрос.Выполнить().Выбрать();

Если Результат.Следующий() Тогда

Сообщить("Найден: " + Результат.Наименование);

КонецЕсли;

Этот вариант удобен в отчётах и обработках СКД, где GUID передаётся как параметр. Проверка поля ПометкаУдаления здесь не случайна: помеченный на удаление элемент существует в базе и находится по GUID, но использовать его в учёте уже нельзя — это частая причина «странных» ошибок после обмена.

Битые ссылки: как распознать и что с ними делать

Битая ссылка возникает, когда GUID известен, но объект физически отсутствует в базе: удалён напрямую, удалён обработкой свёртки, либо обмен прислал ссылку раньше самого объекта. Внешний признак — представление вида «<Объект не найден>» в списках и отчётах.

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

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

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

Особые случаи: навигационная ссылка, COM и веб-сервисы

В тонком и веб-клиенте у каждого открытого объекта есть навигационная ссылка вида e1cib/data/Справочник.Номенклатура?ref=.... Хвост после ref= — это тот же GUID, но в перевёрнутом порядке байтов и без дефисов. Извлечь из него привычный GUID можно штатной функцией, если она есть в конфигурации (в БСП — методы работы с навигационными ссылками), либо вручную перестановкой байтов. Тип объекта здесь, наоборот, виден сразу — он указан в самой ссылке, что упрощает поиск.

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

Сравнение способов поиска

ПолучитьСсылку + запрос

Быстрый и надёжный вариант, когда тип справочника известен. Требует явной проверки существования

Перебор по метаданным

Подходит, когда тип объекта неизвестен. Медленный, только для разовой диагностики в консоли кода

Поиск по навигационной ссылке

Удобен в веб-клиенте: тип виден из ссылки, GUID нужно преобразовать из перевёрнутого формата

ПоискПоСсылкам (битые ссылки)

Нужен для поиска мест использования уже найденной или битой ссылки, а не самого элемента

Проверка результата и границы безопасной работы

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

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

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

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

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

Выводится код и наименование элемента

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

«<Объект не найден> (…» — ссылка битая

Запрос на существование
Норма

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

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

Пустой результат — объекта нет в этой таблице

Пометка удаления
Норма

Пометка снята, элемент используется в учёте

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

Элемент помечен на удаление — для обмена это источник ошибок

Повторный обмен
Норма

Ошибка по GUID больше не появляется в журнале

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

Ошибка повторяется — объект не зарегистрирован к выгрузке в источнике

Итог

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

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

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

Можно ли найти элемент по GUID без программирования?

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

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

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

GUID пришёл из файла обмена XML, а в базе его нет. Что делать?

Скорее всего, объект не был зарегистрирован к выгрузке в базе-источнике или был удалён до выгрузки. Проверьте регистрацию объекта в узле обмена источника, выполните повторную выгрузку конкретного объекта и загрузите пакет заново. Создавать элемент вручную стоит только как временную меру.

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

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

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

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

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

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