|
|
1С 8.3 Как вывести список метаданных с отбором по типу данных реквизита? |
☑ |
|
0
lookingfor
10.12.22
✎
12:55
|
Здравствуйте! Как можно отобрать метаданные "Документы", у которых есть реквизит или реквизит табличной части с определенным типом, например тип спр.Валюта?
Мне нужно получить все документы у которых есть реквизит с определенным типом(в том числе реквизит может быть в ТЧ) и даже если тип реквизита составной. Эти документы я буду выводить в поле списка. Могу вывести все наименования метаданных"Документы", но мне нужно только содержащие определенный тип в своих реквизитах
|
|
|
1
Kassern
10.12.22
✎
13:07
|
(0) Обходите в цикле все метаданные документов, там же и проверку на тип делаете, если есть, то выводите
|
|
|
2
Kigo_Kigo
10.12.22
✎
13:20
|
Что то в общих модулях было типа в БСП - ЕстьРеквизитШапки("ИмяРек") и ЕстьРеквизитТабличнойЧасти("ИмяРек") , не помню уже
|
|
|
3
Kassern
10.12.22
✎
13:26
|
(0) Все же просто там. Есть Коллекция Реквизиты (это шапка документа), есть коллекции "ТабличныеЧасти", а в них так же есть Реквизиты. Обходите это дело и проверяете на Реквизит.Тип.СодержитТип(ПроверяемыйТип)
|
|
|
4
lookingfor
10.12.22
✎
13:55
|
(3), Спасибо за ответ! Как раз начал делать с обходом в цикле, других идей как сделать оптимальнее не нашлось.
Оставляю для потомков может кому-то пригодится:
МассивДокументов = Новый Массив;
Для Каждого Док Из Метаданные.Документы Цикл
Для Каждого Реквизит Из Док.Реквизиты Цикл
Если Реквизит.Тип.СодержитТип(Тип("Какой-тоТип")) Тогда
МассивДокументов.Добавить(Док.Синоним);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат МассивДокументов;
Не умею на этом форуме оформлять код)) Это только для проверки реквизитов документа,для ТЧ ещё не дописал обход. МассивДокументов потом загружаю в список значений для поля на форме.
|
|
|
5
lookingfor
10.12.22
✎
13:58
|
(2) , спасибо что ответили и предложили вариант. Я посмотрел, там требуется имя реквизита, а у меня задача с отбором по типу реквизита сделать. Поэтому решил, что мне такое не подойдет)
|
|
|
6
Kassern
10.12.22
✎
13:59
|
(4) Можно тут и через рекурсию, но мне лениво, а так, что-то подобное получится:
МассивДок=Новый Массив;
ПроверяемыйТип=Тип("СправочникСсылка.Валюты");
Для Каждого МетаданныеДок Из Метаданные.Документы Цикл
ИмяДок=МетаданныеДок.Имя;
Если КоллекцияСодержитПроверяемыйТип(МетаданныеДок.Реквизиты,ПроверяемыйТип)
И МассивДок.Найти(ИмяДок)=Неопределено Тогда
МассивДок.Добавить(ИмяДок);
КонецЕсли;
Если МассивДок.Найти(ИмяДок)=Неопределено Тогда
Для Каждого ТабличнаяЧасть Из МетаданныеДок.ТабличныеЧасти Цикл
Если КоллекцияСодержитПроверяемыйТип(ТабличнаяЧасть.Реквизиты,ПроверяемыйТип)
И МассивДок.Найти(ИмяДок)=Неопределено Тогда
МассивДок.Добавить(ИмяДок);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
&НаСервереБезКонтекста
Функция КоллекцияСодержитПроверяемыйТип(Коллекция,ПроверяемыйТип)
Результат=Ложь;
Для Каждого Реквизит Из Коллекция Цикл
Если Реквизит.Тип.СодержитТип(ПроверяемыйТип) Тогда
Результат=Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
|
|
|
7
rudnitskij
11.12.22
✎
18:28
|
(0) Вам надо именно программно список получить? Просто есть в конфиге такая штука как "поиск ссылок на объект"
|
|
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший