Получить объект по гуид в запросе

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

Бесплатная консультация юриста

+7 (800) 302-87-29

Реклама jurik.ru

Работа с глобальными уникальными идентификаторами (GUID) — ежедневная задача разработчика на платформе 1С:Предприятие 8. GUID (Globally Unique Identifier) представляет собой 128-битное число‚ гарантирующее уникальность каждой записи в информационной базе. В 1С ссылки на объекты (элементы справочников‚ документы‚ записи регистров) внутри себя содержат именно этот GUID.

В данной статье подробно разберем‚ как получить объект по известному GUID‚ как это сделать в коде и в языке запросов‚ а также рассмотрим нюансы работы с «битыми» ссылками и пустыми значениями.

Основы: GUID‚ Ссылка и УникальныйИдентификатор

Прежде чем переходить к коду‚ важно понимать иерархию типов:

  • УникальныйИдентификатор (UUID) — примитивный тип данных‚ хранящий 16-байтовое значение (обычно в строковом представлении xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
  • Ссылка (Ref), сложный тип‚ указывающий на конкретный объект метаданных (Справочник.Номенклатура‚ Документ.РеализацияТоваровУслуг и т.д.). Внутри себя Ссылка хранит GUID объекта.
  • Объект, полноценный объект метаданных (ОбъектСправочника‚ ОбъектДокумента)‚ содержащий все реквизиты‚ табличные части и методы записи.

Ключевые методы преобразования:

  • Новый УникальныйИдентификатор(<Строка>) — создает объект типа УникальныйИдентификатор из строки.
  • <Менеджер>.ПолучитьСсылку(<УникальныйИдентификатор>) — возвращает Ссылку на объект по его GUID.
  • <Ссылка>.ПолучитьОбъект, возвращает сам Объект для чтения/записи реквизитов.

Получение объекта в программном коде (встроенном языке)

Самый частый сценарий: у нас есть строковое представление GUID (пришло из интеграции‚ лога‚ внешнего файла)‚ нужно найти объект и прочитать его данные.

Пример: Поиск элемента справочника «Номенклатура»

// 1. Исходный GUID в виде строки
СтрокаГУИД = "09e5174f-551f-11e8-a22b-0800272d9f13";

Попытка
 // 2. Преобразуем строку в объект типа УникальныйИдентификатор
 ГУИДОбъект = Новый УникальныйИдентификатор(СтрокаГУИД);
 
 // 3. Получаем Ссылку через менеджер справочника
 // Важно: Менеджер должен соответствовать типу искомого объекта!
 СсылкаНоменклатуры = Справочники.Номенклатура.ПолучитьСсылку(ГУИДОбъект);
 
 // 4. Проверяем‚ что ссылка не пустая (объект существует)
 Если СсылкаНоменклатуры = Справочники.Номенклатура.ПустаяСсылка Тогда
 Сообщить("Объект с таким GUID не найден в базе.");
 Возврат;
 КонецЕсли;
 
 // 5. Получаем сам Объект для работы с реквизитами
 ОбъектНоменклатуры = СсылкаНоменклатуры.ПолучитьОбъект;
 
 // Работаем с объектом
 Сообщить("Найдено: " + ОбъектНоменклатуры.Наименование);
 Сообщить("Артикул: " + ОбъектНоменклатуры.Артикул);
 
Исключение
 Сообщить("Ошибка формата GUID или типа метаданных: " + ОписаниеОшибки);
КонецПопытки;

Важные нюансы:

  • Тип менеджера: Метод ПолучитьСсылку вызывается у конкретного менеджера (Справочники.Номенклатура‚ Документы.РеализацияТоваровУслуг‚ ПланыВидовХарактеристик.Цвета и т.д.). Если вы не знаете тип объекта заранее‚ придется перебирать метаданные или использовать общий поиск (см. ниже).
  • Производительность: ПолучитьСсылку работает очень быстро‚ так как идет по кластерному индексу таблицы БД.
  • ПолучитьОбъект читает все данные объекта с диска. Не вызывайте его в циклах для тысяч объектов — используйте запросы.

Получение объекта в языке запросов

Часто требуется найти объект по GUID прямо в тексте запроса‚ например‚ для выборки данных или соединения таблиц. В языке запросов 1С нет прямого литерала для GUID‚ поэтому используется функция ЗНАЧЕНИЕ.

Синтаксис в запросе

ВЫБРАТЬ
 Номенклатура.Наименование‚
 Номенклатура.Артикул
ИЗ
 Справочник.Номенклатура КАК Номенклатура
ГДЕ
 Номенклатура.Ссылка = ЗНАЧЕНИЕ(УникальныйИдентификатор‚ "09e5174f-551f-11e8-a22b-0800272d9f13")

Разбор:

  • ЗНАЧЕНИЕ(УникальныйИдентификатор‚ "<СтрокаГУИД>") — создает значение типа УникальныйИдентификатор прямо в запросе.
  • Поле Ссылка у справочника неявно приводится к типу УникальныйИдентификатор для сравнения‚ либо можно сравнивать с полем УникальныйИдентификатор (если оно доступно в выборке метаданных).

Параметризованный запрос (Рекомендуемый способ)

Жестко прописывать GUID в тексте запроса — плохая практика (проблемы с кэшем планов запросов‚ безопасность). Лучше использовать параметры:

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

Запрос.УстановитьПараметр("ПараметрГУИД"‚ Новый УникальныйИдентификатор(СтрокаГУИД));
Результат = Запрос.Выполнить;
Выборка = Результат.Выбрать;
Если Выборка.Следующий Тогда
 Сообщить(Выборка.Наименование);
КонецЕсли;

Что делать‚ если тип объекта неизвестен? (Универсальный поиск)

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

Способ 1: Метаданные.НайтиПоУникальномуИдентификатору (Платформа 8.3.10+)

Самый быстрый и правильный способ найти Ссылку любого типа по GUID:

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

// Возвращает Ссылку на объект любого типа (Справочник‚ Документ‚ ПВХ и т.д.) или Неопределено
СсылкаНаОбъект = Метаданные.НайтиПоУникальномуИдентификатору(ГУИДОбъект);

Если СсылкаНаОбъект <> Неопределено Тогда
 Сообщить("Тип объекта: " + СсылкаНаОбъект.Метаданные.Имя);
 Сообщить("Представление: " + СсылкаНаОбъект);
 // Дальше можно ПолучитьОбъект
Иначе
 Сообщить("Объект не найден ни в одной таблице ИБ.");
КонецЕсли;

Способ 2: Перебор метаданных (для старых версий или специфических задач)

Функция НайтиСсылкуПоГУИДВоВсейБазе(Знач ГУИДОбъект)
 // Перебираем справочники
 Для Каждого МетаСпр Из Метаданные.Справочники Цикл
 Ссылка = МетаСпр.ПолучитьСсылку(ГУИДОбъект);
 Если Ссылка <> МетаСпр.ПустаяСсылка Тогда
 Возврат Ссылка;
 КонецЕсли;
 КонецЦикла;
 
 // Перебираем документы
 Для Каждого МетаДок Из Метаданные.Документы Цикл
 Ссылка = МетаДок.ПолучитьСсылку(ГУИДОбъект);
 Если Ссылка <> МетаДок.ПустаяСсылка Тогда
 Возврат Ссылка;
 КонецЕсли;
 КонецЦикла;
 
 // При необходимости добавить ПланыВидовХарактеристик‚ ПланыСчетов‚ БизнесПроцессы‚ Задачи...
 
 Возврат Неопределено;
КонецФункции

Примечание: Способ с перебором медленный. Метод Метаданные.НайтиПоУникальномуИдентификатору оптимизирован платформой и работает за O(1).

Работа с «битыми» ссылками и пустыми значениями

Это критическая тема для целостности данных. Состояние ссылки может быть трех видов:

  1. Корректная ссылка — объект существует в БД.
  2. Пустая ссылка — ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка). Аналог NULL для ссылочных типов.
  3. Битая ссылка — GUID в поле ссылки есть‚ но записи с таким GUID в целевой таблице нет (объект удален‚ а ссылка на него осталась в другом объекте/регистре).

