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

Администрирование · 11 мин

Как найти объект по ГУИДу в 1С

Способы найти объект по ГУИДу в 1С: универсальная обработка, запрос, код на встроенном языке. Как узнать GUID элемента и восстановить ссылку после обмена.

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

Типовая ситуация: после обмена с другой базой или сайтом в журнале регистрации есть только строка вида 8d2f1c3a-9b4e-4a1f-b2c3-5d6e7f8a9b0c, а какой это контрагент или документ — непонятно. Или наоборот: нужно узнать ГУИД конкретного элемента, чтобы выгрузить его во внешнюю систему. Обе задачи решаются штатными средствами платформы без доработки конфигурации.

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

Что такое ГУИД объекта и где он встречается

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

На практике ГУИД чаще всего встречается в четырёх местах: в журнале регистрации при ошибках обмена, в планах обмена и регистрации изменений, в интеграциях с внешними системами (сайты, CRM, веб-сервисы) и в «битых ссылках» — когда объект удалён, а ссылка на него осталась и отображается как «Объект не найден» с тем самым идентификатором.

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

Способ 1. Универсальная обработка поиска по ГУИДу

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

Порядок работы стандартный: откройте обработку через «Файл → Открыть» в режиме предприятия, вставьте строку идентификатора в поле ввода и нажмите «Найти». Обработка покажет тип объекта (справочник, документ и т.д.), его представление и позволит открыть форму элемента двойным щелчком.

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

Если поиск завершился без результата, это почти всегда означает одно из двух: объект с таким ГУИДом удалён (и вы нашли причину битой ссылки) либо идентификатор относится к другой базе — той, откуда пришёл обмен.

Способ 2. Поиск кодом на встроенном языке

Когда тип объекта известен, достаточно нескольких строк кода в консоли кода или во внешней обработке. Метод ПолучитьСсылку() создаёт ссылку из уникального идентификатора, после чего нужно проверить, существует ли объект в базе.

ГУИД = Новый УникальныйИдентификатор("8d2f1c3a-9b4e-4a1f-b2c3-5d6e7f8a9b0c");

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

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

Сообщить("Объект не найден — ссылка битая");

Иначе

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

КонецЕсли;

Если тип объекта неизвестен, переберите все ссылочные метаданные в цикле. Учтите, что ПолучитьОбъект() для проверки существования работает медленно на больших базах; для справочников и документов быстрее выполнить запрос по ссылке и проверить, вернул ли он строку.

Способ 3. Поиск запросом

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

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

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

"ВЫБРАТЬ

| Контрагенты.Ссылка КАК Ссылка

|ИЗ

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

|ГДЕ

| Контрагенты.Ссылка = &Ссылка";

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

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

Новый УникальныйИдентификатор("8d2f1c3a-...")));

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

Если Не Результат.Пустой() Тогда

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

КонецЕсли;

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

Обратная задача: узнать ГУИД известного объекта

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

ГУИДСтрокой = Строка(КонтрагентСсылка.УникальныйИдентификатор());

Сообщить(ГУИДСтрокой); // "8d2f1c3a-9b4e-4a1f-b2c3-5d6e7f8a9b0c"

В пользовательском режиме без программирования ГУИД можно увидеть в динамическом списке, если вывести колонку «Ссылка» и добавить для неё вычисляемое поле, но проще всего воспользоваться всё той же универсальной обработкой или консолью кода. Часть конфигураций на БСП содержит готовую команду вывода уникального идентификатора в дополнительных отчетах и обработках.

Особенности представления ГУИДа при обмене и в SQL

Одна из главных ловушек — разные форматы записи одного и того же идентификатора. В интерфейсе 1С и встроенном языке ГУИД выглядит как 8d2f1c3a-9b4e-4a1f-b2c3-5d6e7f8a9b0c. Но при просмотре данных напрямую в СУБД (MS SQL, PostgreSQL) тот же идентификатор хранится в инвертированном виде: порядок байтов внутри групп переставлен.

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

Ещё одна особенность: в битой ссылке «Объект не найден (8d2f1c3a:9b4e...)» идентификатор показан в сокращённом внутреннем формате с двоеточием. Его нельзя напрямую передать в конструктор Новый УникальныйИдентификатор() — сначала преобразуйте в стандартный вид через функцию разбора или обработку.

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

Как проверить результат и восстановить удалённый объект

После поиска убедитесь, что найден именно тот объект. Сверьте тип (справочник/документ), представление и ключевые реквизиты с контекстом задачи: например, если искали контрагента из ошибки обмена, сверьте ИНН или наименование с данными во второй базе.

Если объект не найден, а ссылка на него есть — перед вами классическая битая ссылка. Вариантов действия два: восстановить объект с тем же ГУИДом (создать элемент и присвоить ему нужный идентификатор через УстановитьСсылкуНового() либо повторно загрузить из источника обмена) или очистить битые ссылки штатной обработкой «Поиск и удаление дублей» / групповым изменением реквизитов, если объект восстанавливать не нужно.

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

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

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

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

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

Найден объект другого типа — вероятно, ГУИД скопирован не полностью или с ошибкой

Существование ссылки
Норма

Запрос по ссылке возвращает строку, объект открывается в форме

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

ПолучитьОбъект() возвращает Неопределено — объект удалён, ссылка битая

Совпадение данных
Норма

Реквизиты объекта совпадают с данными во второй базе обмена

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

ГУИД найден, но данные расходятся — базы рассинхронизированы, нужен анализ обмена

Итог

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

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

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

Можно ли найти объект по ГУИДу, не зная его типа?

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

Почему конструктор Новый УникальныйИдентификатор() выдаёт ошибку?

Чаще всего строка содержит лишние символы: угловые скобки из текста битой ссылки, пробелы, двоеточие вместо дефиса или фигурные скобки. Строка должна содержать ровно 36 символов в формате 8-4-4-4-12 шестнадцатеричных цифр, разделённых дефисами. Очистите строку перед передачей в конструктор.

Как восстановить объект с нужным ГУИДом после удаления?

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

Одинаковы ли ГУИДы одного объекта в разных базах 1С?

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

Можно ли искать по ГУИДу напрямую в базе SQL?

Технически да, но идентификатор в таблицах СУБД хранится в инвертированном байтовом представлении, поэтому строку из интерфейса 1С нужно преобразовать. Кроме того, прямое обращение к СУБД в обход платформы не поддерживается для модификации данных и требует понимания структуры хранения. Для разовых задач безопаснее использовать средства встроенного языка.

Что делать, если по ГУИДу ничего не находится ни в одной базе?

Проверьте три вещи: корректность самой строки (полнота, формат, отсутствие лишних символов), ту ли базу вы ищете (идентификатор мог прийти из третьей системы — сайта, CRM, архивной копии) и не был ли объект удалён до вашего поиска. Если обмен шёл через файлы, поднимите архивные копии базы-источника и поищите там.