RDT1C/Reports/ирАнализМетаданных/Ext/ObjectModule.bsl
Администратор a918ea8c95 .
2020-11-30 09:43:36 +03:00

268 lines
19 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//ирПортативный Перем ирПортативный Экспорт;
//ирПортативный Перем ирОбщий Экспорт;
//ирПортативный Перем ирСервер Экспорт;
//ирПортативный Перем ирКэш Экспорт;
//ирПортативный Перем ирПривилегированный Экспорт;
Перем РежимОтладки Экспорт;
Перем мОбъекты;
Перем мКолонкиРасширенногоПредставления;
Перем СтарыйТипОбъектов;
Перем СтарыйРасширенныеПредставления;
Функция СхемаКомпоновки() Экспорт
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
Если ТипОбъектов <> СтарыйТипОбъектов Тогда
мОбъекты = Новый ТаблицаЗначений;
мКолонкиРасширенногоПредставления = Новый СписокЗначений;
мОбъекты.Колонки.Добавить("ОбъектМД");
мОбъекты.Колонки.Добавить("ПолноеИмя");
мОбъекты.Колонки.Добавить("ПолноеИмяРодителя");
СтруктураТипаОбъекта = мПлатформа.НоваяСтруктураТипа();
СтруктураТипаОбъекта.ИмяОбщегоТипа = ТипОбъектов;
СвойстваЦелевогоОбъекта = мПлатформа.ПолучитьТаблицуСловСтруктурыТипа(СтруктураТипаОбъекта,,,,,, "Свойство");
Для Каждого Свойство Из СвойстваЦелевогоОбъекта Цикл
Если Ложь
Или Свойство.Слово = "ПринадлежностьОбъекта" // Бесполезное свойство метаданных
Или Свойство.ТипЗначения = "Неопределено"
Или Свойство.ТипЗначения = "КоллекцияЗначенийСвойстваОбъектаМетаданных"
Или Свойство.ТипЗначения = "ОписанияСтандартныхРеквизитов"
Или Свойство.ТипЗначения = "ОписанияСтандартныхТабличныхЧастей"
Или ирОбщий.ПервыйФрагментЛкс(Свойство.ТипЗначения, ":") = "КоллекцияОбъектовМетаданных"
Тогда
Продолжить;
КонецЕсли;
Если Ложь
Или Свойство.ТипЗначения = "Булево"
Или Свойство.ТипЗначения = "Число"
Тогда
ОписаниеТипов = Новый ОписаниеТипов("Строка," + Свойство.ТипЗначения);
Иначе
ОписаниеТипов = Новый ОписаниеТипов("Строка",,,, Новый КвалификаторыСтроки(300));
Если Свойство.ТипЗначения <> "Строка" Тогда
мКолонкиРасширенногоПредставления.Добавить(Свойство.Слово);
КонецЕсли;
КонецЕсли;
мОбъекты.Колонки.Добавить(Свойство.Слово, ОписаниеТипов);
КонецЦикла;
мКолонкиРасширенногоПредставления.СортироватьПоЗначению();
мКолонкиРасширенногоПредставления = мКолонкиРасширенногоПредставления.ВыгрузитьЗначения();
КонецЕсли;
Схема = ирОбщий.СоздатьСхемуПоТаблицамЗначенийЛкс(Новый Структура("Объекты", мОбъекты));
Возврат Схема;
КонецФункции
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
мПлатформа = ирКэш.Получить();
СхемаКомпоновкиДанных = СхемаКомпоновки();
#Если _ Тогда
СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
КонечнаяНастройка = Новый НастройкиКомпоновкиДанных;
ВнешниеНаборыДанных = Новый Структура;
ДокументРезультат = Новый ТабличныйДокумент;
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
СтандартнаяОбработка = Ложь;
Если Ложь
Или ТипОбъектов <> СтарыйТипОбъектов
Или РасширенныеПредставления <> СтарыйРасширенныеПредставления
Тогда
СтруктураТипа = мПлатформа.ПолучитьСтруктуруТипаИзЗначения(Метаданные);
ЛиЦелевойТипКорневой = ЭтоКорневойТипМетаданных(ТипОбъектов);
СобратьОбъектыМетаданных(СтруктураТипа, ЛиЦелевойТипКорневой);
мОбъекты = ирОбщий.ТаблицаСМинимальнымиТипамиКолонокЛкс(мОбъекты);
СтарыйТипОбъектов = ТипОбъектов;
СтарыйРасширенныеПредставления = РасширенныеПредставления;
КонецЕсли;
КонечнаяНастройка = КомпоновщикНастроек.ПолучитьНастройки();
ВнешниеНаборыДанных = Новый Структура("Объекты", мОбъекты);
Если РежимОтладки = 2 Тогда
ирОбщий.ОтладитьЛкс(СхемаКомпоновкиДанных, , КонечнаяНастройка, ВнешниеНаборыДанных);
Возврат;
КонецЕсли;
ДокументРезультат.Очистить();
ирОбщий.СкомпоноватьВТабличныйДокументЛкс(СхемаКомпоновкиДанных, КонечнаяНастройка, ДокументРезультат, ВнешниеНаборыДанных, ДанныеРасшифровки);
КонецПроцедуры
// Параметры:
// СтруктураТипа - Структура -
// Результат - ТаблицаЗначений -
// НачальноеКоличествоКолонок - Число -
// Результат:
// Булево - были ли подходящие коллекции
Функция СобратьОбъектыМетаданных(СтруктураТипа, Знач ЛиЦелевойТипКорневой, Знач ПолноеИмяРодителя = Неопределено, Знач ЗащитаРекурсия = Неопределено, Знач СвойстваРекурсия = Неопределено) Экспорт
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
мОбъекты = Новый ТаблицаЗначений;
#КонецЕсли
ТаблицаОбщихТипов = мПлатформа.ТаблицаОбщихТипов;
Если ЗащитаРекурсия = Неопределено Тогда
ЗащитаРекурсия = Новый Соответствие;
КонецЕсли;
Если СвойстваРекурсия = Неопределено Тогда
СвойстваРекурсия = Новый Соответствие;
КонецЕсли;
Свойства = СвойстваРекурсия[СтруктураТипа.ИмяОбщегоТипа];
Если Свойства = Неопределено Тогда
СвойстваВсе = мПлатформа.ПолучитьТаблицуСловСтруктурыТипа(СтруктураТипа,,,, Ложь,, "Свойство");
Свойства = Новый Структура;
Для Каждого Свойство Из СвойстваВсе Цикл
Если Свойство.Слово = "Состав" Тогда
Продолжить;
КонецЕсли;
СтрокаТипаЗначения = ТаблицаОбщихТипов.НайтиСтроки(Новый Структура("ЯзыкПрограммы, Слово", 0, Свойство.ТипЗначения));
Если СтрокаТипаЗначения.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
Свойства.Вставить(Свойство.Слово, СтрокаТипаЗначения[0].ТипЭлементаКоллекции);
КонецЦикла;
СвойстваРекурсия[СтруктураТипа.ИмяОбщегоТипа] = Свойства;
КонецЕсли;
Если ПолноеИмяРодителя = Неопределено Тогда
ИндикаторСвойств = ирОбщий.ПолучитьИндикаторПроцессаЛкс(Свойства.Количество());
КонецЕсли;
ЛиБылиПодходящиеКоллекции = Ложь;
Для Каждого Свойство Из Свойства Цикл
Если ИндикаторСвойств <> Неопределено Тогда
ирОбщий.ОбработатьИндикаторЛкс(ИндикаторСвойств);
КонецЕсли;
ТипЭлементаКоллекции = Свойство.Значение;
ИмяСвойства = Свойство.Ключ;
Если Истина
И ЗначениеЗаполнено(ТипЭлементаКоллекции)
И Найти(ТипЭлементаКоллекции, ",") = 0
Тогда
Если ТипЭлементаКоллекции = ТипОбъектов Тогда
ЛиБылиПодходящиеКоллекции = Истина;
КонецЕсли;
Попытка
КоллекцияВСвойстве = СтруктураТипа.Метаданные[ИмяСвойства];
Исключение
Продолжить;
КонецПопытки;
Если КоллекцияВСвойстве = Неопределено Тогда
Продолжить;
КонецЕсли;
ИндикаторКоллекции = Неопределено;
Если ПолноеИмяРодителя = Неопределено Тогда
ИндикаторКоллекции = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоллекцияВСвойстве.Количество(), ИмяСвойства);
КонецЕсли;
СтруктураТипаОбъекта = Неопределено;
Для Каждого ОбъектМД Из КоллекцияВСвойстве Цикл
#Если Сервер И Не Сервер Тогда
ОбъектМД = Метаданные.Справочники.ирАлгоритмы;
#КонецЕсли
Если ИндикаторКоллекции <> Неопределено Тогда
ирОбщий.ОбработатьИндикаторЛкс(ИндикаторКоллекции);
КонецЕсли;
ПолноеИмяМД = "";
Попытка
ПолноеИмяМД = ОбъектМД.ПолноеИмя();
Исключение
// Пакет XDTO
// Описание стандартного реквизита
Попытка
ИмяОбъекта = ОбъектМД.Имя;
Исключение
ИмяОбъекта = "";
КонецПопытки;
Если ЗначениеЗаполнено(ИмяОбъекта) Тогда
ПолноеИмяМД = ПолноеИмяРодителя + "." + ирОбщий.ПоследнийФрагментЛкс(ТипЭлементаКоллекции, " ") + "." + ОбъектМД.Имя;
КонецЕсли;
КонецПопытки;
Если ТипЭлементаКоллекции = ТипОбъектов Тогда
СтрокаНайденного = мОбъекты.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаНайденного, ОбъектМД);
Если РасширенныеПредставления Тогда
Для Каждого ИмяКолонкиРезультата Из мКолонкиРасширенногоПредставления Цикл
Попытка
ЗначениеСвойства = ОбъектМД[ИмяКолонкиРезультата];
Исключение
// Измерение последовательности
Продолжить;
КонецПопытки;
СтрокаНайденного[ИмяКолонкиРезультата] = ирОбщий.РасширенноеПредставлениеЗначенияЛкс(ЗначениеСвойства);
КонецЦикла;
КонецЕсли;
СтрокаНайденного.ОбъектМД = ОбъектМД;
СтрокаНайденного.ПолноеИмя = ПолноеИмяМД;
СтрокаНайденного.ПолноеИмяРодителя = ПолноеИмяРодителя;
КонецЕсли;
Если ЗначениеЗаполнено(ПолноеИмяМД) Тогда
Если ЗащитаРекурсия[ПолноеИмяМД ] = 1 Тогда
Продолжить;
КонецЕсли;
ЗащитаРекурсия[ПолноеИмяМД] = 1;
КонецЕсли;
Если СтруктураТипаОбъекта = Неопределено Тогда
СтруктураТипаОбъекта = мПлатформа.НоваяСтруктураТипа();
СтруктураТипаОбъекта.ИмяОбщегоТипа = ТипЭлементаКоллекции;
КонецЕсли;
СтруктураТипаОбъекта.Метаданные = ОбъектМД;
Если Не ЛиЦелевойТипКорневой Тогда
ЛиБылиПодходящиеКоллекцииСнизу = СобратьОбъектыМетаданных(СтруктураТипаОбъекта, ЛиЦелевойТипКорневой, ПолноеИмяМД, ЗащитаРекурсия, СвойстваРекурсия);
Если ЛиБылиПодходящиеКоллекцииСнизу Тогда
ЛиБылиПодходящиеКоллекции = Истина;
КонецЕсли;
Если Не ЛиБылиПодходящиеКоллекции Тогда
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ИндикаторКоллекции <> Неопределено Тогда
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ИндикаторСвойств <> Неопределено Тогда
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
КонецЕсли;
Возврат ЛиБылиПодходящиеКоллекции;
КонецФункции
Функция ЭтоКорневойТипМетаданных(ИмяОбщегоТипа) Экспорт
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
СтрокаТипаКоллекции = мПлатформа.ТаблицаОбщихТипов.НайтиСтроки(Новый Структура("ЯзыкПрограммы, ТипЭлементаКоллекции", 0, ИмяОбщегоТипа));
СтрокаТипаКоллекции = СтрокаТипаКоллекции[0];
Найденные = мПлатформа.ТаблицаКонтекстов.НайтиСтроки(Новый Структура("ЯзыкПрограммы, ТипЗначения, ТипСлова", 0, СтрокаТипаКоллекции.Слово, "Свойство"));
Результат = Истина;
Для Каждого СтрокаКонтекста Из Найденные Цикл
Если СтрокаКонтекста.ТипКонтекста <> "ОбъектМетаданныхКонфигурация" Тогда
Результат = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
//ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла);
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf";
//ирПортативный #Если Клиент Тогда
//ирПортативный Контейнер = Новый Структура();
//ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный ирПортативный.Открыть();
//ирПортативный КонецЕсли;
//ирПортативный #Иначе
//ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
//ирПортативный #КонецЕсли
//ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер");
//ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный");
РежимОтладки = 0;
ТипОбъектов = "ОбъектМетаданных: Измерение";