Найти объект в базе по GUID

kelehsaev 12 1

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

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

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

Комментарии

СергейТ
#1, 15 января 2025 14:32

Попросил китайскую ДжиПиТи написать такую функцию, вот что она выдала:

Функция ПолучитьСсылкуПоУИДу(УИД) Экспорт

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

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

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

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

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

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

Как это работает:
Типы объектов помещаются в массив ТипыОбъектов. Это позволяет легко добавлять или удалять типы.

Внешний цикл перебирает группы типов (справочники, документы и т.д.).

Внутренний цикл перебирает конкретные типы объектов внутри каждой группы.

Для каждого типа объектов функция пытается найти объект по УИД с помощью метода НайтиПоУникальномуИдентификатору.

Если объект найден, функция возвращает ссылку на него.

Если объект не найден ни в одном из типов, функция возвращает Неопределено.

Пример использования:

УИД = "550e8400-e29b-41d4-a716-446655440000"; // Пример УИД

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

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


Little Friend
#2, ред. 21 января 2025 21:06

Более оптимизированная версия. Вместо запроса в цикле с вычитыванием всего объекта из БД (метод "ПолучитьОбъект", а если это документ с ТЧ на 10 000 строк?) используется один запрос.

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


См. также

Проверка Модифицированности объекта

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

ИР Найти в списке

ИР Найти в окнах

ЗаписатьВерсиюОбъекта (БСП)

ВыгрузкаОбъектаВыборки (БСП)

ЗаписатьОбъектВИБ (БСП)

ОтменитьПроведениеОбъектаВИБ (БСП)

ЕстьСсылкиНаОбъект (БСП)

Модератору