Перем ТекстФайла;
Перем МетодыМодуля;

Функция СохраняемаяНастройкаФормы(выхНаименование, выхИменаСвойств) Экспорт 
	выхИменаСвойств = "Форма.ИмяФайлаМодуля";
	Возврат Неопределено;
КонецФункции

Процедура ЗагрузитьНастройкуВФорме(НастройкаФормы, ДопПараметры) Экспорт 
	
	ирКлиент.ЗагрузитьНастройкуФормыЛкс(ЭтаФорма, НастройкаФормы); 
	
КонецПроцедуры

Процедура ПриОткрытии()
	
	ирКлиент.Форма_ПриОткрытииЛкс(ЭтаФорма);
	ирКлиент.СоздатьМенеджерСохраненияНастроекФормыЛкс(ЭтаФорма);
	ДеревоВызовов.Строки.Очистить();
	Если ЗначениеЗаполнено(КлючУникальности) И Найти(КлючУникальности, "-") = 0 Тогда
		ЭтаФорма.ИмяФайлаМодуля = КлючУникальности;
	КонецЕсли;

КонецПроцедуры

Процедура ПриЗакрытии()
	
	ирКлиент.Форма_ПриЗакрытииЛкс(ЭтаФорма);
	
КонецПроцедуры

Процедура ВызовыВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
	
	ТекущаяСтрока = ЭлементыФормы.ДеревоВызовов.ТекущаяСтрока;
	Если ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Если ирОбщий.СтруктураСсылкиСтрокиМодуляЛкс(ВыбраннаяСтрока.Ссылка) <> Неопределено Тогда
		Если Колонка = ЭлементыФормы.ДеревоВызовов.Колонки.Ссылка Тогда
			ДействияФормыПерейтиКОпределению();
		Иначе
			Если Не ирКлиент.ОткрытьСсылкуСтрокиМодуляЛкс(ВыбраннаяСтрока.Ссылка) Тогда 
				//Если ИмяМодуляФормы = мПлатформа.ИмяДинамическогоМодуля() Тогда 
				//	ФормаВладелец.Активизировать();
				//	ПолеТекстаЛ = ПолеТекста;
				//Иначе
					ПолеТекстаЛ = ирКлиент.ОткрытьПолеТекстаМодуляКонфигурацииЛкс(ИмяМодуляФормы).ПолеТекста;
				//КонецЕсли;
				ПолеТекстаЛ.УстановитьГраницыВыделения(ВыбраннаяСтрока.Позиция, ВыбраннаяСтрока.Позиция + СтрДлина(ВыбраннаяСтрока.Текст),,, Истина);
			КонецЕсли;
		КонецЕсли;
	Иначе
		ФормаТекста = ирКлиент.ОткрытьТекстЛкс(ТекстФайла, ИмяФайлаМодуля, "ВстроенныйЯзык", Истина, ВыбраннаяСтрока.Позиция, ЭтаФорма);
		ФормаТекста.ПолеТекста().УстановитьГраницыВыделения(ВыбраннаяСтрока.Позиция, ВыбраннаяСтрока.Позиция + СтрДлина(ВыбраннаяСтрока.Текст),,, Истина, ФормаТекста);
	КонецЕсли;
	
КонецПроцедуры

Процедура ВнешнееСобытие(Источник, Событие, Данные) Экспорт
	
	ирКлиент.Форма_ВнешнееСобытиеЛкс(ЭтаФорма, Источник, Событие, Данные);

КонецПроцедуры

Процедура ТабличноеПолеПриПолученииДанных(Элемент, ОформленияСтрок) Экспорт 
	
	ирКлиент.ТабличноеПолеПриПолученииДанныхЛкс(ЭтаФорма, Элемент, ОформленияСтрок);

КонецПроцедуры

Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Экспорт
	
	ирКлиент.Форма_ОбработкаОповещенияЛкс(ЭтаФорма, ИмяСобытия, Параметр, Источник); 

КонецПроцедуры

Процедура КлсКомандаНажатие(Кнопка) Экспорт 
	
	ирКлиент.УниверсальнаяКомандаФормыЛкс(ЭтаФорма, Кнопка);
	
КонецПроцедуры

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
	Если ирОбщий.ПроверитьПлатформаНеWindowsЛкс(Отказ,, Истина) Тогда
		Возврат;
	КонецЕсли; 
	ПроверитьИнициировать();
КонецПроцедуры

Процедура ДействияФормыАнализ(Кнопка = Неопределено) 

	ОбновитьДанные();
	
КонецПроцедуры

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

КонецПроцедуры

