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

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

Как найти объект по GUID в 1С

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

GUID (глобальный уникальный идентификатор) — это 36-символьная строка вида «a3f1c2e4-5b6d-4e7f-8a9b-0c1d2e3f4a5b», которую платформа 1С присваивает каждой ссылке на объект базы: элементу справочника, документу, плану видов характеристик. Поиск объекта по GUID требуется при интеграции с внешними системами, разборе ошибок обмена, восстановлении утерянных ссылок и анализе сообщений вида «Объект не найден».

Задача решается несколькими способами: программно через метод ПолучитьСсылку(), универсальным запросом по всем таблицам конфигурации или штатными средствами вроде консоли кода и обработок поиска. Выбор зависит от того, известен ли тип объекта, есть ли доступ к конфигуратору и насколько велика база.

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

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

GUID формируется платформой при создании объекта и не меняется на протяжении всей жизни ссылки, включая перенос между базами при обмене. Именно поэтому он используется как ключ сопоставления в механизмах синхронизации данных, веб-сервисах и HTTP-API.

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

СтрокаGUID = XMLСтрока(СсылкаНаОбъект);

// или

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

Также GUID встречается в текстах ошибок обмена («Объект не найден: a3f1c2e4-...»), в журнале регистрации, в XML-файлах выгрузки и в данных внешних систем, интегрированных с 1С. Оттуда его обычно и приходится искать.

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

Самый простой сценарий — вы знаете, что GUID принадлежит, например, справочнику «Контрагенты». Тогда используется метод менеджера объекта:

Ид = Новый УникальныйИдентификатор("a3f1c2e4-5b6d-4e7f-8a9b-0c1d2e3f4a5b");

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

Если Ссылка.ПолучитьОбъект() = Неопределено Тогда

Сообщить("Объект с таким GUID не найден в справочнике");

Иначе

Сообщить("Найден: " + Ссылка);

КонецЕсли;

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

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

bsl
Ид = Новый УникальныйИдентификатор(СтрокаGUID);
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(Ид);
Если Не Ссылка.ПолучитьОбъект() = Неопределено Тогда
    Сообщить(Ссылка);
КонецЕсли;

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

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

Функция НайтиСсылкуПоGUID(СтрокаGUID)

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

Коллекции = Новый Массив;

Коллекции.Добавить(Справочники);

Коллекции.Добавить(Документы);

Коллекции.Добавить(ПланыВидовХарактеристик);

Коллекции.Добавить(ПланыСчетов);

Коллекции.Добавить(ПланыВидовРасчета);

Коллекции.Добавить(БизнесПроцессы);

Коллекции.Добавить(Задачи);

Для Каждого Менеджер Из Коллекции Цикл

Для Каждого Мета Из Менеджер ЦиклТипы(Менеджер) Цикл

КонецЦикла;

КонецЦикла;

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

На практике удобнее проверять существование не через ПолучитьОбъект() (это чтение всего объекта из базы), а через лёгкий запрос вида ВЫБРАТЬ ПЕРВЫЕ 1 Т.Ссылка ИЗ Справочник.Контрагенты КАК Т ГДЕ Т.Ссылка = &Ссылка. Так перебор работает заметно быстрее, особенно на больших базах.

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

Универсальный поиск по GUID
  1. 1
    Приведите строку к типу УникальныйИдентификатор через конструктор
  2. 2
    Переберите коллекции метаданных: справочники, документы, планы видов характеристик и другие ссылочные типы
  3. 3
    Для каждого типа получите ссылку через ПолучитьСсылку и проверьте существование лёгким запросом
  4. 4
    Остановитесь на первом найденном совпадении и выведите тип и представление объекта
  5. 5
    Если ничего не найдено — выведите сообщение об отсутствии объекта в базе

Поиск через консоль кода и готовые обработки

Если нет возможности изменять конфигурацию, используйте внешние инструменты. Консоль кода (консоль запросов с возможностью выполнения произвольного кода) позволяет вставить фрагмент поиска и выполнить его прямо в пользовательском режиме под полными правами. Это стандартный приём администраторов и аналитиков.

Также существуют универсальные внешние обработки «Поиск объекта по GUID», которые делают ровно описанный перебор по метаданным и выводят результат в виде таблицы: тип объекта, представление, ссылка. Они удобны, когда искать по GUID приходится регулярно, например при сопровождении обменов.

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

Особый случай: битые ссылки и «Объект не найден»

Частая ситуация — в базе есть ссылка на объект, которого уже нет (удалён без контроля целостности, потерян при обмене). В интерфейсе она отображается как «<Объект не найден> (a3f1c2e4-...)». По этому GUID объект найти нельзя — его физически нет в таблице, и ПолучитьОбъект() вернёт Неопределено.

Что можно сделать: найти сам объект в базе-источнике по тому же GUID и перенести его, либо восстановить объект, создав его с нужной ссылкой через ПолучитьСсылку и запись нового объекта с этой ссылкой (метод УстановитьСсылкуНового). Второй вариант — крайняя мера: объект будет пустым, и все его реквизиты придётся заполнять вручную или из копии.

Проверить, является ли ссылка битой, можно запросом: если запрос по ссылке не вернул строк, а ссылка при этом где-то используется (находится через НайтиПоСсылкам), значит это классическая битая ссылка.

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

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

В толстом и тонком клиенте можно скопировать навигационную ссылку на объект (команда «Получить ссылку» в меню формы). Она имеет вид e1cib/data/Справочник.Контрагенты?ref=a3f1c2e4.... Значение после ref= — это GUID в особом, «перевёрнутом» порядке байт, а не стандартное текстовое представление. Напрямую подставить его в Новый УникальныйИдентификатор() нельзя — потребуется преобразование.

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

В XML-файлах выгрузки (например, из планов обмена) ссылки хранятся в формате Ref="a3f1c2e4-..." в стандартном виде — такой GUID можно использовать напрямую.

Проверка результата и границы применения

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

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

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

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

Существование объекта
Норма

Лёгкий запрос по ссылке вернул строку, объект открывается в интерфейсе

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

Запрос пуст, в интерфейсе отображается «Объект не найден»

Тип найденного объекта
Норма

Тип соответствует ожидаемому (например, СправочникСсылка.Контрагенты)

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

GUID найден в другом типе — возможно, исходные данные неверны

Формат GUID
Норма

Конструктор УникальныйИдентификатор отработал без исключения

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

Ошибка преобразования строки — проверьте пробелы, скобки и порядок байт

Итог

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

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

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

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

Штатными средствами интерфейса — нет. Нужна либо консоль кода, либо внешняя обработка поиска по GUID. Если программный доступ закрыт, попросите администратора выполнить поиск или предоставить готовую обработку.

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

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

Как найти, где используется объект с известным GUID?

Используйте метод НайтиПоСсылкам: передайте массив с одной ссылкой, и платформа вернёт таблицу всех объектов и полей, где эта ссылка встречается. Это удобно перед удалением объекта или при поиске битых ссылок.

GUID из навигационной ссылки не находится — в чём причина?

В навигационной ссылке GUID записан в перевёрнутом порядке байт. Его нужно преобразовать в стандартный текстовый вид специальной функцией, и только после этого передавать в конструктор УникальныйИдентификатор.

Можно ли найти по GUID запись регистра сведений?

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

Сохранится ли GUID при переносе объекта в другую базу?

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