//ирПортативный Перем ирПортативный Экспорт; //ирПортативный Перем ирОбщий Экспорт; //ирПортативный Перем ирСервер Экспорт; //ирПортативный Перем ирКэш Экспорт; //ирПортативный Перем ирПривилегированный Экспорт; Перем РежимОтладки Экспорт; Перем мВнешниеНаборыДанных Экспорт; Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) #Если _ Тогда СхемаКомпоновки = Новый СхемаКомпоновкиДанных; КонечнаяНастройка = Новый НастройкиКомпоновкиДанных; мВнешниеНаборыДанных = Новый Структура; ДокументРезультат = Новый ТабличныйДокумент; #КонецЕсли СтандартнаяОбработка = Ложь; мВнешниеНаборыДанных = ВнешниеНаборыДанных(); Если мВнешниеНаборыДанных = Неопределено Тогда Возврат; КонецЕсли; КонечнаяНастройка = КомпоновщикНастроек.Настройки; Если РежимОтладки = 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;