Перем Пер1;
Перем Пер2 Экспорт;

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

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

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

Процедура ПеренестиВКорень(Знач ИмяТаблицы, Знач ИмяПоля) Экспорт 
	Если Не ЗначениеЗаполнено(ИмяПоля) Тогда
		Возврат;
	КонецЕсли;
	ИндексЗапроса = Неопределено;
	НайтиЗапросВременнойТаблицы(ИмяТаблицы,,, ИндексЗапроса);
	Если ИндексЗапроса = Неопределено Тогда
		ИндексЗапроса = -1;
	КонецЕсли;
	ирОбщий.ОбновитьТекстПослеМаркераЛкс(ЭтаФорма.Заголовок,, "" + ИмяТаблицы + "." + ИмяПоля, ": "); 
	ДеревоВызовов.Строки.Очистить();
	СтрокаКорня = ДеревоВызовов.Строки.Добавить();
	СтрокаКорня.ИндексЗапроса = ИндексЗапроса;
	СтрокаКорня.ИмяТаблицы = ИмяТаблицы;
	СтрокаКорня.ИмяПоля = ИмяПоля;
	ЗаполнитьПредставлениеЗапроса(СтрокаКорня);
	СтрокаКорня.Места = ВызовыТекущегоПоля.СкопироватьКолонки();
	//СтрокаКорня.Позиция = СтрокаМетода.ПозицияОпределения;
	СтрокаКорня.Строки.Добавить();
	ЭлементыФормы.ДеревоВызовов.ТекущаяСтрока = ДеревоВызовов.Строки[0];  
	ОбновитьДанные();
КонецПроцедуры

Процедура ОбновитьДанные() Экспорт
	ЭлементыФормы.ДеревоВызовов.Развернуть(ДеревоВызовов.Строки[0]); 
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

Процедура ЗаполнитьПредставлениеЗапроса(Знач СтрокаВызова) Экспорт
	СтрокаВызова.Запрос = ?(ПустаяСтрока(СтрокаВызова.ИмяТаблицы), "" + СтрокаВызова.ИндексЗапроса + ".Запрос", "" + СтрокаВызова.ИндексЗапроса + ".Создать_" + СтрокаВызова.ИмяТаблицы);
КонецПроцедуры

Процедура ВызовыПриАктивизацииСтроки(Элемент)
	ЭтаФорма.ВызовыТекущегоПоля = Элемент.ТекущаяСтрока.Места;
КонецПроцедуры

Процедура УточнитьСтрокуРезультата(Знач СтрокаМеста, Знач СтрокаДерева) Экспорт
	ЗагрузитьЗапросПакетаПоИндексу(ПакетЗапросов, СтрокаДерева.ИндексЗапроса);
	СтрокаМеста.НомерСтроки = НомерСтрокиИзПозиции(СтрокаМеста.Позиция + мПозицияТекстаДляПоискаОпределения);
	//СтрокаМеста.Текст = ПолеТекста.ПолучитьСтроку(СтрокаМеста.НомерСтрокиМодуля);
КонецПроцедуры

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

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

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

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

Процедура ВызовыВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ВызовыТекущегоПоляВыбор();
	
КонецПроцедуры

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

Процедура ДействияФормыПеренестиВКорень(Кнопка)
	ТекущаяСтрока = ИндексЗапросаИзСтрокиДерева();
	ПеренестиВКорень(ТекущаяСтрока.ИндексЗапроса, ТекущаяСтрока.ИмяПоля);
КонецПроцедуры

Функция ИндексЗапросаИзСтрокиДерева(СтрокаДерева = Неопределено) Экспорт
	Если СтрокаДерева = Неопределено Тогда
		СтрокаДерева = ЭлементыФормы.ДеревоВызовов.ТекущаяСтрока;
	КонецЕсли;
	Возврат СтрокаДерева;
КонецФункции

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