Перем мСписокВнешнихПараметров Экспорт;
Перем мМетоды Экспорт;
Перем КоличествоВнешнихПараметров;
Перем ТекстМодуляТекущейВнешнейОбработки;
Перем ИмяФайлаВнешнейОбработки;
Перем ИмяВнешнейОбработки;
Перем ВнешняяОбработка;
Перем СтартоваяСтрока;
Перем ДатаИзмененияВнешнейОбработки;
Перем РежимВнешнейОбработки Экспорт;
Перем АвтоПараметрыВыхода Экспорт;
Перем мСтруктураВосстановления;
Перем мИсторияФайлов;
Перем мАнализТехножурнала;
Перем ПолеВстроенногоЯзыка Экспорт;
Перем мРежимРедактора Экспорт;
Перем мТекущаяСтрокаДереваАлгоритмов;
Перем мАлгоритмЗагруженВКонсоль;
Перем мИмяОткрытогоФайла;
Перем мПлатформа;
Перем мСтруктураПоискаВДереве;
Перем ПеременнаяСтрока;

// @@@.КЛАСС.ПолеТекстовогоДокументаСКонтекстнойПодсказкой

// Транслятор обработки событий нажатия на кнопки командной панели в компоненту.

// Является обязательным.

//

// Параметры:

//  Кнопка       – КнопкаКоманднойПанели.

//

Процедура КлсПолеТекстовогоДокументаСКонтекстнойПодсказкойНажатие(Кнопка)

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

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

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


// @@@.КЛАСС.ПолеТекстовогоДокументаСКонтекстнойПодсказкой
Процедура КлсПолеТекстовогоДокументаСКонтекстнойПодсказкойАвтоОбновитьСправку()
	
	ПолеВстроенногоЯзыка.АвтоОбновитьСправку();
	
КонецПроцедуры


Процедура ПриОткрытии()

	
	ПолеВстроенногоЯзыка = ирОбщий.ПолучитьОбъектПоПолномуИмениМетаданныхЛкс("Обработка.ирКлсПолеТекстовогоДокументаСКонтекстнойПодсказкой");
	#Если Сервер И Не Сервер Тогда
	    ПолеВстроенногоЯзыка = Обработки.ирКлсПолеТекстовогоДокументаСКонтекстнойПодсказкой.Создать();
		мПлатформа = Обработки.ирПлатформа.Создать();
	#КонецЕсли
	ПолеВстроенногоЯзыка.Инициализировать(,

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


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


// <Описание процедуры>
//
// Параметры:
//  <Параметр1>  – <Тип.Вид> – <описание параметра>
//                 <продолжение описания параметра>;
//  <Параметр2>  – <Тип.Вид> – <описание параметра>
//                 <продолжение описания параметра>.
//
Процедура ОбновитьЗначенияПараметровВыхода(СтруктураПараметров)

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

КонецПроцедуры // ОбновитьЗначенияПараметровВыхода()

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

// @@@.КЛАСС.ПолеТекстовогоДокументаСКонтекстнойПодсказкой

// Процедура служит для выполнения программы поля текстового документа в локальном контексте.

// Вызывается из компоненты ирКлсПолеТекстовогоДокументаСКонтекстнойПодсказкой в режиме внутреннего языка.

// Не является обязательной.

//

// Параметры:

//  ТекстДляВыполнения – Строка;

//  *ЛиСинтаксическийКонтроль - Булево, *Ложь - признак вызова только для синтаксического контроля.

//

Функция ВыполнитьЛокально(ТекстДляВыполнения, ЛиСинтаксическийКонтроль = Ложь) Экспорт

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

	
КонецФункции

Функция ПолучитьИмяМодуляВнешнейОбработки()

	ИмяМодуля = "ВнешняяОбработка." + ИмяВнешнейОбработки + ".МодульОбъекта";
	Возврат ИмяМодуля;

КонецФункции



Процедура ПриЗакрытии()

	

	ирОбщий.УдалитьФайлВосстановленияКонсолиСБлокировкойЛкс(мСтруктураВосстановления);
	
	// +++.КЛАСС.ПолеТекстовогоДокументаСКонтекстнойПодсказкой

	// Уничтожение всех экземпляров компоненты. Обязательный блок.

	ПолеВстроенногоЯзыка.Уничтожить();

	// ---.КЛАСС.ПолеТекстовогоДокументаСКонтекстнойПодсказкой

	

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


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

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

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

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

Процедура ПараметрыПередУдалением(Элемент, Отказ)
	
	Отказ = (Элемент.ТекущиеДанные.Позиция > 0 Или Элемент.ТекущиеДанные.Фиксированный);
	
КонецПроцедуры

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

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

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

Процедура ПараметрыНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, Выполнение)
	
	// Пришлось пожертвовать этой возможностью ради перетаскивания параметров между алгоритмами
	//ПараметрыПеретаскивания.Значение = Элемент.ТекущаяСтрока.Имя;
	
КонецПроцедуры

Процедура КоманднаяПанельВстроенныйЯзыкСсылкаНаОбъектБД(Кнопка)

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

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

Процедура КоманднаяПанельВстроенныйЯзыкВыполнятьНаСервере(Кнопка)
	
	НаСервере = Не Кнопка.Пометка;
	Кнопка.Пометка = НаСервере;
	ДоступностьВнешнейОбработкиНаСервре = Не НаСервере Или Не ирКэш.ЛиПортативныйРежимЛкс();
	ЭлементыФормы.КоманднаяПанельВстроенныйЯзык.Кнопки.ОткрытьВОтладчике.Доступность = ДоступностьВнешнейОбработкиНаСервре;
	ЭлементыФормы.КоманднаяПанельВстроенныйЯзык.Кнопки.РежимВнешнейОбработки.Доступность = ДоступностьВнешнейОбработкиНаСервре;
	
