Найти объект в базе по GUID
Теги: 1С,УИД,GUID

Найти объект в базе по УИД

# Код реализации

```1c
Функция ПолучитьОбъектПоУИД(УИДОбъекта)

    СсылкаНаОбъект = Неопределено;

    // все объекты по которым можно получить ссылку
    СписокОбъектовМетаданных = Новый Массив;
    СписокОбъектовМетаданных.Добавить(Справочники);
    СписокОбъектовМетаданных.Добавить(Документы);
    СписокОбъектовМетаданных.Добавить(ПланыВидовХарактеристик);
    СписокОбъектовМетаданных.Добавить(ПланыСчетов);
    СписокОбъектовМетаданных.Добавить(ПланыОбмена);
    СписокОбъектовМетаданных.Добавить(БизнесПроцессы);
    СписокОбъектовМетаданных.Добавить(Задачи);

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

    Возврат СсылкаНаОбъект //не нашли

КонецФункции
```

# Примечания

- Попросил китайскую ДжиПиТи написать такую функцию, вот что она выдала:
Функция ПолучитьСсылкуПоУИДу(УИД) Экспорт

    // Проверяем, что УИД передан
    Если ПустаяСтрока(УИД) Тогда
        Возврат Неопределено;
    КонецЕсли;

    // Преобразуем УИД в уникальный идентификатор
    УникальныйИдентификатор = Новый УникальныйИдентификатор(УИД);

    // Создаем массив типов объектов для поиска
    ТипыОбъектов = Новый Массив;
    ТипыОбъектов.Добавить(Метаданные.Справочники);
    ТипыОбъектов.Добавить(Метаданные.Документы);
    ТипыОбъектов.Добавить(Метаданные.ПланыВидовХарактеристик);
    ТипыОбъектов.Добавить(Метаданные.ПланыСчетов);
    ТипыОбъектов.Добавить(Метаданные.ПланыОбмена);
    ТипыОбъектов.Добавить(Метаданные.БизнесПроцессы);
    // Добавь другие типы, если нужно

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

    // Если объект не найден, возвращаем Неопределено
    Возврат Неопределено;

КонецФункции

Как это работает:
Типы объектов помещаются в массив ТипыОбъектов. Это позволяет легко добавлять или удалять типы.
Внешний цикл перебирает группы типов (справочники, документы и т.д.).
Внутренний цикл перебирает конкретные типы объектов внутри каждой группы.
Для каждого типа объектов функция пытается найти объект по УИД с помощью метода НайтиПоУникальномуИдентификатору.
Если объект найден, функция возвращает ссылку на него.
Если объект не найден ни в одном из типов, функция возвращает Неопределено.
Пример использования:
УИД = "550e8400-e29b-41d4-a716-446655440000"; // Пример УИД

СсылкаНаОбъект = ПолучитьСсылкуПоУИДу(УИД);

Если СсылкаНаОбъект = Неопределено Тогда
    Сообщить("Объект не найден!");
Иначе
    Сообщить("Найден объект: " + СсылкаНаОбъект.Ссылка);
КонецЕсли;

- Более оптимизированная версия. Вместо запроса в цикле с вычитыванием всего объекта из БД (метод "ПолучитьОбъект", а если это документ с ТЧ на 10 000 строк?) используется один запрос.
// Возвращает ссылку на объект ссылочного типа по уникальному идентификатору. Если объект не найден, то будет возвращено
// Неопределено.
//
// Параметры:
//  Идентификатор - УникальныйИдентификатор - идентификатор объекта.
// 
// Возвращаемое значение:
//  ЛюбаяСсылка - ссылка на объект ссылочного типа. Если объект не найден, то будет возвращено Неопределено.
//
Функция СсылкаПоУникальномуИдентификатору(Идентификатор)
	МенеджерыОбъектовМетаданных = Новый Массив;
	МенеджерыОбъектовМетаданных.Добавить(Справочники);
	МенеджерыОбъектовМетаданных.Добавить(Документы);
	МенеджерыОбъектовМетаданных.Добавить(ПланыВидовХарактеристик);
	МенеджерыОбъектовМетаданных.Добавить(ПланыСчетов);
	МенеджерыОбъектовМетаданных.Добавить(ПланыОбмена);
	МенеджерыОбъектовМетаданных.Добавить(БизнесПроцессы);
	МенеджерыОбъектовМетаданных.Добавить(Задачи);
	
	Ссылки = Новый Массив;
	ТекстыЗапроса = Новый Массив;
	
	Для каждого МенеджерыОбъектов Из МенеджерыОбъектовМетаданных Цикл
		Для каждого Менеджер Из МенеджерыОбъектов Цикл
			Ссылка = Менеджер.ПолучитьСсылку(Идентификатор);
			Ссылки.Добавить(Ссылка);
			
			ТекстЗапроса =
			"ВЫБРАТЬ
			|	Таблица.Ссылка КАК Ссылка
			|ИЗ
			|	&МетаданныеСсылкиПолноеИмя КАК Таблица
			|ГДЕ
			|	Ссылка В (&Ссылки)";
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&МетаданныеСсылкиПолноеИмя", Ссылка.Метаданные().ПолноеИмя());
			ТекстыЗапроса.Добавить(ТекстЗапроса);
		КонецЦикла;
	КонецЦикла;
	
	СтрокаОбъединенияЗапроса = "
	|ОБЪЕДИНИТЬ ВСЕ
	|";
	
	ТекстЗапроса = СтрСоединить(ТекстыЗапроса, СтрокаОбъединенияЗапроса);
	
	Запрос = Новый Запрос(ТекстЗапроса);
	Запрос.УстановитьПараметр("Ссылки", Ссылки);
	
	Выборка = Запрос.Выполнить().Выбрать();
	Возврат ?(Выборка.Следующий(), Выборка.Ссылка, Неопределено);
КонецФункции