Простая, а самое главное быстрая функция поиска ссылки на объект в информационной базе через запрос.
Часто встречаются задачи, когда по УИД необходимо определить, каким объектом информационной базы он является. Самый простой способ сделать это:
- Перебрать все метаданные имеющие ссылки;
- Проверить полученную ссылку на существование.
Если с п.1 никаких проблем, так как обход и формирование ссылки происходит довольно быстро,
то вот для п.2 есть сложность, так как стандартный подход, что я встречал было получение объекта и проверка его существования (.ПолучитьОбъект()), что было очень долго для больших конфигураций и по факту приводило к запросу в цикле, так как каждый раз когда проверялось существование объекта шел запрос к БД на его поиск.
Что сделал я? Все существующие объекты метаданных 1С, у которых возможна ссылка, имеют ряд общих реквизитов. Самый простой пример - «ПометкаУдаления». Таким образом, мы можем просто составить таблицу всех ссылок и проверить имеет ли «ПометкаУдаления» значение «NULL»:
- если ДА, значит, она не является валидной ссылкой;
- если НЕТ, значит, ссылка на объект успешно найдена.
Метаданные, которые могут иметь ссылки:
- Справочники;
- Документы;
- ПланыВидовХарактеристик;
- ПланыВидовРасчета;
- ПланыСчетов;
- ПланыОбмена;
- БизнесПроцессы;
- Задачи;
Чуть ниже в спойлере сама функция, кому этого не хватит, может скачать обработку с примером работы функции (Обработка тестировалась на платформах 8.3.14,15,16 но должна стабильно работать на всех 8x).
// Осуществляет поиск ссылки по УИД(GUID) или массиву УИДов(GUID) // // Параметры: // УИД - Строка - Идентификатор строкой. // - Массив - Массив идентификаторов строкой. // //Возвращаемое значение: // - Неопределено - Если не удалось определить ни одну ссылку по параметру УИД. // - ЛюбаяСсылка - Если в параметр "УИД" была передана строка. // - ТаблицаЗначений - Если в параметр "УИД" был передан массив строк. // * УИД - Строка - Содержит идентифкатор строкой по которому удалось определить ссылку. // * Ссылка - ЛюбаяСсылка - Содержит ссылку на объект. // // Пример: // РезультатПоиска = НайтиСсылкуПоУИД("31f35109-f60a-4777-a555-f8a46c5a165d") ... // Функция НайтиСсылкуПоУИД(знач УИД) Экспорт ЭтоМассив = ТипЗнч(УИД) = Тип("Массив"); МассивУидов = Новый Массив; Если ЭтоМассив Тогда МассивУидов = УИД; Иначе МассивУидов.Добавить(УИД); КонецЕсли; Результат = Неопределено; МассивМетаданных = Новый Массив; МассивМетаданных.Добавить(Справочники); МассивМетаданных.Добавить(Документы); МассивМетаданных.Добавить(ПланыВидовХарактеристик); МассивМетаданных.Добавить(ПланыСчетов); МассивМетаданных.Добавить(ПланыВидовРасчета); МассивМетаданных.Добавить(ПланыОбмена); МассивМетаданных.Добавить(БизнесПроцессы); МассивМетаданных.Добавить(Задачи); МассивТипов = Новый Массив; Для Каждого СтрМетаданное Из МассивМетаданных Цикл Для Каждого Стр Из СтрМетаданное.ТипВсеСсылки().Типы() Цикл МассивТипов.Добавить(Стр); КонецЦикла; КонецЦикла; ТаблицаСсылок = Новый ТаблицаЗначений; ТаблицаСсылок.Колонки.Добавить("УИД" , Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(36))); ТаблицаСсылок.Колонки.Добавить("Ссылка" , Новый ОписаниеТипов(МассивТипов)); Для Каждого СтрМетаданное Из МассивМетаданных Цикл Для Каждого Менеджер Из СтрМетаданное Цикл Для Каждого СтрУИД Из МассивУидов Цикл Попытка НовСтр = ТаблицаСсылок.Добавить(); НовСтр.Ссылка = Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрУИД)); НовСтр.УИД = СтрУИД; Исключение КонецПопытки; КонецЦикла; КонецЦикла; КонецЦикла; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ТаблицаСсылок.Ссылка КАК Ссылка, | ТаблицаСсылок.УИД КАК УИД |ПОМЕСТИТЬ ВТ |ИЗ | &ТаблицаСсылок КАК ТаблицаСсылок |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ.Ссылка КАК Ссылка, | ВТ.УИД КАК УИД |ИЗ | ВТ КАК ВТ |ГДЕ | НЕ ВТ.Ссылка.ПометкаУдаления ЕСТЬ NULL"; Запрос.УстановитьПараметр("ТаблицаСсылок",ТаблицаСсылок); РезультатЗапроса = Запрос.Выполнить(); Если Не РезультатЗапроса.Пустой() Тогда Если ЭтоМассив Тогда Результат = РезультатЗапроса.Выгрузить(); Иначе ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); ВыборкаДетальныеЗаписи.Следующий(); Результат = ВыборкаДетальныеЗаписи.Ссылка; КонецЕсли; КонецЕсли; Возврат Результат; КонецФункции // НайтиСсылкуПоУИД