КонецПроцедуры

Процедура КоманднаяПанельПараметрыИсследоватьТаблицуПараметров(Кнопка)
	
	Если ЭлементыФормы.Параметры.ТекущаяСтрока <> Неопределено Тогда
		ирОбщий.ИсследоватьЛкс(ЭлементыФормы.Параметры.ТекущаяСтрока.Значение);
	КонецЕсли;
	
КонецПроцедуры

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

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

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

Процедура ЗаполнитьПараметры(ПараметрыВхода = Истина, ПараметрыВыхода = Истина)

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

КонецПроцедуры // ЗаполнитьПараметры()

Процедура КоманднаяПанельПараметрыЗаполнить(Кнопка)
	
	ЗаполнитьПараметры();
			
КонецПроцедуры

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

Процедура КоманднаяПанельПараметрыАвтоПараметрыВыхода(Кнопка)
	
	АвтоПараметрыВыхода = Не Кнопка.Пометка;
	Кнопка.Пометка = АвтоПараметрыВыхода;
	
КонецПроцедуры

Процедура КоманднаяПанельПараметрыОчистить(Кнопка)
	
	ТолькоВыход = Ложь;
	Если Параметры.Найти(Истина, "Вход") <> Неопределено Тогда
		Ответ = Вопрос("Хотите удалить только параметры только выхода? Иначе будут удалены все.", РежимДиалогаВопрос.ДаНет);
		ТолькоВыход = Ответ = КодВозвратаДиалога.Да;
	КонецЕсли; 
	НачальноеКоличество = Параметры.Количество(); 
	Для СчетчикПараметры = 1 По НачальноеКоличество Цикл
		СтрокаПараметра = Параметры[НачальноеКоличество - СчетчикПараметры];
		Если Истина
			И СтрокаПараметра.Позиция = 0 
			И Не СтрокаПараметра.Фиксированный 
			И (Ложь
				Или Не ТолькоВыход
				Или СтрокаПараметра.Выход И Не СтрокаПараметра.Вход)
		Тогда
			Параметры.Удалить(СтрокаПараметра);
			ЭтаФорма.Модифицированность = Истина;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

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

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

Функция ПолучитьОбновитьФайлВнешнейОбработки(СтруктураПараметров = Неопределено) Экспорт

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

КонецФункции // ПолучитьОбновитьФайлВнешнейОбработки()

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

Процедура КоманднаяПанельВстроенныйЯзыкРежимВнешнейОбработки(Кнопка = Неопределено)
	
	Кнопка = ЭлементыФормы.КоманднаяПанельВстроенныйЯзык.Кнопки.РежимВнешнейОбработки;
	ЭтаФорма.РежимВнешнейОбработки = Не Кнопка.Пометка;
	Кнопка.Пометка = РежимВнешнейОбработки;
	ОбновитьДоступностьКнопкиВыполнятьНаСервере();
	//ЭлементыФормы.КоманднаяПанельВстроенныйЯзык.Кнопки.ОткрытьВОтладчике.Доступность = РежимВнешнейОбработки;

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

Процедура ОбновитьДоступностьКнопкиВыполнятьНаСервере()
	ЭлементыФормы.КоманднаяПанельВстроенныйЯзык.Кнопки.ВыполнятьНаСервере.Доступность = Истина
		//И Не ирКэш.ЭтоФайловаяБазаЛкс()
		//И Не РежимВнешнейОбработки
		И (Ложь
			Или Не ирКэш.ЛиПортативныйРежимЛкс()
			Или ирПортативный.ЛиСерверныйМодульДоступенЛкс()
			);
КонецПроцедуры

Процедура КоманднаяПанельПараметрыНовоеОкно(Кнопка)
	
	ирОбщий.ОткрытьНовоеОкноОбработкиЛкс(ЭтотОбъект);
	
КонецПроцедуры

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

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

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

Процедура КоманднаяПанельВстроенныйЯзыкЗамерВремени(Кнопка)
	
	Кнопка.Пометка = Не Кнопка.Пометка;
	ЛиЗамерВремени = Кнопка.Пометка;
	
КонецПроцедуры

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

Процедура КоманднаяПанельВстроенныйЯзыкВозврат(Кнопка)
	
	ЭлементыФормы.ВстроенныйЯзык.ВыделенныйТекст = "Перейти ~Конец;";
	// Антибаг 8.3.12 https://partners.v8.1c.ru/forum/t/1719342/m/1719342
	ЭлементыФормы.ВстроенныйЯзык.ВыделенныйТекст = Символы.ПС;
	
КонецПроцедуры

Процедура КоманднаяПанельПараметрыОткрытьФайл(Кнопка)
	
	ОткрытьФайл();

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

Процедура ОткрытьФайл(ОчиститьПередЗагрузкой = Истина)
	
	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	ДиалогВыбораФайла.Заголовок = "Выберите файл для загрузки";
	ДиалогВыбораФайла.Фильтр = ирОбщий.ПолучитьСтрокуФильтраДляВыбораФайлаЛкс("f1c,t1c", "Файлы консоли кода");
	Файл = Новый Файл(мИмяОткрытогоФайла);
	ДиалогВыбораФайла.Каталог = Файл.Путь;
	ДиалогВыбораФайла.ИндексФильтра = 1;
	Если ДиалогВыбораФайла.Выбрать() Тогда
		ОткрытьФайлПоПолномуИмени(ДиалогВыбораФайла.ПолноеИмяФайла, ОчиститьПередЗагрузкой);
	КонецЕсли;

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

