Администрирование · 12 мин
Как найти ссылку по GUID в 1С
Как найти ссылку на объект 1С по GUID: запрос через ПолучитьСсылку, обработка поиска, восстановление битых ссылок и проверка результата в базе.
GUID (глобальный уникальный идентификатор) в 1С — это внутренний идентификатор объекта базы данных, который присваивается каждому элементу справочника, документу, записи регистра при создании и не меняется на протяжении всей жизни объекта. Именно по GUID объекты сопоставляются при обмене данными между базами, при интеграции с сайтами и внешними системами. Поэтому задача «найти ссылку по GUID» возникает регулярно: при разборе ошибок обмена, при поиске «битых» ссылок, при сопоставлении данных из загруженного файла с объектами базы.
Ссылка в 1С — это не строка и не код объекта, а особый тип данных, который содержит GUID и тип объекта. Получить ссылку по известному GUID можно штатными средствами встроенного языка, без прямого обращения к таблицам СУБД. Дальнейшие действия зависят от того, известен ли тип объекта, существует ли объект в базе и какой инструмент доступен: конфигуратор, консоль запросов, внешняя обработка или режим предприятия.
Важно понимать разницу между двумя ситуациями. Первая — объект с таким GUID существует, и нужно просто получить на него ссылку для дальнейшей работы. Вторая — объекта в базе нет (например, его удалили), но GUID известен из сообщения обмена или текста «битой» ссылки вида <Объект не найден> (123:8a9b...). Для каждой ситуации есть свой порядок действий, и оба разобраны ниже.
Что такое GUID и ссылка в 1С и чем они отличаются
GUID в 1С представлен типом «УникальныйИдентификатор» — это 128-битное значение, которое в строковом виде выглядит как 8a9b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d. Платформа генерирует его автоматически при записи нового объекта. У двух разных объектов в одной базе не может быть одинакового GUID, а при типовом обмене GUID объекта сохраняется одинаковым в обеих базах — на этом строится вся синхронизация.
Ссылка — это типизированный указатель на объект: помимо GUID она содержит информацию о том, к какому виду метаданных относится объект (справочник «Номенклатура», документ «Реализация товаров» и т.д.). Поэтому одного GUID недостаточно, чтобы однозначно получить ссылку: нужно знать или определить тип объекта. Один и тот же GUID теоретически может использоваться в разных таблицах, и платформа не сможет сама догадаться, какой именно объект вам нужен.
Как получить GUID объекта, который уже есть в базе
Прежде чем искать по GUID, его нужно где-то взять. Если объект открыт в режиме предприятия, GUID можно получить программно: Строка(Ссылка.УникальныйИдентификатор()). В консоли кода или через внешнюю обработку это делается одной строкой. Для документов и элементов справочников метод УникальныйИдентификатор() доступен у любой ссылки.
Если база файловая и доступа к конфигуратору нет, GUID часто приходит извне: из XML-файла обмена (атрибуты вида Ref="8a9b..."), из сообщения об ошибке синхронизации, из текста битой ссылки в журнале регистрации. В этом случае GUID уже есть в виде строки, и задача сводится к обратному преобразованию — из строки в ссылку.
Отдельный случай — GUID из строки подключения к опубликованной базе или из внешней системы (сайта, CRM). Здесь важно убедиться, что GUID передан без искажений: лишние пробелы, переносы строк или фигурные скобки (формат {8a9b...}) приведут к ошибке преобразования. Скобки перед использованием нужно удалить.
Получение ссылки по GUID, когда тип объекта известен
Основной способ — метод ПолучитьСсылку() соответствующего менеджера. Код выглядит так:
GUID = Новый УникальныйИдентификатор("8a9b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d");
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(GUID);
Для документов синтаксис аналогичный: Документы.РеализацияТоваровУслуг.ПолучитьСсылку(GUID). Метод возвращает объект ссылочного типа, но не проверяет, существует ли такой объект в базе. Это принципиальный момент: вы получите ссылку в любом случае, даже если объект удалён или никогда не существовал. Поэтому следующий обязательный шаг — проверка существования.
Проверить, есть ли объект, проще всего запросом по ссылке:
Запрос = Новый Запрос("ВЫБРАТЬ Т.Ссылка ИЗ Справочник.Номенклатура КАК Т ГДЕ Т.Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Если Запрос.Выполнить().Пустой() Тогда
// объекта с таким GUID в базе нет
КонецЕсли;
Альтернатива без запроса — попытка обратиться к реквизиту через ссылку: Если Ссылка.ПолучитьОбъект() = Неопределено Тогда .... Метод ПолучитьОбъект() вернёт Неопределено, если объекта нет. Но на больших объёмах проверок запрос эффективнее, так как не вычитывает весь объект из базы.
GUID = Новый УникальныйИдентификатор(СтрокаGUID);
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(GUID);
Если Ссылка.ПолучитьОбъект() = Неопределено Тогда
Сообщить("Объект не найден");
Иначе
Сообщить("Найден: " + Ссылка);
КонецЕсли;Поиск ссылки по GUID, когда тип объекта неизвестен
Если известен только GUID, а вид объекта — нет, придётся перебрать возможные таблицы. Практичный подход — последовательно пройти по коллекциям метаданных (справочники, документы, планы видов характеристик, планы счетов) и для каждого вида выполнить проверку существования ссылки. В типовых базах видов объектов десятки, поэтому перебор стоит ограничить теми таблицами, откуда объект реально мог прийти: например, при обмене с сайтом это обычно номенклатура, контрагенты и заказы.
Ускорить перебор помогает эвристика: сначала проверяйте наиболее вероятные виды, а не все подряд. Также полезно помнить, что метод ПолучитьСсылку() для несуществующего вида просто даст «пустую по факту» ссылку, поэтому проверка запросом обязательна на каждом шаге, иначе поиск даст ложное срабатывание на первом же виде.
Готовые внешние обработки «поиск объекта по GUID» автоматизируют этот перебор: пользователь вставляет строку GUID, обработка проходит по метаданным и показывает найденный объект с возможностью открыть его. Такие обработки распространены в сообществе разработчиков; перед использованием проверьте, что обработка запускается в вашей версии платформы и не выполняет ничего, кроме чтения.
Восстановление объекта по GUID из битой ссылки
Когда объект удалён, а на него остались ссылки, в интерфейсе виден текст <Объект не найден> (123:8a9b2c3d...). Из этого текста можно извлечь GUID и восстановить объект — создать новый элемент с тем же идентификатором. Для этого используется та же пара методов: ПолучитьСсылку(GUID), а затем создание объекта методом менеджера с установкой ссылки:
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(GUID);
НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);
НовыйОбъект.Наименование = "Восстановлен по GUID";
НовыйОбъект.Записать();
После такой записи все битые ссылки в документах и регистрах «оживут» — они снова будут указывать на существующий объект. Реквизиты объекта придётся заполнить вручную или из архивной копии, поскольку старые данные удалены вместе с объектом.
Извлечь GUID из строки битой ссылки можно функцией: текст в скобках после двоеточия — это и есть шестнадцатеричное представление GUID, но его байтовый порядок отличается от строкового вида. Проще использовать готовую функцию преобразования, которая переставляет группы символов; она есть в большинстве обработок поиска по GUID. Альтернатива — найти GUID в исходной базе-источнике, откуда объект приходил при обмене.
- 1Определите, известен ли тип объекта (справочник, документ) или только GUID
- 2Сформируйте значение: Новый УникальныйИдентификатор(СтрокаGUID)
- 3Получите ссылку методом ПолучитьСсылку() нужного менеджера
- 4Проверьте существование объекта запросом по ссылке или через ПолучитьОбъект()
- 5Если объект не найден и тип неизвестен — переберите вероятные виды метаданных
- 6Если объект удалён — решите, восстанавливать ли его с тем же GUID или заменять ссылки
Проверка результата и типичные ошибки
Корректность результата проверяется просто: полученная ссылка должна открываться в режиме предприятия, а запрос по ней — возвращать строку. Если объект найден перебором, дополнительно сверьте его ключевые реквизиты (наименование, код, дату) с данными источника, чтобы исключить совпадение GUID в другой таблице.
Как проверить результат
Возвращает одну строку с объектом
Пустой результат — объекта с таким GUID нет
Форма открывается, реквизиты заполнены
Ошибка открытия или текст «Объект не найден»
Совпадает с исходным GUID посимвольно
Отличается — ошибка в преобразовании строки
Самая частая ошибка — пропустить проверку существования и использовать ссылку, полученную через ПолучитьСсылку(), как гарантированно валидную. Вторая типичная ошибка — передавать в конструктор УникальныйИдентификатор строку с фигурными скобками или пробелами: платформа выдаст ошибку преобразования. Третья — путать GUID объекта с GUID узла плана обмена или GUID записи регистра сведений: это разные идентификаторы, и поиск по ним ведётся по-разному.
Ограничения и альтернативные способы
Метод ПолучитьСсылку() работает только в контексте встроенного языка: конфигуратор, консоль кода, внешняя обработка, фоновое задание. Из пользовательского режима без инструментов разработчика найти объект по GUID штатно нельзя — поиск в списках работает по наименованию и коду, но не по GUID. Если прав на конфигуратор нет, попросите администратора или разработчика выполнить поиск, либо используйте типовые механизмы сопоставления (например, в обменах данными есть отчёты о сопоставлении объектов, где GUID виден косвенно).
Прямой запрос к таблицам СУБД (SQL) по полю _IDRRef технически возможен, но это внештатный путь: структура хранения не документирована для прямой работы, а любая запись вне платформы нарушает целостность и лицензионные ограничения. Для чтения в аналитических целях такой запрос иногда применяют администраторы, но для рабочих задач правильный инструмент — встроенный язык.
Сравнение способов поиска
Полный контроль, подходит для разовых и массовых проверок; требует прав разработчика
Удобна для администратора без навыков кода; нужно проверять источник и запускать сначала на копии
Быстро для анализа, но недокументированная структура и запрет на запись; только чтение и только для опытных администраторов
Что важно запомнить
Ссылка по GUID получается методом ПолучитьСсылку() с обязательной проверкой существования объекта. Если тип неизвестен — перебор по метаданным или готовая обработка. Удалённый объект можно восстановить с тем же GUID, но только после резервного копирования базы.
Частые вопросы
Можно ли найти объект по GUID в режиме предприятия без конфигуратора?
Штатного поиска по GUID в пользовательском интерфейсе нет. Нужна внешняя обработка, консоль кода или помощь разработчика. В некоторых типовых обменах GUID виден в служебных регистрах сопоставления, которые доступны администратору.
Почему ПолучитьСсылку() возвращает ссылку, хотя объекта нет в базе?
Метод только конструирует ссылку из GUID и типа, не обращаясь к данным. Существование нужно проверять отдельно — запросом по ссылке или через ПолучитьОбъект(), который вернёт Неопределено для отсутствующего объекта.
Что делать, если GUID в файле обмена записан с фигурными скобками?
Удалите скобки строковыми функциями (СтрЗаменить) до создания УникальныйИдентификатор. Также уберите пробелы и переводы строк, иначе конструктор выдаст ошибку преобразования.
Как вытащить GUID из текста «Объект не найден»?
Шестнадцатеричная строка в скобках — это GUID в особом байтовом порядке. Используйте готовую функцию перестановки групп символов из обработок поиска по GUID либо найдите объект в базе-источнике и возьмите его GUID напрямую.
Изменится ли GUID объекта при обмене или переносе в другую базу?
При типовой синхронизации GUID сохраняется — на этом строится сопоставление. Но при загрузке через произвольные правила или при создании объекта заново вручную GUID будет новым, и сопоставление придётся настраивать по другим ключам.
Опасно ли восстанавливать объект с тем же GUID?
Сама операция безопасна, если выполняется осознанно: все старые ссылки начнут указывать на новый объект. Риск в том, что реквизиты будут пустыми или неправильными. Делайте резервную копию и проверяйте связанные документы после восстановления.