Работа с глобальными уникальными идентификаторами (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).
Работа с «битыми» ссылками и пустыми значениями
Это критическая тема для целостности данных. Состояние ссылки может быть трех видов:
- Корректная ссылка — объект существует в БД.
- Пустая ссылка —
ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка). Аналог NULL для ссылочных типов. - Битая ссылка — 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 без указания типа менеджера (перебор всех таблиц) | Очень медленно на больших базах | Метаданные.НайтиПоУникальномуИдентификатору |
Резюме: Чек-лист разработчика
- Есть строка GUID? →
Новый УникальныйИдентификатор(Строка). - Известен тип объекта (Справочник/Документ)? →
Менеджер.ПолучитьСсылку(ГУИД)→ Проверка наПустаяСсылка→ПолучитьОбъект. - Тип объекта НЕизвестен? →
Метаданные.НайтиПоУникальномуИдентификатору(ГУИД). - Нужно в Запросе? → Параметр типа
УникальныйИдентификаторилиЗНАЧЕНИЕ(УникальныйИдентификатор‚ ";;."). - Боитесь битых ссылок? → Проверяйте
Ссылка.ПолучитьОбъект = Неопределенов коде иПоле.Реквизит ЕСТЬ NULLв запросах; - Массовая обработка? → Только Запросы и пакетное чтение (
ПрочитатьXML‚ПрочитатьJSONили временные таблицы)‚ никаких циклов сПолучитьОбъект.
Грамотная работа с GUID — залог быстрых интеграций‚ чистых данных и стабильной работы прикладного решения на платформе 1С:Предприятие.