Процедура ОткрытьФайлПоПолномуИмени(ПолноеИмяФайла, ОчиститьПередЗагрузкой = Истина)
	
	мИмяОткрытогоФайла = ПолноеИмяФайла;
	Файл = Новый Файл(мИмяОткрытогоФайла);
	ЗагрузитьИзФайла(ОчиститьПередЗагрузкой, ирОбщий.СтрокиРавныЛкс(Файл.Расширение, ".t1c"));
	СохранитьИмяФайла();
	
КонецПроцедуры

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

Процедура КоманднаяПанельПараметрыСохранитьФайл(Кнопка)
	
	СохранитьВФайл();
	
КонецПроцедуры

Функция СохранитьВФайл(ЗапрашиватьСохранение = Ложь, ЗапрашиватьИмяФайла = Ложь, ИмяФайла = Неопределено, СброситьМодифицированность = Неопределено)
	
	Если СброситьМодифицированность = Неопределено Тогда
		//СброситьМодифицированность = Не мРежимРедактора;
		СброситьМодифицированность = Истина;
	КонецЕсли; 
	Если ИмяФайла = Неопределено Тогда
		Если ЗначениеЗаполнено(мИмяОткрытогоФайла) Тогда
			Файл = Новый Файл(мИмяОткрытогоФайла);
			ИмяФайла = Файл.Путь + Файл.ИмяБезРасширения + ".t1c";
		КонецЕсли; 
	КонецЕсли; 
	СохранитьДанныеТекущейСтроки();
	Если Не ЗапрашиватьИмяФайла Тогда
		Если ЗапрашиватьСохранение Тогда
			Если Не Модифицированность Тогда
				Возврат Истина;
			Иначе
				Ответ = Вопрос("Сохранить текущий файл?", РежимДиалогаВопрос.ДаНетОтмена);
				Если Ответ = КодВозвратаДиалога.Отмена Тогда
					Возврат Ложь;
				ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда
					Возврат Истина;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Если Истина
		И Ложь
		//И (Ложь
		//	Или мРежимРедактора 
		//	Или ОповеститьВладельца)
		////И ВладелецФормы <> Неопределено //Закомментировано 09.04.2014
		//И Не ЗапрашиватьИмяФайла
		//И Не ЗначениеЗаполнено(ИмяФайла)
	Тогда
		//мОбъектЗапроса.Текст = мТекущаяСтрокаДереваЗапросов.ТекстЗапроса;
		//ТекстЗапросаКорректен = Ложь;
		//Если ПроверитьКорректностьТекстаЗапроса(, Ложь) Тогда
		//	Если УстановитьТипЗапроса(, Истина) Тогда 
		//		ТекстЗапросаКорректен = Истина;
		//	КонецЕсли;
		//КонецЕсли;
		//Если Не ТекстЗапросаКорректен Тогда 
		//	Ответ = Вопрос("Текст запроса содержит ошибки. Продолжить сохранение запроса?", РежимДиалогаВопрос.ОКОтмена);
		//	Если Ответ = КодВозвратаДиалога.Отмена Тогда
		//		Возврат Ложь;
		//	КонецЕсли;
		//КонецЕсли;
		////КонструкторЗапроса = Новый КонструкторЗапроса;
		////КонструкторЗапроса.РежимКомпоновкиДанных = Истина;
		////ТекстЗапроса = ЭлементыФормы.ТекстЗапроса.ПолучитьТекст();
		////Попытка
		////	КонструкторЗапроса.Текст = ТекстЗапроса;
		////Исключение
		////	ирОбщий.ПоказатьОшибкуВЗапросеИлиПрограммномКодеЛкс(ЭлементыФормы.ТекстЗапроса,,,, МодальныйРежим, ИнформацияОбОшибке());
		////	Возврат;
		////КонецПопытки;
		//лПараметры = Параметры.Скопировать();
		////Если ирОбщий.СтрокиРавныЛкс(мТекущаяСтрокаДереваЗапросов.ТипЗапроса, "Компоновка") Тогда
		////	Для Каждого СтрокаПараметра Из лПараметры Цикл
		////		СтрокаПараметра.Выражение = СтрЗаменить(СтрокаПараметра.Выражение, "Параметры.", "&"); // Опасно. Лучше сделать через RegExp
		////	КонецЦикла;
		////КонецЕсли; 
		//СтруктураПараметров = Новый Структура;
		//СтруктураПараметров.Вставить("НаборДанных", мРедактируемыйНаборДанных);
		//СтруктураПараметров.Вставить("Параметры", лПараметры);
		//СтруктураПараметров.Вставить("ПараметрыADO", мТекущаяСтрокаДереваЗапросов.ПараметрыADO);
		//СтруктураПараметров.Вставить("ПараметрыWMI", мТекущаяСтрокаДереваЗапросов.ПараметрыWMI);
		//СтруктураПараметров.Вставить("Запрос", мТекущаяСтрокаДереваЗапросов.ТекстЗапроса);
		//
		//СтруктураПараметров.Вставить("ТекстЗапроса", мТекущаяСтрокаДереваЗапросов.ТекстЗапроса);
		//ЗакрыватьПриВыборе = Ложь;
		//ОповеститьОВыборе(СтруктураПараметров);
		//ЭтаФорма.РезультатФормы = СтруктураПараметров;
	Иначе
		ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
		ДиалогВыбораФайла.Заголовок = "Выберите файл для сохранения";
		ДиалогВыбораФайла.Фильтр = ирОбщий.ПолучитьСтрокуФильтраДляВыбораФайлаЛкс("t1c", "Файлы списка алгоритмов");
		ДиалогВыбораФайла.Расширение = "t1c";
		Файл = Новый Файл(мИмяОткрытогоФайла);
		ДиалогВыбораФайла.Каталог = Файл.Путь;
		КопияДерева = ДеревоАлгоритмов.Скопировать();
		КопияДерева.Колонки.Добавить("КоординатыТекущейСтроки"); // Такой несистемный прием нужен для совместимости по формату со старыми консолями
		Если КопияДерева.Строки.Количество() > 0 Тогда
			КопияДерева.Строки[0].КоординатыТекущейСтроки = ирОбщий.ПолучитьКоординатыСтрокиДереваЛкс(мТекущаяСтрокаДереваАлгоритмов);
		КонецЕсли; 
		Если НеCохранятьПараметрыВыхода Тогда
			ВсеСтрокиКопииДерева = ирОбщий.ПолучитьВсеСтрокиДереваЗначенийЛкс(КопияДерева);
			Для Каждого СтрокаКопииДерева Из ВсеСтрокиКопииДерева Цикл
				ОчиститьПараметрыВыхода(СтрокаКопииДерева.Параметры);
			КонецЦикла;
		КонецЕсли; 
		ДанныеДляФайла = Новый Структура();
		ДанныеДляФайла.Вставить("ДеревоАлгоритмов", КопияДерева);
		ДанныеДляФайла.Вставить("НеCохранятьПараметрыВыхода", НеCохранятьПараметрыВыхода);
		ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
		Если Не ЗначениеВФайл(ИмяВременногоФайла, ДанныеДляФайла) Тогда 
			Сообщить("Ошибка записи файла """ + ИмяВременногоФайла + """", СтатусСообщения.Внимание);
			Возврат Ложь;
		КонецЕсли; 
		Попытка
			ЗначениеИзФайла(ИмяВременногоФайла);
			//ВызватьИсключение 1; // Для отладки
		Исключение
			УдалитьФайлы(ИмяВременногоФайла);
			Если ЗапрашиватьСохранение Или ЗапрашиватьИмяФайла Или мИмяОткрытогоФайла = ИмяФайла Тогда
				Если Не НеCохранятьПараметрыВыхода Тогда
					Ответ = Вопрос("При сохранении в файл попадут недесериализуемые параметры. Хотите отключить сохранение параметров выхода (ОК) или вручную найти и удалить такие параметры (Отмена)?", РежимДиалогаВопрос.ОКОтмена);
				Иначе
					Ответ = КодВозвратаДиалога.Отмена;
					Сообщить("Сохранение файла не выполнено, т.к. его нельзя было бы прочитать из-за недесериализуемых параметров. Найдите и удалите такие параметры и повторите попытку.");
				КонецЕсли; 
			Иначе
				Ответ = КодВозвратаДиалога.Отмена;
				Сообщить("Сохранение файла восстановления не выполнено, т.к. его нельзя было бы прочитать из-за недесериализуемых параметров.");
			КонецЕсли; 
			Если Ответ = КодВозвратаДиалога.ОК Тогда
				ЭтаФорма.НеCохранятьПараметрыВыхода = Истина;
				Возврат СохранитьВФайл(ЗапрашиватьСохранение, ЗапрашиватьИмяФайла, ИмяФайла, СброситьМодифицированность);
			Иначе
				Возврат Ложь;
			КонецЕсли;
		КонецПопытки; 
		УдалитьФайлы(ИмяВременногоФайла);
		ФайлВыбран = ирОбщий.СохранитьФайлВКонсолиСВосстановлениемЛкс(ДиалогВыбораФайла, ИмяФайла, мИмяОткрытогоФайла, ДанныеДляФайла, мСтруктураВосстановления, 
			ЗапрашиватьИмяФайла);
		Если ФайлВыбран Тогда
			мИмяОткрытогоФайла = ДиалогВыбораФайла.ПолноеИмяФайла;
			СохранитьИмяФайла();
		Иначе
			Возврат Ложь;
		КонецЕсли;
		Если СброситьМодифицированность Тогда
			ЭтаФорма.Модифицированность = Ложь;
		КонецЕсли;
		//УстановитьЗаголовокФормы();
	КонецЕсли;
	Обновить();
	Возврат Истина;

КонецФункции

Процедура ОчиститьПараметрыВыхода(Знач ПараметрыСтроки = Неопределено)
	
	Если ПараметрыСтроки = Неопределено Тогда
		ПараметрыСтроки = Параметры;
	КонецЕсли; 
	НачальноеКоличество = ПараметрыСтроки.Количество(); 
	Для СчетчикПараметры = 1 По НачальноеКоличество Цикл
		СтрокаПараметра = ПараметрыСтроки[НачальноеКоличество - СчетчикПараметры];
		Если СтрокаПараметра.Выход И Не СтрокаПараметра.Вход Тогда
			ПараметрыСтроки.Удалить(СтрокаПараметра);
		КонецЕсли;
	КонецЦикла;

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

Процедура КоманднаяПанельВстроенныйЯзыкВыполнитьАнализТрассы(Кнопка)
	
	Если мАнализТехножурнала <> Неопределено Тогда
		#Если Сервер И Не Сервер Тогда
		    мАнализТехножурнала = Обработки.ирАнализТехножурнала.Создать();
		#КонецЕсли
		мАнализТехножурнала.ПоказатьТрассу(,,, 0);
	КонецЕсли; 
	
КонецПроцедуры

Процедура КоманднаяПанельВстроенныйЯзыкНачалоЗамера(Кнопка)
	
	ЭлементыФормы.ВстроенныйЯзык.ВыделенныйТекст = "ирОбщий.НачатьЗамерЛкс();";
	// Антибаг 8.3.12 https://partners.v8.1c.ru/forum/t/1719342/m/1719342
	ЭлементыФормы.ВстроенныйЯзык.ВыделенныйТекст = Символы.ПС;
	
КонецПроцедуры

Процедура КоманднаяПанельВстроенныйЯзыкКонецЗамера(Кнопка)
	
	ЭлементыФормы.ВстроенныйЯзык.ВыделенныйТекст = "ирОбщий.КончитьЗамерЛкс();";
	// Антибаг 8.3.12 https://partners.v8.1c.ru/forum/t/1719342/m/1719342
	ЭлементыФормы.ВстроенныйЯзык.ВыделенныйТекст = Символы.ПС;

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

Процедура КоманднаяПанельВстроенныйЯзыкАдаптироватьТекстИзМетода(Кнопка)
	
	ТекстАлгоритма = ЭлементыФормы.ВстроенныйЯзык.ПолучитьТекст();
	ТекстАлгоритма = ЗаменитьВозвратыНаПерейтиВТекстеМетода1С(ТекстАлгоритма);
	УстановитьТекстАлгоритмаСВозможностьюОтмены(ТекстАлгоритма);
	
КонецПроцедуры

Процедура УстановитьТекстАлгоритмаСВозможностьюОтмены(Знач ТекстАлгоритма)
	
	ЭлементыФормы.ВстроенныйЯзык.УстановитьГраницыВыделения(1, СтрДлина(ЭлементыФормы.ВстроенныйЯзык.ПолучитьТекст()));
	ЭлементыФормы.ВстроенныйЯзык.ВыделенныйТекст = ТекстАлгоритма;
	ЭлементыФормы.ВстроенныйЯзык.УстановитьГраницыВыделения(1, 1);
	ЭтаФорма.Модифицированность = Истина;

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

Функция ЗаменитьВозвратыНаПерейтиВТекстеМетода1С(Знач Текст) Экспорт
	
	ОбработкаРегулярныхВыражений = мПлатформа.RegExp;
	ОбработкаРегулярныхВыражений.Global = Истина;
	ОбработкаРегулярныхВыражений.MultiLine = Истина;
	
	// Шаблон тут можно улучшить конечно
	ОбработкаРегулярныхВыражений.Pattern = "((?:^|\n|\r)(?:\t| )*)Возврат(?:\t| )+(\s*[^\r;]+)(\r|;)";
	Текст = ОбработкаРегулярныхВыражений.Replace(Текст, "$1Результат = $2;" + Символы.ПС + "$1Перейти ~Конец$3");
	ОбработкаРегулярныхВыражений.Pattern = "((?:^|\n|\r)(?:\t| )*)Возврат(?:\t| )*(\n|\r|;)";
	Текст = ОбработкаРегулярныхВыражений.Replace(Текст, "$1Перейти ~Конец$2");
	//Вхождения = ОбработкаРегулярныхВыражений.Execute(Текст);
	//Для Каждого Вхождение Из Вхождения Цикл
	//	СтрокаЗамены = "";
	//	Если Вхождение.SubMatches(1) <> Неопределено Тогда
	//		СтрокаЗамены = СтрокаЗамены + Вхождение.SubMatches(0) + "Результат = " + Вхождение.SubMatches(1) + ";";
	//	КонецЕсли;
	//	//СтрокаЗамены = СтрокаЗамены + Вхождение.SubMatches(0) + "Перейти ~Конец";
	//	СтрокаЗамены = СтрокаЗамены + " Перейти ~Конец";
	//	Текст = СтрЗаменить(Текст, Вхождение.Value, СтрокаЗамены);
	//КонецЦикла;
	Результат = Текст;
	Возврат Результат;
	
КонецФункции

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

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

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

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

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

Процедура ОбработчикОжиданияСПараметрамиЛкс() Экспорт 
	
	ирОбщий.ОбработчикОжиданияСПараметрамиЛкс();

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

Процедура КоманднаяПанельВстроенныйЯзыкЗаписьНаСервере(Кнопка)
	
	ЭлементыФормы.ВстроенныйЯзык.ВыделенныйТекст = "ирОбщий.ЗаписатьОбъектЛкс(Объект, Истина);";
	// Антибаг 8.3.12 https://partners.v8.1c.ru/forum/t/1719342/m/1719342
	ЭлементыФормы.ВстроенныйЯзык.ВыделенныйТекст = Символы.ПС;

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

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

Процедура КоманднаяПанельПараметрыРедакторОбъектаБД(Кнопка)
	
	Если ЭлементыФормы.Параметры.ТекущаяСтрока <> Неопределено Тогда
		ЗначениеПараметра = ЭлементыФормы.Параметры.ТекущаяСтрока.Значение;
		Если ирОбщий.ЛиТипСсылкиБДЛкс(ТипЗнч(ЗначениеПараметра), Ложь) Тогда
			ирОбщий.ОткрытьСсылкуВРедактореОбъектаБДЛкс(ЗначениеПараметра);
		ИначеЕсли ирОбщий.ЛиТипОбъектаБДЛкс(ТипЗнч(ЗначениеПараметра)) Тогда
			ирОбщий.ОткрытьОбъектВРедактореОбъектаБДЛкс(ЗначениеПараметра);
		КонецЕсли; 
	КонецЕсли;
	
КонецПроцедуры

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

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

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

Процедура ДеревоАлгоритмовПриАктивизацииСтроки(Элемент)
	
	Если ПолеВстроенногоЯзыка = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	СохранитьДанныеТекущейСтроки();
	ЗагрузитьДанныеТекущейСтроки();
	
КонецПроцедуры

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

Процедура ЗагрузитьДанныеТекущейСтроки()

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

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

Процедура КП_ДеревоДобавитьГруппу(Кнопка)
	
	ЭлементыФормы.ДеревоАлгоритмов.ДобавитьСтроку();
	ЭлементыФормы.ДеревоАлгоритмов.ТекущаяСтрока.ЭтоГруппа = Истина;
	
КонецПроцедуры

Процедура ДействияФормыНовыйФайл(Кнопка)
	
	Если СохранитьВФайл(Истина) Тогда
		СоздатьФайл();
	КонецЕсли;
	
КонецПроцедуры

Процедура СоздатьФайл(Отладка = Ложь)

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

Процедура ПриИзмененииДереваАлгоритмов()

	ОбновитьДоступностьПанелиАлгоритма();
	Если Истина
		И ДеревоАлгоритмов.Строки.Количество() > 0
		И ЭлементыФормы.ДеревоАлгоритмов.ТекущаяСтрока = Неопределено
	Тогда 
	    ЭлементыФормы.ДеревоАлгоритмов.ТекущаяСтрока = ДеревоАлгоритмов.Строки[0];
	КонецЕсли;
	
КонецПроцедуры

Процедура ОбновитьДоступностьПанелиАлгоритма() Экспорт

	НоваяДоступность = Истина
		И мАлгоритмЗагруженВКонсоль
		И мТекущаяСтрокаДереваАлгоритмов <> Неопределено
		И Не мТекущаяСтрокаДереваАлгоритмов.ЭтоГруппа;
	ЭлементыФормы.КоманднаяПанельПараметры.Доступность = НоваяДоступность;
	ЭлементыФормы.Параметры.Доступность = НоваяДоступность;
	ЭлементыФормы.КоманднаяПанельВстроенныйЯзык.Доступность = НоваяДоступность;
	ЭлементыФормы.ВстроенныйЯзык.Доступность = НоваяДоступность;

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

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

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

Процедура ОткрытьФайлИзИстории(Кнопка) 
	
	Если СохранитьВФайл(Истина) Тогда
		СтрокаИстории = мИсторияФайлов[Число(Сред(Кнопка.Имя, 2))];
		ОткрытьФайлПоПолномуИмени(СтрокаИстории.Значение);
	КонецЕсли;
	ПриИзмененииДереваАлгоритмов();
	
КонецПроцедуры

Процедура ОчиститьДанные()
	
	ДеревоАлгоритмов.Строки.Очистить();
	мТекущаяСтрокаДереваАлгоритмов = Неопределено;
	ЭтаФорма.ЭлементыФормы.ВстроенныйЯзык.УстановитьТекст("");
	Параметры.Очистить();;
	
КонецПроцедуры // ОчиститьЗначения()

Процедура ДеревоАлгоритмовПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
	
	Если ДанныеСтроки.ЭтоГруппа Тогда
		ОформлениеСтроки.Ячейки.Наименование.УстановитьКартинку(ирКэш.КартинкаПоИмениЛкс("ирПапка"));
	Иначе 
		ОформлениеСтроки.Ячейки.Наименование.УстановитьКартинку(ирКэш.КартинкаПоИмениЛкс("ирАлгоритм"));
	КонецЕсли; 
	Если ЗначениеЗаполнено(ДанныеСтроки.ДатаВыполнения) Тогда
		ОформлениеСтроки.Ячейки.ДатаВыполнения.УстановитьТекст(Цел((ТекущаяДата() - ДанныеСтроки.ДатаВыполнения) / 60));
	Иначе
		ОформлениеСтроки.Ячейки.ДатаВыполнения.УстановитьТекст("");
	КонецЕсли; 
	ирОбщий.ОформитьСтрокуВТабличномПолеДереваСПоискомЛкс(Элемент, ОформлениеСтроки, ДанныеСтроки, мСтруктураПоискаВДереве);

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

Процедура ДействияФормыОбъединитьФайл(Кнопка)
	
	ОткрытьФайл(Ложь);
	
КонецПроцедуры

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

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

Процедура ДействияФормыСохранитьКак(Кнопка)
	
	СохранитьВФайл(Ложь, Истина);

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

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

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

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

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

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

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

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

Процедура ДеревоАлгоритмовПередУдалением(Элемент, Отказ)
	
	мТекущаяСтрокаДереваАлгоритмов = Неопределено;

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

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

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

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

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

Процедура ВпередНажатие(Элемент)
	
	ирОбщий.СледующееВхождениеСтрокиПоискаВТабличномПолеДереваЛкс(ЭлементыФормы.ДеревоАлгоритмов, мСтруктураПоискаВДереве);
	
КонецПроцедуры

Процедура НазадНажатие(Элемент)
	
	ирОбщий.ПредыдущееВхождениеСтрокиПоискаВТабличномПолеДереваЛкс(ЭлементыФормы.ДеревоАлгоритмов, мСтруктураПоискаВДереве);

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

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

Процедура КоманднаяПанельВстроенныйЯзыкВставитьУказаниеТипаПеременной(Кнопка)
	
	ЭлементыФормы.ВстроенныйЯзык.ВыделенныйТекст = "//: <ИмяПеременной> = Новый (""ТаблицаЗначений"");";
	// Антибаг 8.3.12 https://partners.v8.1c.ru/forum/t/1719342/m/1719342
	ЭлементыФормы.ВстроенныйЯзык.ВыделенныйТекст = Символы.ПС;
	
КонецПроцедуры

Процедура КоманднаяПанельВстроенныйЯзыкВОднострочныйВид(Кнопка)
	
	// https://www.forum.mista.ru/topic.php?id=659371&page=2
	// https://infostart.ru/public/71130/
	// https://partners.v8.1c.ru/forum/t/1134075/m/1134075
	// При компиляции 1С модулей, компилятор вставляет специальную команду перед первой выполняющейся инструкцией в строке исходного кода.
	// Эта команда используется для служебных целей платформы, например обработки прерывания выполнения кода, работы отладчика и т.п.
	// Обычно, обработка этой команды очень слабо влияет на производительность 1С кода
	// При обработке опкода новой строки "на клиенте предотвращается "замерзание" интерфейса, а на сервере отслеживается потеря связи с клиентом и убитие соединения администратором
	// "Код "переменная1 = 342" практически ничего не делает, т.к. 342 это константа, сконструированная при компиляции модуля, а присваивание ее переменной очень дешевая операция.
	#Если Сервер И Не Сервер Тогда
	    ПолеВстроенногоЯзыка = Обработки.ирКлсПолеТекстовогоДокументаСКонтекстнойПодсказкой.Создать();
	#КонецЕсли
	НомерСтрокиКаретки = 0;
	ЭлементыФормы.ВстроенныйЯзык.ПолучитьГраницыВыделения(НомерСтрокиКаретки, 1, 1, 1);
	ВесьТекст = Ложь;
	Если СтрДлина(ЭлементыФормы.ВстроенныйЯзык.ВыделенныйТекст) = 0 Тогда
		ВесьТекст = Истина;
		Текст = ЭлементыФормы.ВстроенныйЯзык.ПолучитьТекст();
		НомерСтрокиКаретки = 1;
	Иначе
		Текст = ЭлементыФормы.ВстроенныйЯзык.ВыделенныйТекст;
	КонецЕсли;
	ОднострочныйТекст = Новый ЗаписьXML;
	ОднострочныйТекст.УстановитьСтроку("");
	МногострочныйТекст = Текст;
	Если Прав(МногострочныйТекст, 1) = Символы.ПС Тогда
		МногострочныйТекст = Сред(МногострочныйТекст, 1, СтрДлина(МногострочныйТекст) - 1);
	КонецЕсли; 
	Если Найти(НРег(Текст), НРег("ОбработкаПрерыванияПользователя();")) > 0 Тогда
		Сообщить("Метод ОбработкаПрерыванияПользователя() в однострочном варианте фактически не будет работать", СтатусСообщения.Информация);
	КонецЕсли; 
	Комментарии = "";
	Текст = ПолеВстроенногоЯзыка.УдалитьКомментарии(Текст);
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.УстановитьТекст(Текст);
	ПерваяСтрокаТекста = ТекстовыйДокумент.ПолучитьСтроку(1);
	Отступ = Лев(ПерваяСтрокаТекста, СтрДлина(ПерваяСтрокаТекста) - СтрДлина(СокрЛ(ПерваяСтрокаТекста)));
	МногострочныйТекст = ""
		+              Отступ + "// Пассивный оригинал расположенного ниже однострочного кода. Выполняйте изменения синхронно в обоих вариантах."
		+ Символы.ПС + Отступ + "#Если Сервер И Не Сервер Тогда"
		+ Символы.ПС + МногострочныйТекст
		+ Символы.ПС + Отступ + "#КонецЕсли";
	ОткрытаИнструкцияДляПодсказки = Ложь;
	Для Счетчик = 1 По ТекстовыйДокумент.КоличествоСтрок() Цикл 
		СтрокаТекста = ТекстовыйДокумент.ПолучитьСтроку(Счетчик);
		//Если Лев(СокрЛ(СтрокаТекста), 2) = "//" Тогда
		//	Продолжить;
		//КонецЕсли; 
		Если Лев(СокрЛ(СтрокаТекста), 1) = "|" Тогда
			Сообщить("В однострочном коде не допускаются многострочные строковые литералы", СтатусСообщения.Внимание);
			ЭлементыФормы.ВстроенныйЯзык.УстановитьГраницыВыделения(НомерСтрокиКаретки + Счетчик - 1, 1, НомерСтрокиКаретки + Счетчик - 1, 1000);
			Возврат;
		КонецЕсли;
		ИнструкцияДляПодсказки = "#Если Сервер И Не Сервер Тогда";
		Если НРег(СокрЛП(СтрокаТекста)) = НРег(ИнструкцияДляПодсказки) Тогда
			СтрокаТекста = СтрЗаменить(СтрокаТекста, ИнструкцияДляПодсказки, "Если Ложь Тогда");
			ОткрытаИнструкцияДляПодсказки = Истина;
		КонецЕсли; 
		Если ОткрытаИнструкцияДляПодсказки И СокрЛП(СтрокаТекста) = "#КонецЕсли" Тогда
			СтрокаТекста = СтрЗаменить(СтрокаТекста, "#КонецЕсли", "КонецЕсли;");
			ОткрытаИнструкцияДляПодсказки = Ложь;
		КонецЕсли; 
		Если Лев(СокрЛ(СтрокаТекста), 1) = "#" Тогда
			Сообщить("В однострочном коде не допускаются инструкции препроцессора", СтатусСообщения.Внимание);
			ЭлементыФормы.ВстроенныйЯзык.УстановитьГраницыВыделения(НомерСтрокиКаретки + Счетчик - 1, 1, НомерСтрокиКаретки + Счетчик - 1, 1000);
			Возврат;
		КонецЕсли; 
		ОднострочныйТекст.ЗаписатьБезОбработки(СокрП(СтрокаТекста) + " " + Символы.НПП);
	КонецЦикла;
	ВыходнойТекст = Символы.ПС;
	ВыходнойТекст = ВыходнойТекст + МногострочныйТекст + Символы.ПС;
	ВыходнойТекст = ВыходнойТекст + Отступ + КомментарийОднострочногоВида() + Символы.ПС + ОднострочныйТекст.Закрыть() + Символы.ПС + Символы.ПС;
	Если ВесьТекст Тогда
		ЭлементыФормы.ВстроенныйЯзык.УстановитьГраницыВыделения(1, СтрДлина(ЭлементыФормы.ВстроенныйЯзык.ПолучитьТекст()) + 1);
		ЭлементыФормы.ВстроенныйЯзык.ВыделенныйТекст = ВыходнойТекст;
		ЭлементыФормы.ВстроенныйЯзык.УстановитьГраницыВыделения(1, 1);
	Иначе
		ЭлементыФормы.ВстроенныйЯзык.ВыделенныйТекст = ВыходнойТекст;
		ЭлементыФормы.ВстроенныйЯзык.УстановитьГраницыВыделения(НомерСтрокиКаретки, 1, НомерСтрокиКаретки, 1);
	КонецЕсли; 
	
КонецПроцедуры

Функция КомментарийОднострочногоВида()
	
	Возврат "// Однострочный код использован для ускорения. Выше расположен оригинал. Выполняйте изменения синхронно в обоих вариантах."
		+ " Преобразовано консолью кода из подсистемы ""Инструменты разработчика"" (http://devtool1c.ucoz.ru)";

КонецФункции

Процедура КоманднаяПанельВстроенныйЯзыкИзОднострочногоВида(Кнопка)

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

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

Параметры.Колонки.Добавить("НИмя");
мСписокВнешнихПараметров = Новый СписокЗначений; 
ИмяВнешнейОбработки = "DynamicExternalProcessorOfCodeConsole";
мПлатформа.ПолучитьФайлОткрывателя1С();
мСтруктураВосстановления = ирОбщий.ПолучитьСтруктуруВосстановленияКонсолиЛкс("irCodeConsole");
ЭлементыФормы.КП_Дерево.Кнопки.Сохранить.Доступность = Не ирКэш.ЛиПортативныйРежимЛкс();
ЭлементыФормы.КП_Дерево.Кнопки.Загрузить.Доступность = Не ирКэш.ЛиПортативныйРежимЛкс();
//Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
//	ЭлементыФормы.ДействияФормы.Кнопки.СохранитьФайл.СочетаниеКлавиш = Новый СочетаниеКлавиш(Клавиша.S,, Истина);
//Иначе
//	ЭлементыФормы.ДействияФормы.Кнопки.Сохранить.СочетаниеКлавиш = Новый СочетаниеКлавиш(Клавиша.S,, Истина);
//КонецЕсли; 
мАнализТехножурнала = ирКэш.ПолучитьАнализТехножурналаЛкс();
#Если Сервер И Не Сервер Тогда
	мАнализТехножурнала = Обработки.ирАнализТехножурнала.Создать();
#КонецЕсли
// Расширим доступные типы значений параметров внешними источниками данных
Параметры.Колонки.ПредставлениеЗначения.Имя = "_";
НовыйТипЗначения = Новый ОписаниеТипов(Параметры.Колонки._.ТипЗначения, ирОбщий.ПолучитьОписаниеТиповВсеСсылкиЛкс().Типы());
Параметры.Колонки.Добавить("ПредставлениеЗначения", НовыйТипЗначения);
Параметры.Колонки.Удалить("_");
ДеревоАлгоритмов.Колонки.Добавить("ЭтоГруппа", Новый ОписаниеТипов("Булево"));
ДеревоАлгоритмов.Колонки.Добавить("ТекстАлгоритма", Новый ОписаниеТипов("Строка"));
ДеревоАлгоритмов.Колонки.Добавить("Параметры");
ДеревоАлгоритмов.Колонки.Добавить("НачальнаяСтрока", Новый ОписаниеТипов("Число"));
ДеревоАлгоритмов.Колонки.Добавить("НачальнаяКолонка", Новый ОписаниеТипов("Число"));
ДеревоАлгоритмов.Колонки.Добавить("КонечнаяСтрока", Новый ОписаниеТипов("Число"));
ДеревоАлгоритмов.Колонки.Добавить("КонечнаяКолонка", Новый ОписаниеТипов("Число"));
ирОбщий.ИнициализироватьФормуЛкс(ЭтаФорма, "Обработка.ирКонсольКода.Форма.Форма");
