Разработка и Конфигурация · 10 мин
Как в 1С получить ссылку по GUID
Как в 1С получить ссылку на объект по GUID: метод ПолучитьСсылку, преобразование строки в УникальныйИдентификатор, поиск по GUID из запроса и внешних систем.
Уникальный идентификатор (GUID) — это 36-символьная строка вида «a1b2c3d4-e5f6-7890-abcd-ef1234567890», которую платформа 1С присваивает каждой ссылке на объект базы: элементу справочника, документу, узлу плана обмена. GUID широко используется при обмене данными между базами, интеграции с сайтами, мобильными приложениями и внешними сервисами — именно по GUID внешняя система однозначно идентифицирует объект.
Обратная задача — найти в базе объект по известному GUID — возникает при загрузке данных из внешних источников, отладке обменов, восстановлении потерянных связей и разборе «битых» ссылок. Платформа предоставляет для этого встроенный механизм: метод ПолучитьСсылку у менеджеров объектов.
Важно понимать ограничение: GUID сам по себе не содержит информации о типе объекта. Одна и та же строка может быть идентификатором элемента справочника «Номенклатура», документа «Реализация товаров» или любого другого объекта. Поэтому перед получением ссылки нужно знать (или определить), к какому типу относится искомый объект.
Как получить ссылку по GUID через ПолучитьСсылку
Основной способ — метод ПолучитьСсылку, доступный у менеджера любого ссылочного типа: Справочники, Документы, ПланыВидовХарактеристик, ПланыСчетов, ПланыОбмена, БизнесПроцессы, Задачи. Метод принимает значение типа УникальныйИдентификатор и возвращает ссылку соответствующего вида.
Если GUID пришёл в виде строки (например, из файла обмена или HTTP-запроса), сначала преобразуйте его в объект УникальныйИдентификатор через конструктор. Строка должна быть в стандартном формате с дефисами, регистр символов значения не имеет.
СтрокаГУИД = "a1b2c3d4-e5f6-7890-abcd-ef1234567890";
УИД = Новый УникальныйИдентификатор(СтрокаГУИД);
СсылкаНаТовар = Справочники.Номенклатура.ПолучитьСсылку(УИД);
// Проверка, что объект реально существует в базе
Если СсылкаНаТовар.ПолучитьОбъект() = Неопределено Тогда
Сообщить("Объект с таким GUID не найден (битая ссылка)");
Иначе
Сообщить("Найден: " + СсылкаНаТовар);
КонецЕсли;Если GUID уже хранится в реквизите типа УникальныйИдентификатор (так бывает в регистрах сведений сопоставления при обменах), конструктор не нужен — передавайте значение напрямую в ПолучитьСсылку.
Как проверить, существует ли объект с таким GUID
ПолучитьСсылку не обращается к базе данных — метод просто «собирает» ссылку из типа и идентификатора. Поэтому существование объекта нужно проверять отдельно. Есть два рабочих способа.
Первый — вызвать у ссылки метод ПолучитьОбъект(). Если объекта нет, метод вернёт Неопределено. Способ простой, но при большом количестве проверок медленный, так как читает объект целиком.
Второй — запрос к таблице объекта с условием по ссылке. Это быстрее и удобнее при пакетной проверке множества GUID: можно одним запросом найти все существующие ссылки из списка.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", СсылкаНаТовар);
Если Запрос.Выполнить().Пустой() Тогда
// Объекта нет в базе
КонецЕсли;Как узнать тип объекта по GUID, если он неизвестен
Частая ситуация: есть GUID из сообщения об ошибке обмена или из лога, но неизвестно, какой это объект. Платёжное поручение, контрагент, документ установки цен — определить это по строке GUID невозможно, придётся искать.
Практический подход — перебрать метаданные ссылочных типов и для каждого выполнить проверку существования. Чтобы не делать сотни запросов, ограничьте поиск вероятными видами объектов по контексту: если GUID пришёл из обмена с сайтом, скорее всего это номенклатура, контрагент или заказ.
Функция НайтиСсылкуПоГУИД(СтрокаГУИД)
УИД = Новый УникальныйИдентификатор(СтрокаГУИД);
Для Каждого Менеджер Из Метаданные.Справочники Цикл
Ссылка = Справочники[Менеджер.Имя].ПолучитьСсылку(УИД);
Если Ссылка.ПолучитьОбъект() <> Неопределено Тогда
Возврат Ссылка;
КонецЕсли;
КонецЦикла;
// Аналогично перебрать Документы и другие виды
Возврат Неопределено;
КонецФункцииДля разового поиска удобнее воспользоваться типовой обработкой «Поиск и замена значений» из подсистемы БСП или сторонними инструментами поиска по GUID — они перебирают таблицы автоматически. В типовых конфигурациях на БСП также есть общий модуль ОбщегоНазначения с функциями работы со ссылками.
Как получить GUID из ссылки — обратная задача
Обратное преобразование нужно, когда из 1С данные передаются во внешнюю систему: сайт должен хранить идентификаторы товаров и заказов именно как GUID. Для этого у любой ссылки есть метод УникальныйИдентификатор(), возвращающий объект УникальныйИдентификатор, который затем преобразуется в строку.
ГУИДСтрокой = Строка(НоменклатураСсылка.УникальныйИдентификатор());
// Результат: "a1b2c3d4-e5f6-7890-abcd-ef1234567890"Учтите: в запросах метод УникальныйИдентификатор() тоже доступен — можно выбрать сразу пары «Ссылка + GUID» для выгрузки. Это стандартный приём при формировании файлов обмена и ответов HTTP-сервисов.
Особые случаи: планы обмена, COM и внешние соединения
Получение ссылки в другой базе через COM или веб-сервис
При соединении с другой базой 1С через COMConnector код выполняется в контексте той базы, поэтому синтаксис тот же: Новый УникальныйИдентификатор в пространстве внешнего соединения и ПолучитьСсылку у его менеджеров. Через HTTP-сервисы GUID обычно передаётся строкой в параметрах запроса, а серверный код сервиса выполняет описанное выше преобразование.
GUID из строки без дефисов или в другом формате
Некоторые системы передают GUID без дефисов, в фигурных скобках или в «перевёрнутом» порядке байт (так хранится идентификатор в файловых таблицах и при выгрузке через ВыгрузитьПоПравилу). Конструктор Новый УникальныйИдентификатор принимает только стандартный формат с дефисами, поэтому строку нужно предварительно нормализовать — вставить дефисы в позиции 9, 14, 19 и 24.
Производительность и безопасная работа с большими объёмами
Единичное получение ссылки по GUID — мгновенная операция, так как идентификатор является частью первичного ключа таблицы. Проблемы начинаются при массовой обработке: загрузке тысяч строк из файла, где для каждой нужно найти объект.
В таких случаях не вызывайте ПолучитьОбъект() для каждой ссылки в цикле — это порождает отдельное обращение к СУБД на каждую строку. Вместо этого соберите все ссылки в список и одним запросом с условием «Ссылка В (&СписокСсылок)» определите, какие из них существуют. Ненайденные GUID логируйте, а не создавайте по ним объекты автоматически, если это не предусмотрено логикой обмена.
- 1Получите строку GUID и проверьте её формат (36 символов, дефисы на местах).
- 2Преобразуйте строку через Новый УникальныйИдентификатор().
- 3Вызовите ПолучитьСсылку(УИД) у менеджера нужного вида объектов.
- 4Проверьте существование объекта запросом или ПолучитьОбъект().
- 5Если объект не найден — зафиксируйте GUID в журнале и обработайте ситуацию по правилам обмена, а не записывайте битую ссылку.
Что важно запомнить
Ссылка по GUID получается в два шага: строка → Новый УникальныйИдентификатор → ПолучитьСсылку у менеджера нужного типа. Метод не проверяет существование объекта, поэтому результат всегда проверяйте. Тип объекта из GUID не восстанавливается — его нужно знать заранее или искать перебором.
Частые вопросы
Можно ли получить ссылку по GUID, не зная типа объекта?
Напрямую — нет, ПолучитьСсылку вызывается у менеджера конкретного вида. Если тип неизвестен, перебирайте метаданные ссылочных типов и проверяйте существование объекта для каждого, либо используйте инструменты поиска по GUID. На практике поиск ограничивают наиболее вероятными видами объектов.
Почему ПолучитьСсылку возвращает ссылку, хотя объекта нет в базе?
Метод не обращается к данным — он формирует типизированное значение из вида объекта и идентификатора. Это сделано специально: такой механизм позволяет, например, создавать новые объекты с заранее заданным GUID через УстановитьСсылкуНового. Проверка существования — отдельная операция.
Как получить ссылку по GUID в запросе 1С?
В тексте запроса преобразования строки в GUID нет. Ссылку формируют на встроенном языке через ПолучитьСсылку и передают в запрос параметром, либо наоборот — выбирают ссылки запросом, а GUID получают функцией УникальныйИдентификатор() прямо в тексте запроса для выгрузки наружу.
Что делать, если GUID пришёл без дефисов?
Нормализуйте строку: вставьте дефисы после 8-го, 12-го, 16-го и 20-го символов, чтобы получить стандартный формат 8-4-4-4-12. После этого конструктор Новый УникальныйИдентификатор примет строку. Если порядок байт перевёрнут (характерно для выгрузок из некоторых обменов), потребуется дополнительная перестановка частей.
Могут ли два разных объекта иметь одинаковый GUID?
В пределах одной базы платформа гарантирует уникальность идентификаторов. При обменах и объединении баз теоретически возможны коллизии, и вероятность конфликтов учитывают при проектировании интеграций, но на практике вероятность совпадения случайно сгенерированных GUID пренебрежимо мала.
Как найти GUID битой ссылки в документе?
У битой ссылки (значение вида «Объект не найден») метод УникальныйИдентификатор() по-прежнему работает и возвращает исходный GUID. Это позволяет собрать идентификаторы всех потерянных объектов и затем искать их в базе-источнике или резервной копии.