//ирПортативный Перем ирПортативный Экспорт;
//ирПортативный Перем ирОбщий Экспорт;
//ирПортативный Перем ирСервер Экспорт;
//ирПортативный Перем ирКэш Экспорт;
//ирПортативный Перем ирКлиент Экспорт;

Перем РежимОтладки Экспорт;
Перем мВнешниеНаборыДанных Экспорт;

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	#Если _ Тогда
		СхемаКомпоновки = Новый СхемаКомпоновкиДанных;
		КонечнаяНастройка = Новый НастройкиКомпоновкиДанных;
		мВнешниеНаборыДанных = Новый Структура;
		ДокументРезультат = Новый ТабличныйДокумент;
	#КонецЕсли
	СтандартнаяОбработка = Ложь;
	мВнешниеНаборыДанных = ВнешниеНаборыДанных();
	Если мВнешниеНаборыДанных = Неопределено Тогда
		Возврат;
	КонецЕсли;
	КонечнаяНастройка = КомпоновщикНастроек.Настройки;
	Если РежимОтладки = 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" Тогда
			СтрокаЗамера.СсылкаСтроки = ирОбщий.СсылкаСтрокиМодуляЛкс(СтрокаЗамера.Модуль, СтрокаЗамера.НомерСтроки, СтрокаЗамера.Метод);
		КонецЕсли; 
	КонецЦикла;
	ирОбщий.ОсвободитьИндикаторПроцессаЛкс();   
	Таблица.Сортировать("ИДМодуля, НомерСтроки, Клиент");
	мПлатформа = ирКэш.Получить();
	#Если Сервер И Не Сервер Тогда
		мПлатформа = Обработки.ирПлатформа.Создать();
	#КонецЕсли
	Если ИзвлекатьИменаМетодов Тогда
		ТекстыМодулей = Неопределено;
		СтароеИмяФайлаМодуляБезРасширения = "";    
		РегВыражение = ирКэш.ВычислительРегВыраженийЛкс();
		Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(Таблица.Количество(), "Заполнение имен методов");
		// Идем с конца, чтобы чаще попадать в размеченные диапазоны модулей
		НачальноеКоличество = Таблица.Количество(); 
		Для Счетчик = 1 По НачальноеКоличество Цикл
			ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
			СтрокаЗамера = Таблица[НачальноеКоличество - Счетчик];
			СтрокаЗамера.Метод = мПлатформа.НайтиИмяМетодаСтрокиМодуля(СтрокаЗамера.Модуль, СтрокаЗамера.НомерСтроки, СтрокаЗамера.Текст, ТекстыМодулей, СтароеИмяФайлаМодуляБезРасширения);
			Если ВстроитьИменаМетодовВФайл И ЗначениеЗаполнено(СтрокаЗамера.Метод) Тогда
				РегВыражение.Pattern = """" + СтрокаЗамера.Модуль + "(?:\:" + мПлатформа.шИмя + ")?""," + XMLСтрока(СтрокаЗамера.НомерСтроки) + ",";
				ТекстГдеИскать = РегВыражение.Заменить(ТекстГдеИскать, """" + СтрокаЗамера.Модуль + ":" + СтрокаЗамера.Метод + """," + XMLСтрока(СтрокаЗамера.НомерСтроки) + ",");
			КонецЕсли;
		КонецЦикла;
		ирОбщий.ОсвободитьИндикаторПроцессаЛкс(); 
		Если ВстроитьИменаМетодовВФайл Тогда
			ТекстовыйДокумент.УстановитьТекст(ТекстГдеИскать);
			ТекстовыйДокумент.Записать(ФайлЗамера);
			ЭтотОбъект.ВстроитьИменаМетодовВФайл = Ложь;
		КонецЕсли;
	КонецЕсли;
	
	НомерМетода = 0;
	ПредыдущаяСтрока = Неопределено;
	Для Каждого СтрокаЗамера Из Таблица Цикл
		ЭтоНовыйМетод = ПредыдущаяСтрока = Неопределено;
		Если Истина
			И ПредыдущаяСтрока <> Неопределено
			И (Ложь
				Или Найти(НРег(ПредыдущаяСтрока.Текст), Нрег("КонецПроцедуры")) > 0
				Или Найти(НРег(ПредыдущаяСтрока.Текст), Нрег("КонецФункции")) > 0
				Или ЗначениеЗаполнено(СтрокаЗамера.Метод) И ПредыдущаяСтрока.Метод <> СтрокаЗамера.Метод)
		Тогда
			ПредыдущаяСтрока.КоличествоВыходов = ПредыдущаяСтрока.Количество;
			Если ПредыдущаяСтрока.НомерСтроки <> СтрокаЗамера.НомерСтроки Тогда
				ЭтоНовыйМетод = Истина;
			КонецЕсли; 
		КонецЕсли;
		Если Истина
			И ПредыдущаяСтрока <> Неопределено 
			И ПредыдущаяСтрока.ИДМодуля <> СтрокаЗамера.ИДМодуля 
		Тогда 
			ЭтоНовыйМетод = Истина;
		КонецЕсли; 
		Если Ложь
			Или ЭтоНовыйМетод 
			Или (Истина
				И ПредыдущаяСтрока <> Неопределено
				И ПредыдущаяСтрока.КоличествоВходов > 0
				И ПредыдущаяСтрока.ИДМодуля = СтрокаЗамера.ИДМодуля
				И ПредыдущаяСтрока.НомерСтроки = СтрокаЗамера.НомерСтроки)
		Тогда
			СтрокаЗамера.КоличествоВходов = СтрокаЗамера.Количество;
			СтрокаЗамера.НомерПервойСтрокиМетода = СтрокаЗамера.НомерСтроки;
		КонецЕсли; 
		Если ЭтоНовыйМетод Тогда
			НомерМетода = НомерМетода + 1;
		КонецЕсли; 
		Если Не ЗначениеЗаполнено(СтрокаЗамера.Метод) Тогда
			СтрокаЗамера.Метод = "Метод" + XMLСтрока(НомерМетода);
		КонецЕсли;
		ПредыдущаяСтрока = СтрокаЗамера;
	КонецЦикла;
	СтрокаЗамера.КоличествоВыходов = СтрокаЗамера.Количество;
	
	мВнешниеНаборыДанных = Новый Структура("Таблица", Таблица);
	Возврат мВнешниеНаборыДанных;
КонецФункции

//ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла);
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf";
//ирПортативный #Если Клиент Тогда
//ирПортативный 	Контейнер = Новый Структура();
//ирПортативный 	Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный 	Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный 		ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный 		ирПортативный.Открыть();
//ирПортативный 	КонецЕсли; 
//ирПортативный #Иначе
//ирПортативный 	ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
//ирПортативный #КонецЕсли
//ирПортативный ирОбщий = ирПортативный.ОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ОбщийМодульЛкс("ирСервер");
//ирПортативный ирКлиент = ирПортативный.ОбщийМодульЛкс("ирКлиент");

РежимОтладки = 0;