Перем ПолеТела Экспорт;
Перем мРежимРедактора;

// @@@.КЛАСС.ПолеТекстаПрограммы
Функция КлсПолеТекстаПрограммыОбновитьКонтекст(Знач Компонента = Неопределено, Знач Кнопка = Неопределено) Экспорт 
КонецФункции

// @@@.КЛАСС.ПолеТекстаПрограммы
// Транслятор обработки событий нажатия на кнопки командной панели в компоненту.
// Является обязательным.
//
// Параметры:
//  Кнопка       - КнопкаКоманднойПанели.
//
Процедура КлсПолеТекстаПрограммыНажатие(Кнопка)
	
	#Если Сервер И Не Сервер Тогда
	    ПолеТела = Обработки.ирКлсПолеТекстаПрограммы.Создать();
	#КонецЕсли
	РезультатНажатия = ПолеТела.Нажатие(Кнопка);
	
КонецПроцедуры

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

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

Функция ИмяПараметраРезультата() Экспорт
	Возврат "<Результат>";
КонецФункции

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

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

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

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

Процедура ТаблицаПараметровПриИзмененииФлажка(Элемент, Колонка)
	
	ирКлиент.ТабличноеПолеПриИзмененииФлажкаЛкс(ЭтаФорма, Элемент, Колонка);
	
КонецПроцедуры

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

Функция ОбновитьПолноеОпределение() Экспорт
	ЭтаФорма.ПолноеОпределение = НачалоОпределения + "	" + СокрЛП(ЭлементыФормы.ПолеТела.ПолучитьТекст()) + Символы.ПС + КонецОпределения;
	Возврат ПолноеОпределение;
КонецФункции

Процедура ОбновлениеОтображения()

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

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

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

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

Процедура ПриЗакрытии()
	
	ирКлиент.Форма_ПриЗакрытииЛкс(ЭтаФорма);
	
	// +++.КЛАСС.ПолеТекстаПрограммы
	// Уничтожение всех экземпляров компоненты. Обязательный блок.
	ПолеТела.Уничтожить();
	// ---.КЛАСС.ПолеТекстаПрограммы
	
КонецПроцедуры

Процедура ТаблицаПараметровОписаниеНачалоВыбора(Элемент, СтандартнаяОбработка)
	
	ирКлиент.ПолеВводаРасширенногоЗначения_НачалоВыбораЛкс(Элемент, СтандартнаяОбработка);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

Процедура ТаблицаПараметровПередУдалением(Элемент, Отказ)
	
	Отказ = Истина;
	
КонецПроцедуры

Процедура ТаблицаПараметровПередНачаломДобавления(Элемент, Отказ, Копирование)
	
	Отказ = Истина;
	
КонецПроцедуры

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

Процедура ТаблицаПараметровПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Колонка)
	
	Если ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Копирование Тогда
		ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Перемещение;
	КонецЕсли; 
	
КонецПроцедуры

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

Процедура ШиринаГенерируемогоТекстаПриИзменении(Элемент)
	ирКлиент.ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(Элемент, ЭтаФорма, 5);
КонецПроцедуры

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

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

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

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

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

Процедура КППараметрыСравнитьТекст(Кнопка)
	
	Если Не мРежимРедактора Тогда
		Возврат;
	КонецЕсли;
	ирКлиент.Сравнить2ЗначенияВФормеЛкс(ТекстМетодаСОписанием(мМетодМодуля), ОбновитьПолноеОпределение(),, "Старый", "Новый",,,,, "ВстроенныйЯзык");
	
КонецПроцедуры

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

Процедура ТаблицаПараметровЗначениеНачалоВыбора(Элемент, СтандартнаяОбработка)
	ирКлиент.ПолеВводаКолонкиРасширенногоЗначения_НачалоВыбораЛкс(ЭтаФорма, ЭлементыФормы.ТаблицаПараметров, СтандартнаяОбработка,, Истина);
КонецПроцедуры

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