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