1С - Получить список всех регистров накопления/сведений и их поля

возникла проблема. Требуется получить список регистров и их поля вместе с типами.

С получением списка не виртуальных регистров особых проблем не возникло, но для виртуальных таблиц пришлось несколько выкручиваться.

&НаСервереБезКонтекста
Функция ПолучитьСписокИсточниковДанных()
    СписокИсточников = Новый Массив;
    СписокИсточников.Добавить(_ПолучитьСписокИсточниковДанных(Метаданные.РегистрыНакопления, 
                              БиблиотекаКартинок.РегистрНакопления, "РегистрНакопления"));
    СписокИсточников.Добавить(_ПолучитьСписокИсточниковДанных(Метаданные.РегистрыСведений, 
                              БиблиотекаКартинок.РегистрСведений, "РегистрСведений"));
    
    Возврат СписокИсточников;   
КонецФункции

// Формирует список регистров определенного типа
 &НаСервереБезКонтекста
 Функция _ПолучитьСписокИсточниковДанных(СписокИсточников, Отображение, ТипДанных);
    _Результат = Новый Массив;
    Для Каждого ИсточникИзМетаданных Из СписокИсточников Цикл
        // Записываем не виртуальный регистр
        _Результат.Добавить(_СформироватьЗначение(ИсточникИзМетаданных.Имя, Отображение, ТипДанных)); 
        Попытка
        ИмяРег = Строка(ИсточникИзМетаданных.Имя) + "." + Строка(ИсточникИзМетаданных.ВидРегистра); // Формирует имя вида виртуальной таблицы (если есть)
        _Результат.Добавить(_СформироватьЗначение(ИмяРег, Отображение, ТипДанных));
        Исключение
                
        КонецПопытки;
    КонецЦикла;
    Возврат _Результат; 
КонецФункции


&НаСервереБезКонтекста
Функция _СформироватьЗначение(ИсточникИзМетаданных, Отображение, ТипДанных)
    Источник = Новый Структура;
    Источник.Вставить("Источник", ИсточникИзМетаданных);
    Источник.Вставить("Отображение", Отображение);
    Источник.Вставить("ТипДанных", ТипДанных);
    Возврат Источник;    
КонецФункции

Код работает только для виртуальных таблиц регистров накопления, но в данном случае это не критично, хотя если есть способ лучше, буду премного благодарен.

Основная проблема возникла заключается в получении списка полей для виртуальных таблиц регистров.

ПолнИмя = "РегистрНакопления." + СтрЗнач; 
рег = Метаданные.НайтиПоПолномуИмени(ПолнИмя);
Попытка      
    ЗаполнитьСтруктуруИсточникаДанных(Метаданные.РегистрыНакопления[рег.Имя].Измерения); 
Исключение      
КонецПопытки;
Попытка         
    ЗаполнитьСтруктуруИсточникаДанных(Метаданные.РегистрыНакопления[рег.Имя].Ресурсы);
Исключение
КонецПопытки;
Попытка      
    ЗаполнитьСтруктуруИсточникаДанных(Метаданные.РегистрыНакопления[рег.Имя].Реквизиты);
Исключение
КонецПопытки;

Этот метод работает только для не виртуальных таблиц, возможно ли получение полей и их типов виртуальных таблиц регистров?


Ответы (1 шт):

Автор решения: mazik7512

В общем оставлю здесь это для будущих поколений, не уверен что этот способ самый правильный, но другого я просто на просто не нашел.

Для того чтобы получить измерения/ресурсы/реквизиты всех таблиц (даже виртуальных) можно использовать запросы и РезультатЗапроса (и ограничить его выбором одного значения, дабы не нагружать БД).


&НаСервере
Процедура ЗаполнитьСтруктуруИсточникаДанных(СтруктураИсточникаДанных)
    // Заполнение
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПолучитьСтруктуруИсточникаДанных(ИсточникДанных)
    ПолнИмя = "РегистрНакопления." + ИсточникДанных; // Например, регистр накопления
    Запрос = Новый Запрос;
    ТекстЗапрос = "ВЫБРАТЬ ПЕРВЫЕ 1
                       |*
                       |ИЗ
                       |" + ПолнИмя;
    Запрос.Текст = ТекстЗапрос;
    Выборка = Запрос.Выполнить().Выбрать();
    Колонки = Выборка.Владелец().Колонки; // Получаем РезультатЗапроса через Владелец()
    ЗаполнитьСтруктуруИсточникаДанных(Колонки);
КонецПроцедуры

→ Ссылка