Проверка в коде (1С)

Если Ссылка = Справочники.Номенклатура.ПустаяСсылка Тогда
 // Это Пустая ссылка (нормально‚ например‚ товар не указан в строке заказа)
ИначеЕсли Ссылка.ПолучитьОбъект = Неопределено Тогда
 // Это Битая ссылка! Объект удален‚ а ссылка висит.
 // Требуется ремонт данных: обнулить ссылку или восстановить объект.
Иначе
 // Все ок‚ объект получен.
КонецЕсли;

Проверка в Запросе (Язык запросов 1С)

В запросах сравнение с NULL через = или <> не работает стандартно. Используется ЕСТЬ NULL.

Найти записи с битой ссылкой на Номенклатуру в регистре остатков:

ВЫБРАТЬ
 Остатки.Номенклатура КАК СсылкаНаНоменклатуру
ИЗ
 РегистрНакопления.ОстаткиТоваров КАК Остатки
ГДЕ
 // Проверяем обязательное поле связанного объекта (например‚ Наименование) на NULL
 // Если поле NULL‚ значит записи в Справочнике.Номенклатура нет -> Битая ссылка
 Остатки.Номенклатура.Наименование ЕСТЬ NULL

Отфильтровать и пустые‚ и битые ссылки (оставить только валидные):