Функция ДобавитьВызовыВМетоде(СтрокаВызывающегоМетода, ТаблицаМетодов, ТаблицаВызовов, Родители = Неопределено)
	Если Родители = Неопределено Тогда
		Родители = Новый Массив;
	КонецЕсли;
	ЧислоЛистов = 0;
	Родители.Добавить(СтрокаВызывающегоМетода.Метод);
	Для Каждого СтрокаВызова Из ТаблицаВызовов.НайтиСтроки(Новый Структура("ВызывающийМетод", СтрокаВызывающегоМетода.Метод)) Цикл
		МетодМодуля = ТаблицаМетодов.Найти(СтрокаВызова.Метод, "Имя");
		Если Родители.Найти(МетодМодуля.Имя) <> Неопределено Тогда
			Продолжить;
		КонецЕсли;
		СтрокаМетода = СтрокаВызывающегоМетода.Строки.Добавить();
		ЗаполнитьЗначенияСвойств(СтрокаМетода, МетодМодуля);
		ЗаполнитьЗначенияСвойств(СтрокаМетода, СтрокаВызова);
		Если ирОбщий.СтрокиРавныЛкс(МетодМодуля.Аннотация, "&НаКлиенте") Тогда
			ЧислоЛистов = ЧислоЛистов + ДобавитьВызовыВМетоде(СтрокаМетода, ТаблицаМетодов, ТаблицаВызовов);
		Иначе
			ЧислоЛистов = ЧислоЛистов + 1;
		КонецЕсли;
	КонецЦикла;
	Если ЧислоЛистов = 0 Тогда
		ирОбщий.РодительСтрокиДереваЛкс(СтрокаВызывающегоМетода, ДеревоВызовов).Строки.Удалить(СтрокаВызывающегоМетода);
	Иначе
		СтрокаВызывающегоМетода.ЧислоКонтекстных = ЧислоЛистов;
	КонецЕсли;
	Родители.Удалить(Родители.ВГраница());
	Возврат ЧислоЛистов;
	
КонецФункции

Процедура ВызовыПриАктивизацииСтроки(Элемент)
	
	ТекущаяСтрока = ЭлементыФормы.ДеревоВызовов.ТекущаяСтрока;
	ЭлементыФормы.ПолеТекстаВызова.УстановитьТекст("");
	Если ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);
	ирКлиент.РазобратьПозициюМодуляВСтрокеТаблицыЛкс(ТекущаяСтрока, ИмяФайлаМодуля, ЭлементыФормы.ПолеТекстаВызова,, ТекстФайла,, ТекущаяСтрока.Метод);
	
КонецПроцедуры

Процедура ВызовыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Экспорт
	ирКлиент.ТабличноеПолеПриВыводеСтрокиЛкс(ЭтаФорма, Элемент, ОформлениеСтроки, ДанныеСтроки);
КонецПроцедуры

Процедура ДействияФормыПерейтиКОпределению(Кнопка = Неопределено)
	
	ТекущаяСтрока = ЭлементыФормы.ДеревоВызовов.ТекущаяСтрока;
	Если ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ирКлиент.ПоказатьСсылкуНаСтрокуМодуляЛкс(ТекущаяСтрока.Ссылка);
	
КонецПроцедуры

Процедура ДействияФормыНастройка(Кнопка)
	
	ПолучитьФорму("ФормаНастройки", ФормаВладелец).Открыть();

КонецПроцедуры

Процедура ИмяФайлаМодуляПриИзменении(Элемент)
	ирКлиент.ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(Элемент, ЭтаФорма);
	ЭтаФорма.ИмяМодуляФормы = "";
КонецПроцедуры

Процедура ИмяФайлаМодуляНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
	ирОбщий.ПолеВводаСИсториейВыбора_ОбновитьСписокЛкс(Элемент, ЭтаФорма);
КонецПроцедуры

Процедура ИмяФайлаМодуляНачалоВыбора(Элемент, СтандартнаяОбработка)
	
	РезультатВыбора = ирКлиент.ВыбратьФайлЛкс(, "txt", "Модуль формы", ИмяФайлаМодуля, мПлатформа.ПапкаКэшаМодулей.ПолноеИмя);
	Если РезультатВыбора <> Неопределено Тогда
		ирКлиент.ИнтерактивноЗаписатьВПолеВводаЛкс(Элемент, РезультатВыбора);
	КонецЕсли; 
	
КонецПроцедуры

Процедура ИмяФайлаМодуляОткрытие(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ЗапуститьПриложение(Элемент.Значение);
КонецПроцедуры

ирКлиент.ИнициироватьФормуЛкс(ЭтаФорма, "Обработка.ирКлсПолеТекстаПрограммы.Форма.КонтекстныеВызовы");
 