Имя: Пароль:
1C
1С v8
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) Вам надо именно программно список получить? Просто есть в конфиге такая штука как "поиск ссылок на объект"