Top.Mail.Ru
Меню
Каталог Программы 1С Опыт и отзывы Услуги Компания Интересное Контакты

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

Основатель и генеральный директор компании MoscowSoft, Сорокин Сергей
Сорокин Сергей, Генеральный директор MoscowSoft  28.04.2026 Актуальность проверена: 28.04.2026   5 мин.
Подобрать перенос данных 1С

Специализируемся на переносах данных 1С с 2015г.

Подобрать перенос данных 1С >>

Интеграция 1С с маркетплейсами

Специализируемся на интеграциях 1С с маркетплейсами с 2021г.

Изучить продукты >>

Содержание

В каждая запись в базе имеет свой уникальный идентификатор – GUID (уникальный идентификатор), и на его основе хранятся связи между объектами. Ссылка («Ссылка») – это особый тип поля, внутри которого хранится GUID целевого объекта. Фактически GUID в – это 128-битное число, гарантирующее глобальную уникальность. При этом у объекта есть и внутренний идентификатор (номер записи в таблице), и глобальный GUID. Свойство Ref объекта возвращает ссылку на него (то есть его GUID), а метод УникальныйИдентификатор() выдаёт строковый GUID объекта. Такое разделение позволяет обращаться к объекту и по цифровому ключу, и по GUID.

Поиск по GUID: пример кода

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

Гуид = "09e5174f-551f-11e8-a22b-0800272d9f13";
СсылкаНоменклатуры = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(Гуид));

В этом примере вызывается « Новый УникальныйИдентификатор() » для преобразования строки из 36 символов в объект GUID, и затем метод ПолучитьСсылку() возвращает ссылку на нужный элемент (если он существует). Такой приём работает для справочников, документов и других ссылочных объектов. Код простой, но часто повышает производительность поддержки: не надо вручную искать объект по другим атрибутам, достаточно одного GUID. Разумеется, надо следить за тем, что строка GUID строго соответствует формату (например, xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx), иначе метод вернёт ошибку.

Битые ссылки: поиск и обработка

Полезные статьи и обработки по теме "Битые ссылки":

Иногда в базе могут появляться битые ссылки – ссылки на удалённые или несуществующие объекты. Битая ссылка проявляется, когда при попытке получить объект по ссылке метод ПолучитьОбъект() вернёт Неопределено. Это может приводить к «исчезновению» данных: отчёты не строятся, табличные части пустуют. Одно из решений – «пробежать» стандартной обработкой по всей базе. Например, бесплатная обработка «Поиск битых ссылок» от MoscowSoft проходит по всем таблицам базы и «находит битые ссылки во всех таблицах». В этой обработке и во множестве статей MoscowSoft объясняется, как выявлять и «перепроводить» или удалять такие связи. Так, статья «Как программно определить битую ссылку в 1С» приводит тривиальную проверку:

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

Кроме того, есть способы поиска битых ссылок через запросы к базе или по конкатенации строк. Подробнее см. материалы MoscowSoft: «Поиск ссылок на объекты», «Программная проверка битых ссылок», «Проверка битой ссылки в запросе» и «Удаление битых ссылок» – все они доступны на сайте компании. Эти статьи подробно разбирают различные подходы: от готовых обработок до SQL-запросов по специфике метаданных. Такие ресурсы помогут углубиться в тему битых ссылок.

Ошибки и нюансы при работе со ссылками

При работе со ссылочными полями следует учитывать ряд особенностей. Во-первых, состояние ссылки бывает не только корректным или битым, но ещё «пустым» (ЗНАЧЕНИЕ(... ПустаяСсылка)) или «Неопределено». В запросах 1С эти три состояния («NULL», «пустая ссылка», «Неопределено») ведут себя по-разному, и фильтрация по ним требует специального подхода. Ключевая ошибка – пытаться сравнить поле со значением NULL через = или <>, как со строкой. В языке запросов 1С так просто не получится: нужно использовать конструкцию ЕСТЬ NULL. Например, чтобы отфильтровать записи с битой ссылкой, обычно проверяют один обязательный реквизит связанного объекта на ЕСТЬ NULL, при этом сама ссылка не должна быть Неопределено (см. пример запроса ниже).

Во-вторых, при программном поиске не стоит безразборно полагаться на ПолучитьСсылку(). Если GUID некорректен или объект удалён, лучше сначала проверить полученную ссылку на Неопределено (см. код выше). Иначе при попытке УстановитьЗначениеУзла() или при доступе к полям объекта может возникнуть ошибка. Так, если в коде ПолучитьОбъект() = Неопределено – это признак битой ссылки. Вообще стоит добавить в код обработки исключения или проверку, чтобы не прерывать выполнение.

Наконец, будьте осторожны с конвертацией GUID: в некоторых местах требуется убрать или добавить тире («-»), выполнить СтрДлина()=36 и т.д. Малейший сбой формата приводит к неработоспособности. Периодически напоминание о выстраивании условий может спасти от самых неочевидных багов при запросах.

Как узнать дату создания объекта по GUID

Интересная особенность GUID (версия 1), используемых в 1С: они содержат метку времени создания. Прямо по GUID можно вычислить дату и время «рождения» ссылки. Алгоритм описан многими специалистами: нужно переставить куски строки GUID и перевести шестнадцатеричные цифры в секунды от эпохи 1582 года. Например, если GUID = bdb62d89-cede-11e4-b12b-d4ae52b5e909, первые части bdb62d89-cede-11e4 переставляют в обратном порядке (11e4-cede-bdb62d89) и переводят как число. После приведения к дате получается момент создания объекта. В 1С можно реализовать это вычисление:

Функция UUID_Timestamp(Ссылка)
	
	ГУИД = Ссылка.УникальныйИдентификатор();
	// Например ГУИД равен: bdb62d89-cede-11e4-b12b-d4ae52b5e909
	// Дата содержится в первых символах, bdb62d89-cede-11e4 которые нужно переставить задом наперед: 11e4-cede-bdb62d89
	Строка16 = Сред(ГУИД, 15, 4) + Сред(ГУИД, 10, 4) + Сред(ГУИД, 1, 8);
	
	// Убираем "лишние" знаки "-"(тире).
	Строка16 = СтрЗаменить(Строка16, "-", "");
	
	// Убираем первый символ, так как в нем содержится версия стандарта (зашит в седьмой октет)
	Строка15 = Сред(Строка16, 2);
	
	// Получаем timestamp в 60 бит : 1E4 CEDE BDB6 2D89
	ЧислоСек = 0;
	Для Позиция = 1 По СтрДлина(Строка15) Цикл
		ЧислоСек = ЧислоСек + Найти("123456789abcdef",Сред(Строка15,Позиция,1))*Pow(16,СтрДлина(Строка15) - Позиция);
	КонецЦикла;
	ЧислоСек = ЧислоСек / 10000000;
	
	// Прибавляем к дате начала Григореанского календаря
	Возврат Дата(1582, 10, 15, 00, 00, 00) + ЧислоСек + СмещениеСтандартногоВремени() + СмещениеЛетнегоВремени();;
	
КонецФункции

Сама идея в том, что версии GUID первой категории «зашивают» секунды создания прямо в значение GUID – весьма нехитрый лайфхак для опытных администраторов.

Полезные приёмы и советы

Ниже приведены дополнительные ремарки, которые часто помогают при работе с GUID и ссылками в 1С:

Как задать ГУИД при создании объекта

Теперь к задаче, которая сначала кажется невозможной. В типовой логике 1С GUID генерируется платформой автоматически. Сам, без вариантов. Однако в интеграционных сценариях иногда нужно жестко задать значение, например при загрузке из внешней системы или миграции данных между базами — да, бывает. И вот тут начинаются нюансы. Прямого штатного метода “установить GUID” у объекта нет, не предусмотрено. Но можно обойтись через механизм загрузки данных: создать объект, затем использовать УстановитьСсылкуНового() перед записью. Пример короткий:

НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
НовыйGUID = Новый УникальныйИдентификатор("ТутСтрокаДлиной36Символов");
НовыйОбъект.УстановитьСсылкуНового(НовыйGUID);
НовыйОбъект.Записать();

Работает, но не всегда. Например, при включенной проверке уникальности или в распределенных базах можно получить отказ. Платформа может не пустить, и правильно сделает. Поэтому используйте осторожно, очень осторожно. По сути, вы берете управление идентификаторами на себя. А это уже зона ответственности, не просто код.

Как видите, работать с GUID в 1С можно эффективно, но важно помнить об особенностях: внутренние идентификаторы, битые ссылки, NULL и «пустые ссылки», специфику запросов. Мы разобрали несколько подходов и примеров – многое зависит от конфигурации и задачи. А каким способом вы предпочитаете находить объекты по GUID? Пусть эта статья станет поводом задуматься над альтернативами и новыми приёмами: возможно, в вашей практике найдутся ещё более неожиданные лайфхаки работы с GUID в 1С?

MoscowSoft логотип

Подпишитесь на телеграм-канал MoscowSoft!
QR-код (ссылка приглашение) в канал MoscowSoft

https://t.me/MoscowSoft

Публикуем:
- инструкции и советы по разработке на 1С;
- рекомендации по интеграции 1С;
- бесплатно делимся своими обработками;
- публикуем секретные спецпредложения только для подписчиков.

Возврат к списку