ВЫБРАТЬ
 Остатки.Номенклатура‚
 Остатки.КоличествоОстаток
ИЗ
 РегистрНакопления.ОстаткиТоваров КАК Остатки
ГДЕ
 НЕ (Остатки.Номенклатура.Наименование ЕСТЬ NULL)
 И Остатки.Номенклатура <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)

Извлечение даты создания из GUID (Бонус)

GUID в 1С (версия 1‚ основанная на времени) содержит в себе timestamp создания. Первые 8 байт (16 hex-символов), это количество 100-наносекундных интервалов с 15 октября 1582 года.

Функция для извлечения даты (примерная логика):

Функция ДатаИзГУИД(Знач ГУИДОбъект) Экспорт
 // Работает только для ГУИД‚ сгенерированных платформой 1С (Version 1)
 СтрокаГУИД = СтрЗаменить(ГУИДОбъект‚ "-"‚ "");
 // Первые  ⎯ время (Low/High части переставлены в зависимости от Endianness‚ 
 // в 1С обычно используется формат RFC 4122 с перестановкой байт time_low/time_mid/time_hi)
 // Для точного парсинга лучше использовать внешние компоненты или встроенные методы платформы‚ 
 // если они появятся в новых версиях.
 // Ниже упрощенный пример логики (может требовать корректировки под версию платформы):
 
 // В 1С 8.3.18+ появился метод УникальныйИдентификатор.Дата ? 
 // На данный момент (2026) стандартного метода нет‚ парсят вручную.
 
 // Пример парсинга (упрощенно):
 // TimeLow = Первые 
 // TimeMid = Следующие 4
 // TimeHiAndVersion = Следующие 4
 // ... сложная битовая арифметика ...
 
 // Рекомендация: храните дату создания в отдельном реквизите "ДатаСоздания" при записи объекта.
 Возврат Неопределено; 
КонецФункции

Совет: Не полагайтесь на парсинг GUID для получения даты в продакшн-коде. Формат хранения GUID во внутренних таблицах 1С может меняться. Всегда добавляйте реквизит ДатаСоздания (или используйте системное поле ПометкаУдаления / версионирование) для надежной сортировки.

Типичные ошибки и лучшие практики

Ошибка Последствие Правильно
Передача строки в ПолучитьСсылку("строка") Ошибка типа: ожидается УникальныйИдентификатор ПолучитьСсылку(Новый УникальныйИдентификатор(Строка))
Вызов ПолучитьОбъект в цикле по 10 000 записям Критическое падение производительности (10 000 обращений к БД) Использовать Запрос с выборкой нужных полей
Сравнение в запросе: ГДЕ Ссылка = NULL Не сработает (в SQL/1С NULL != NULL) ГДЕ Ссылка.Поле ЕСТЬ NULL или Ссылка = ЗНАЧЕНИЕ(...ПустаяСсылка)
Игнорирование битых ссылок Ошибки в отчетах («Поле не найдено»)‚ потеря данных при проведении Регулярный запуск обработки «Поиск и исправление битых ссылок»
Поиск по GUID без указания типа менеджера (перебор всех таблиц) Очень медленно на больших базах Метаданные.НайтиПоУникальномуИдентификатору

Резюме: Чек-лист разработчика

  1. Есть строка GUID? → Новый УникальныйИдентификатор(Строка).
  2. Известен тип объекта (Справочник/Документ)? → Менеджер.ПолучитьСсылку(ГУИД) → Проверка на ПустаяСсылка → ПолучитьОбъект.
  3. Тип объекта НЕизвестен? → Метаданные.НайтиПоУникальномуИдентификатору(ГУИД).
  4. Нужно в Запросе? → Параметр типа УникальныйИдентификатор или ЗНАЧЕНИЕ(УникальныйИдентификатор‚ ";;.").
  5. Боитесь битых ссылок? → Проверяйте Ссылка.ПолучитьОбъект = Неопределено в коде и Поле.Реквизит ЕСТЬ NULL в запросах;
  6. Массовая обработка? → Только Запросы и пакетное чтение (ПрочитатьXML‚ ПрочитатьJSON или временные таблицы)‚ никаких циклов с ПолучитьОбъект.

Грамотная работа с GUID — залог быстрых интеграций‚ чистых данных и стабильной работы прикладного решения на платформе 1С:Предприятие.