RDT1C/Reports/ирАнализЗамераПроизводительности/Ext/ObjectModule.bsl
Администратор 12b4bb0b95 .
2021-07-25 23:08:08 +03:00

242 lines
21 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.

//ирПортативный Перем ирПортативный Экспорт;
//ирПортативный Перем ирОбщий Экспорт;
//ирПортативный Перем ирСервер Экспорт;
//ирПортативный Перем ирКэш Экспорт;
//ирПортативный Перем ирПривилегированный Экспорт;
Перем РежимОтладки Экспорт;
Перем мВнешниеНаборыДанных Экспорт;
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
#Если _ Тогда
СхемаКомпоновки = Новый СхемаКомпоновкиДанных;
КонечнаяНастройка = Новый НастройкиКомпоновкиДанных;
мВнешниеНаборыДанных = Новый Структура;
ДокументРезультат = Новый ТабличныйДокумент;
#КонецЕсли
СтандартнаяОбработка = Ложь;
мВнешниеНаборыДанных = ВнешниеНаборыДанных();
Если мВнешниеНаборыДанных = Неопределено Тогда
Возврат;
КонецЕсли;
КонечнаяНастройка = КомпоновщикНастроек.Настройки;
Если РежимОтладки = 2 Тогда
ирОбщий.ОтладитьЛкс(СхемаКомпоновкиДанных, , КонечнаяНастройка, мВнешниеНаборыДанных);
Возврат;
КонецЕсли;
ДокументРезультат.Очистить();
ирОбщий.СкомпоноватьВТабличныйДокументЛкс(СхемаКомпоновкиДанных, КонечнаяНастройка, ДокументРезультат, мВнешниеНаборыДанных, ДанныеРасшифровки);
КонецПроцедуры
// Параметры:
// КомпоновщикНастроек - ? -
// ВнешниеНаборыДанных - Структура -
// ТипВыхода - Строка - Служебный параметр для перехода после вызова метода
Функция ВнешниеНаборыДанных() Экспорт
ФайлЗамера = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ФайлЗамера")).Значение;
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Файл", Новый ОписаниеТипов("Строка"));
Таблица.Колонки.Добавить("Модуль", Новый ОписаниеТипов("Строка"));
Таблица.Колонки.Добавить("ИДМодуля", Новый ОписаниеТипов("Строка"));
Таблица.Колонки.Добавить("Текст", Новый ОписаниеТипов("Строка"));
Таблица.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"));
Таблица.Колонки.Добавить("НомерПервойСтрокиМетода", Новый ОписаниеТипов("Число"));
Таблица.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
Таблица.Колонки.Добавить("ВремяЧистое", Новый ОписаниеТипов("Число"));
Таблица.Колонки.Добавить("ВремяЧистоеСВложенными", Новый ОписаниеТипов("Число"));
Таблица.Колонки.Добавить("ВремяПроцент", Новый ОписаниеТипов("Число"));
Таблица.Колонки.Добавить("ВремяПроцентСВложенными", Новый ОписаниеТипов("Число"));
Таблица.Колонки.Добавить("Клиент", Новый ОписаниеТипов("Булево"));
Таблица.Колонки.Добавить("Сервер", Новый ОписаниеТипов("Булево"));
Таблица.Колонки.Добавить("ОбработкаСервером", Новый ОписаниеТипов("Булево"));
Таблица.Колонки.Добавить("Метод", Новый ОписаниеТипов("Строка"));
Таблица.Колонки.Добавить("КоличествоВходов", Новый ОписаниеТипов("Число"));
Таблица.Колонки.Добавить("КоличествоВыходов", Новый ОписаниеТипов("Число"));
Таблица.Колонки.Добавить("СсылкаСтроки", Новый ОписаниеТипов("Строка"));
ТекстовыйДокумент = Новый ТекстовыйДокумент;
Попытка
ТекстовыйДокумент.Прочитать(ФайлЗамера);
Исключение
Сообщить("Ошибка чтения файла замера: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
Возврат Неопределено;
КонецПопытки;
ТекстГдеИскать = ТекстовыйДокумент.ПолучитьТекст();
// Пример
// {{"",0},ada14b12-452d-4f85-9d71-99554e8fc6c0,a78d9ce3-4e0c-48d5-9863-ae7342eedf94,0,00000000-0000-0000-0000-000000000000,0,AAAAAAAAAAAAAAAAAAAAAAAAAAA=,""},"МодульОбычногоПриложения",515,"Если глЗначениеПеременной(""глОбработкаАвтоОбменДанными"") = Неопределено Тогда",1,0.00023340955344883218397869,0.000020323812104611060902992,0.000450628996772107550476536,0.000039237892896673637698585,1,0,0,aaff96cf-5e0a-4e93-aa3e-70ab34e49a77,
// {ОписаниеРегулярногоВыражения.Начало} конструктор из подсистемы "Инструменты разработчика" (http://devtool1c.ucoz.ru)
// Перем УИД, ЭкспЧисло, Число, Строка, Запятая, Файл, ИДМодуля, Модуль, НомерСтроки, Текст, Количество, ВремяЧистоеСВложенными, ВремяЧистое, ВремяПроцентСВложенными, ВремяПроцент, Клиент, Сервер, ОбработкаСервером, ШаблонЗаписи;
// {Шаблон.Начало}
// + <УИД> = \b[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-Z0-9]{12}\b
// + <ЭкспЧисло> = [-+]?(?:\b[0-9]+(?:\.[0-9]*)?|\.[0-9]+\b)(?:[eE][-+]?[0-9]+\b)?
// + <Число> = (?:[\d]+)
// + <Строка> = "(?:(?:"")|[^"])*"
// + <Запятая> = \s*,\s*
// + <Файл> = (<Строка>)
// + <ИДМодуля> = (<УИД>)
// + <Модуль> = (<Строка>)
// + <НомерСтроки> = (<Число>)
// + <Текст> = (<Строка>)
// + <Количество> = (<Число>)
// + <ВремяЧистоеСВложенными> = (<ЭкспЧисло>)
// + <ВремяЧистое> = (<ЭкспЧисло>)
// + <ВремяПроцентСВложенными> = (<ЭкспЧисло>)
// + <ВремяПроцент> = (<ЭкспЧисло>)
// + <Клиент> = (<Число>)
// + <Сервер> = (<Число>)
// + <ОбработкаСервером> = (<Число>)
// + <ШаблонЗаписи> = {\s*{\s*<Файл><Запятая><Число>\s*}<Запятая><ИДМодуля><Запятая><ИДМодуля><Запятая><Число>\s*(?:<Запятая><УИД><Запятая><Число>(?:<Запятая>\w+=(?:<Запятая><Строка>)?)?)?}<Запятая><Модуль><Запятая><НомерСтроки><Запятая><Текст><Запятая><Количество><Запятая><ВремяЧистоеСВложенными><Запятая><ВремяЧистое><Запятая><ВремяПроцентСВложенными><Запятая><ВремяПроцент><Запятая><Клиент><Запятая><Сервер><Запятая><ОбработкаСервером><Запятая><УИД><Запятая>
// {Шаблон.Конец}
УИД = "\b[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-Z0-9]{12}\b";
ЭкспЧисло = "[-+]?(?:\b[0-9]+(?:\.[0-9]*)?|\.[0-9]+\b)(?:[eE][-+]?[0-9]+\b)?";
Число = "(?:[\d]+)";
Строка = """(?:(?:"""")|[^""])*""";
Запятая = "\s*,\s*";
Файл = "(" + Строка + ")";
ИДМодуля = "(" + УИД + ")";
Модуль = "(" + Строка + ")";
НомерСтроки = "(" + Число + ")";
Текст = "(" + Строка + ")";
Количество = "(" + Число + ")";
ВремяЧистоеСВложенными = "(" + ЭкспЧисло + ")";
ВремяЧистое = "(" + ЭкспЧисло + ")";
ВремяПроцентСВложенными = "(" + ЭкспЧисло + ")";
ВремяПроцент = "(" + ЭкспЧисло + ")";
КлиентФрагмент = "(" + Число + ")";
СерверФрагмент = "(" + Число + ")";
ОбработкаСервером = "(" + Число + ")";
ШаблонЗаписи = "{\s*{\s*" + Файл + "" + Запятая + "" + Число + "\s*}" + Запятая + "" + ИДМодуля + "" + Запятая + "" + ИДМодуля + "" + Запятая + "" + Число + "\s*(?:" + Запятая + "" + УИД + "" + Запятая + "" + Число
+ "(?:" + Запятая + "\w+=(?:" + Запятая + "" + Строка + ")?)?)?}" + Запятая + "" + Модуль + "" + Запятая + "" + НомерСтроки + "" + Запятая + "" + Текст + "" + Запятая + "" + Количество + "" + Запятая + ""
+ ВремяЧистоеСВложенными + "" + Запятая + "" + ВремяЧистое + "" + Запятая + "" + ВремяПроцентСВложенными + "" + Запятая + "" + ВремяПроцент + "" + Запятая + "" + КлиентФрагмент + "" + Запятая + ""
//+ СерверФрагмент + "" + Запятая + "" + ОбработкаСервером + "" + Запятая + "" + УИД + "" + Запятая + "";
+ СерверФрагмент + "" + Запятая + "" + ОбработкаСервером;
// {ОписаниеРегулярногоВыражения.Конец}
Вхождения = ирОбщий.НайтиРегулярноеВыражениеЛкс(ТекстГдеИскать, ШаблонЗаписи,
"Файл, ИДМодуля, ИДМодуля1, Модуль, НомерСтроки, Текст, Количество, ВремяЧистоеСВложенными, ВремяЧистое, ВремяПроцентСВложенными, ВремяПроцент, Клиент, Сервер, ОбработкаСервером");
#Если СерверФрагмент И Не СерверФрагмент Тогда
Вхождения = Обработки.ирПлатформа.Создать().ВхожденияРегВыражения;
#КонецЕсли
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(Вхождения.Количество());
Для Каждого Вхождение Из Вхождения Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
СтрокаЗамера = Таблица.Добавить();
СтрокаЗамера.Файл = Вычислить(Вхождение.Файл);
СтрокаЗамера.ИДМодуля = Вхождение.ИДМодуля + "," + Вхождение.ИДМодуля1;
ИмяМодуля = Вычислить(Вхождение.Модуль);
Фрагменты = ирОбщий.СтрРазделитьЛкс(ИмяМодуля, ":");
СтрокаЗамера.Модуль = Фрагменты[0];
Если Фрагменты.Количество() > 1 Тогда
СтрокаЗамера.Метод = Фрагменты[1];
КонецЕсли;
СтрокаЗамера.НомерСтроки = Число(Вхождение.НомерСтроки);
СтрокаЗамера.Текст = Вычислить(Вхождение.Текст);
СтрокаЗамера.Количество = Число(Вхождение.Количество);
СтрокаЗамера.ВремяЧистоеСВложенными = Число(Вхождение.ВремяЧистоеСВложенными);
СтрокаЗамера.ВремяЧистое = Число(Вхождение.ВремяЧистое);
СтрокаЗамера.ВремяПроцентСВложенными = Число(Вхождение.ВремяПроцентСВложенными);
СтрокаЗамера.ВремяПроцент = Число(Вхождение.ВремяПроцент);
СтрокаЗамера.Клиент = Число(Вхождение.Клиент);
СтрокаЗамера.Сервер = Число(Вхождение.Сервер);
СтрокаЗамера.ОбработкаСервером = Число(Вхождение.ОбработкаСервером);
Если НРег(ирОбщий.ПоследнийФрагментЛкс(СтрокаЗамера.Модуль)) <> "epf" Тогда
СтрокаЗамера.СсылкаСтроки = "{" + СтрокаЗамера.Модуль + "(" + XMLСтрока(СтрокаЗамера.НомерСтроки) + ")}";
КонецЕсли;
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
Таблица.Сортировать("ИДМодуля, НомерСтроки, Клиент");
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
Если ИзвлекатьИменаМетодов Тогда
ТекстыМодулей = Неопределено;
СтароеИмяФайлаМодуляБезРасширения = "";
РегВыражение = ирКэш.ВычислительРегВыраженийЛкс();
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(Таблица.Количество(), "Заполнение имен методов");
// Идем с конца, чтобы чаще попадать в размеченные диапазоны модулей
НачальноеКоличество = Таблица.Количество();
Для Счетчик = 1 По НачальноеКоличество Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
СтрокаЗамера = Таблица[НачальноеКоличество - Счетчик];
СтрокаЗамера.Метод = мПлатформа.НайтиИмяМетодаСтрокиМодуля(СтрокаЗамера.Модуль, СтрокаЗамера.НомерСтроки, СтрокаЗамера.Текст, ТекстыМодулей, СтароеИмяФайлаМодуляБезРасширения);
Если ВстроитьИменаМетодовВФайл И ЗначениеЗаполнено(СтрокаЗамера.Метод) Тогда
РегВыражение.Pattern = """" + СтрокаЗамера.Модуль + "(?:\:" + мПлатформа.шИмя + ")?""," + XMLСтрока(СтрокаЗамера.НомерСтроки) + ",";
ТекстГдеИскать = РегВыражение.Replace(ТекстГдеИскать, """" + СтрокаЗамера.Модуль + ":" + СтрокаЗамера.Метод + """," + XMLСтрока(СтрокаЗамера.НомерСтроки) + ",");
КонецЕсли;
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
Если ВстроитьИменаМетодовВФайл Тогда
ТекстовыйДокумент.УстановитьТекст(ТекстГдеИскать);
ТекстовыйДокумент.Записать(ФайлЗамера);
ЭтотОбъект.ВстроитьИменаМетодовВФайл = Ложь;
КонецЕсли;
КонецЕсли;
НомерМетода = 0;
ПредыдущаяСтрока = Неопределено;
Для Каждого СтрокаЗамера Из Таблица Цикл
ЭтоНовыйМетод = ПредыдущаяСтрока = Неопределено;
Если Истина
И ПредыдущаяСтрока <> Неопределено
И (Ложь
Или Найти(НРег(ПредыдущаяСтрока.Текст), Нрег("КонецПроцедуры")) > 0
Или Найти(НРег(ПредыдущаяСтрока.Текст), Нрег("КонецФункции")) > 0
Или ЗначениеЗаполнено(СтрокаЗамера.Метод) И ПредыдущаяСтрока.Метод <> СтрокаЗамера.Метод)
Тогда
ПредыдущаяСтрока.КоличествоВыходов = ПредыдущаяСтрока.Количество;
Если ПредыдущаяСтрока.НомерСтроки <> СтрокаЗамера.НомерСтроки Тогда
ЭтоНовыйМетод = Истина;
КонецЕсли;
КонецЕсли;
Если Истина
И ПредыдущаяСтрока <> Неопределено
И ПредыдущаяСтрока.ИДМодуля <> СтрокаЗамера.ИДМодуля
Тогда
ЭтоНовыйМетод = Истина;
КонецЕсли;
Если Ложь
Или ЭтоНовыйМетод
Или (Истина
И ПредыдущаяСтрока <> Неопределено
И ПредыдущаяСтрока.КоличествоВходов > 0
И ПредыдущаяСтрока.ИДМодуля = СтрокаЗамера.ИДМодуля
И ПредыдущаяСтрока.НомерСтроки = СтрокаЗамера.НомерСтроки)
Тогда
СтрокаЗамера.КоличествоВходов = СтрокаЗамера.Количество;
СтрокаЗамера.НомерПервойСтрокиМетода = СтрокаЗамера.НомерСтроки;
КонецЕсли;
Если ЭтоНовыйМетод Тогда
НомерМетода = НомерМетода + 1;
КонецЕсли;
Если Не ЗначениеЗаполнено(СтрокаЗамера.Метод) Тогда
СтрокаЗамера.Метод = "Метод" + XMLСтрока(НомерМетода);
КонецЕсли;
ПредыдущаяСтрока = СтрокаЗамера;
КонецЦикла;
СтрокаЗамера.КоличествоВыходов = СтрокаЗамера.Количество;
мВнешниеНаборыДанных = Новый Структура("Таблица", Таблица);
Возврат мВнешниеНаборыДанных;
КонецФункции
//ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла);
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf";
//ирПортативный #Если Клиент Тогда
//ирПортативный Контейнер = Новый Структура();
//ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный ирПортативный.Открыть();
//ирПортативный КонецЕсли;
//ирПортативный #Иначе
//ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
//ирПортативный #КонецЕсли
//ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер");
//ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный");
РежимОтладки = 0;