Перем мИсторияФайлов;
Перем мТекущаяСтрокаДереваЗапросов;
Перем мСтрокаЗагруженаВКонсоль;
Перем мИмяОткрытогоФайла;
Перем мПлатформа;
Перем мКодыСостояний;
Перем мГруппыСостояний;
Перем мЗаголовкиHttp;
Перем мИменаПростыхСвойствЗапроса;
Перем мРедакторЗапросаJSON;
Перем мРедакторОтветаJSON;
Перем мНоваяТекущаяСтрока;
Перем мСтруктураВосстановления;

Процедура ПриОткрытии()
	
	ирКлиент.Форма_ПриОткрытииЛкс(ЭтаФорма);
	#Если Сервер И Не Сервер Тогда
		мПлатформа = Обработки.ирПлатформа.Создать();
	#КонецЕсли
	// Антибаг конфигуратора http://www.hostedredmine.com/issues/862503
	ЭлементыФормы.КП_Дерево.Видимость = Ложь;
	
	ОбновитьДоступностьКнопкиВыполнятьНаСервере();
	ЭтаФорма.Модифицированность = Ложь;
	Если Не МодальныйРежим И Не мРежимОтладки Тогда
		ОписаниеФайлаВосстановления = Новый Структура;
		ИмяФайлаВосстановления = ирКлиент.ПроверитьВыбратьФайлВосстановленияКонсолиЛкс(мСтруктураВосстановления, ОписаниеФайлаВосстановления);
		Если ИмяФайлаВосстановления <> "" Тогда
			мИмяОткрытогоФайла = ИмяФайлаВосстановления;
		Иначе
			// Попытаемся загрузить последний открывавшийся файл
			мИмяОткрытогоФайла = ирОбщий.ВосстановитьЗначениеЛкс(Метаданные().Имя + "_ИмяФайла");
			Если мИмяОткрытогоФайла = НеОпределено Тогда
				мИмяОткрытогоФайла = "";
			КонецЕсли; 
		КонецЕсли;
		Если ПустаяСтрока(мИмяОткрытогоФайла) Тогда
			СоздатьФайл();
		Иначе
			Попытка
				ЗагрузитьИзФайла();
			Исключение
				Сообщить(ОписаниеОшибки());
			КонецПопытки;
		КонецЕсли;
		Если ИмяФайлаВосстановления <> "" Тогда
			ЭтаФорма.Модифицированность = Истина;
			мИмяОткрытогоФайла = ирКлиент.ПослеВосстановленияФайлаКонсолиЛкс(ОписаниеФайлаВосстановления);
		КонецЕсли; 
	КонецЕсли; 
	мИсторияФайлов = ирОбщий.ВосстановитьЗначениеЛкс(Метаданные().Имя + "_ИсторияФайлов");
	Если мИсторияФайлов = Неопределено Тогда
		мИсторияФайлов = Новый СписокЗначений;
	КонецЕсли;
	ОбновитьПодменюИсторииФайлов();
	МассивМетодов = ЭлементыФормы.МетодЗапроса.СписокВыбора;
	МассивМетодов.Добавить("GET");
	МассивМетодов.Добавить("HEAD");
	МассивМетодов.Добавить("PUT");
	МассивМетодов.Добавить("POST");
	МассивМетодов.Добавить("DELETE");
	МассивМетодов.Добавить("PATCH");
	МассивМетодов.Добавить("MERGE");
	МассивМетодов.Добавить("OPTIONS");
	МассивМетодов.Добавить("TRACE");
	МассивМетодов.Добавить("CONNECT");
	МассивМетодов.СортироватьПоЗначению();
	СписокВыбора = ЭлементыФормы.МаксимальныйРазмерОтвета.СписокВыбора;
	СписокВыбора.Добавить(5);
	СписокВыбора.Добавить(500);
	СписокВыбора.Добавить(5000);
	СписокВыбора.Добавить(50000);
	СписокВыбора = ЭлементыФормы.ТаймаутЗапроса.СписокВыбора;
	СписокВыбора.Добавить(10);
	СписокВыбора.Добавить(30);
	СписокВыбора.Добавить(60);
	СписокВыбора.Добавить(600);
	СписокВыбора = ЭлементыФормы.КодировкаЗапроса.СписокВыбора;
	СписокВыбора.Добавить("UTF-8");
	СписокВыбора.Добавить("UTF-16");
	СписокВыбора.Добавить("windows-1251");
	СписокВыбора = ЭлементыФормы.ИсточникТелаЗапроса.СписокВыбора;
	Для Каждого Страница Из ЭлементыФормы.ПанельТелоЗапроса.Страницы Цикл
		СписокВыбора.Добавить(Страница.Имя, Страница.Заголовок);
	КонецЦикла;
	мКодыСостояний = ирОбщий.ТаблицаЗначенийИзТабличногоДокументаЛкс(ПолучитьМакет("КодыСостояний"),,,, Истина);
	мГруппыСостояний = ирОбщий.ТаблицаЗначенийИзТабличногоДокументаЛкс(ПолучитьМакет("ГруппыКодовСостояний"),,,, Истина);
	мЗаголовкиHttp = ирОбщий.ТаблицаЗначенийИзТабличногоДокументаЛкс(ПолучитьМакет("Заголовки"),,,, Истина);
	РазрешенJSON = ирКэш.ДоступенБраузерWebKitЛкс();
	ЭлементыФормы.ПанельТелоЗапросаСтрока.Страницы.JSON.Доступность = РазрешенJSON;
	ЭлементыФормы.ПанельОтвет.Страницы.ТелоОтветаJSON.Доступность = РазрешенJSON;
	Если РазрешенJSON Тогда
		БазовыйФайлРедактораJSON = мПлатформа.БазовыйФайлРедактораJSON();
		ЭлементыФормы.ТелоЗапросаJSON.Перейти(БазовыйФайлРедактораJSON);
		ЭлементыФормы.ТелоЗапросаJSON.Документ.ЭтоРедактор = Истина;
		ЭлементыФормы.ТелоОтветаJSON.Перейти(БазовыйФайлРедактораJSON);
		ЭлементыФормы.ТелоОтветаJSON.Документ.ЭтоРедактор = Истина;
		ЭлементыФормы.ТелоОтветаJSON.Документ.isEditable = false;
	КонецЕсли; 

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

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

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

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

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

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

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

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

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

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

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

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

Процедура УстановитьТекущуюСтроку()
	
	ЭлементыФормы.ДеревоЗапросов.ТекущаяСтрока = мНоваяТекущаяСтрока;
	мНоваяТекущаяСтрока = Неопределено;

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

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

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

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

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

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

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

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

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

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

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

Функция ТелоЗапросаСтрока() Экспорт

	Если ЭлементыФормы.ПанельТелоЗапросаСтрока.ТекущаяСтраница = ЭлементыФормы.ПанельТелоЗапросаСтрока.Страницы.JSON Тогда
		Если мРедакторЗапросаJSON <> Неопределено Тогда
			ЭтаФорма.ТелоЗапросаСтрока = мРедакторЗапросаJSON.getText();
		КонецЕсли; 
	КонецЕсли; 
	Возврат ТелоЗапросаСтрока;

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

Функция УстановитьТелоЗапросаСтрока(НовыйТекст) Экспорт

	Если мРедакторЗапросаJSON <> Неопределено Тогда
		мРедакторЗапросаJSON.setText(НовыйТекст);
	КонецЕсли; 
	ЭтаФорма.ТелоЗапросаСтрока = НовыйТекст;

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

Функция УстановитьТелоОтветаСтрока(НовыйТекст = "") Экспорт

	ЭтаФорма.ТелоОтветаСтрока = НовыйТекст;
	Если мРедакторОтветаJSON <> Неопределено Тогда
		мРедакторОтветаJSON.setText(НовыйТекст);
	КонецЕсли; 
	ЭтаФорма.ТелоОтветаСтрока = НовыйТекст;
	ЭтаФорма.КоличествоСимволовОтвета = СтрДлина(ТелоОтветаСтрока);
	ЭлементыФормы.ТелоОтветаСтрокаHtml.УстановитьТекст(НовыйТекст);
	// Установка ТелоОтветаHtml перенесена в ПриАктивизацииСтраницы https://www.hostedredmine.com/issues/919442
	ирКлиент.УстановитьГотовностьДанныхСтраницыЛкс(ЭтаФорма, ЭлементыФормы.ПанельОтвет.Страницы.ТелоОтветаHtml, Ложь);

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

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

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

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

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

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

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

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

Процедура ПриИзмененииДереваЗапросов()

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

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

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

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

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

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

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

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

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

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

Процедура ЗаполнитьСвойстваЗапросаПоУмолчанию()
	
	ЭтаФорма.Автонаименование = Истина;

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

Функция БазовоеИмяНовойСтроки()
	
	Возврат "Запрос";

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура КоманднаяПанельФормыОткрытьИТС(Кнопка)
	
	ирКлиент.ОткрытьСсылкуИТСЛкс("https://its.1c.ru/db/v?doc#bookmark:dev:TI000000116");
	
КонецПроцедуры

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

Функция ПротоколЗапроса()
	Протокол = ?(ИспользоватьЗащищенноеСоединение, "https", "http");
	Возврат Протокол;
КонецФункции

Функция ОбновитьКонечныйURL(Полный = Истина)
	
	Перем ПараметрЗапроса, СтрокаПараметров, СтрокаПараметровДекодированная;
	Результат = "";
	Если Полный Тогда
		Результат = Результат + ПротоколЗапроса() + "://";
		Результат = Результат + СерверЗапроса;
		Если ЗначениеЗаполнено(ПортЗапроса) И ПортЗапроса <> 80 Тогда
			Результат = Результат + ":" + XMLСтрока(ПортЗапроса);
		КонецЕсли;
	КонецЕсли; 
	Если Лев(АдресРесурса, 1) = "/" Тогда
		АдресРесурса = Сред(АдресРесурса, 2);
	КонецЕсли;
	АдресРесурсаКонечный = АдресРесурса;
	Для Каждого ПараметрАдреса Из ПараметрыURL Цикл
		АдресРесурсаКонечный = СтрЗаменить(АдресРесурсаКонечный, ПараметрАдреса.Имя, ПараметрАдреса.Значение);
		АдресРесурсаЗакодированный = СтрЗаменить(АдресРесурсаЗакодированный, ПараметрАдреса.Имя, КодироватьСтроку(ПараметрАдреса.Значение, СпособКодированияСтроки.КодировкаURL))
	КонецЦикла;
	ФрагментыАдреса = ирОбщий.СтрРазделитьЛкс(АдресРесурсаКонечный, "/");
	#Если Сервер И Не Сервер Тогда
		ФрагментыАдреса = Новый Массив;
	#КонецЕсли
	Для Индекс = 0 По ФрагментыАдреса.ВГраница() Цикл
		ФрагментыАдреса[Индекс] = КодироватьСтроку(ФрагментыАдреса[Индекс], СпособКодированияСтроки.КодировкаURL);
	КонецЦикла;
	АдресРесурсаЗакодированный = ирОбщий.СтрСоединитьЛкс(ФрагментыАдреса, "/");
	РезультатДекодированный = Результат + "/" + АдресРесурсаКонечный;
	Результат = Результат + "/" + АдресРесурсаЗакодированный;
	Если ирОбщий.СтрокиРавныЛкс(МетодЗапроса, "GET") Или ИспользоватьДляВсехМетодов Тогда
		СтрокаПараметров = "";
		СтрокаПараметровДекодированная = "";
		Для Каждого ПараметрЗапроса Из ПараметрыЗапроса Цикл
			Если ЗначениеЗаполнено(СтрокаПараметров) Тогда
				СтрокаПараметров = СтрокаПараметров + "&";
				СтрокаПараметровДекодированная = СтрокаПараметровДекодированная + "&";
			КонецЕсли;
			СтрокаПараметров = СтрокаПараметров + КодироватьСтроку(ПараметрЗапроса.Имя, СпособКодированияСтроки.КодировкаURL)
				+ "=" + КодироватьСтроку(ПараметрЗапроса.Значение, СпособКодированияСтроки.КодировкаURL);
			СтрокаПараметровДекодированная = СтрокаПараметровДекодированная + ПараметрЗапроса.Имя + "=" + ПараметрЗапроса.Значение;
		КонецЦикла;
		Если ЗначениеЗаполнено(СтрокаПараметров) Тогда
			РезультатДекодированный = РезультатДекодированный + "?" + СтрокаПараметровДекодированная;
			Результат = Результат + "?" + СтрокаПараметров;
		КонецЕсли; 
	КонецЕсли;
	Если Полный Тогда
		ЭтаФорма.КонечныйURLДекодированный = РезультатДекодированный;
		ЭтаФорма.КонечныйURL = Результат;
	КонецЕсли; 
	Если Автонаименование И ЗначениеЗаполнено(СерверЗапроса) Тогда
		мТекущаяСтрокаДереваЗапросов.Наименование = НРег(МетодЗапроса) + "->" + СерверЗапроса + "/" + АдресРесурса; 
	КонецЕсли; 
	Возврат Результат;

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

Процедура АдресНаСервереПриИзменении(Элемент)
	
	ОбновитьКонечныйURL();
	
КонецПроцедуры

Процедура ЗащищенноеПриИзменении(Элемент)
	
	ЭтаФорма.ПортЗапроса = 0;
	ОбновитьКонечныйURL();
	
КонецПроцедуры

Процедура ПортЗапросаПриИзменении(Элемент)
	
	ОбновитьКонечныйURL();
	
КонецПроцедуры

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

Функция ПолучитьТелоPOSTЗапросаFormData(СписокСоответствий, РазделительBound = Неопределено, Кодировка = Неопределено)

	ТекстТелаЗапроса = "";
	Если НЕ ЗначениеЗаполнено(Кодировка) Тогда
		Кодировка = "UTF-8";
	КонецЕсли;
	Если Не ЗначениеЗаполнено(РазделительBound) Тогда
		РазделительBound = "" + Новый УникальныйИдентификатор();
	КонецЕсли;
	Для Каждого СтрСписка Из СписокСоответствий Цикл
		ТекстТелаЗапроса = 	ТекстТелаЗапроса 
		+ Символы.ПС
		+ "--" + РазделительBound
		+ Символы.ПС
		+ "Content-Type: text/plain; charset="
		+ Кодировка
		+ Символы.ПС
		+ "Content-Disposition: form-data; name='"
		+ СтрСписка.Ключ
		+ "'"
		+ Символы.ПС
		+ Символы.ПС
		+ СтрСписка.Значение
		+ Символы.ПС
		+ "--" + РазделительBound;
	КонецЦикла;
	Возврат ТекстТелаЗапроса + "--";
	
КонецФункции

Процедура ДобавитьЗаголовокАвторизации(Токен, ТипАвторизации = "Basic")
	УстановитьГенерируемыйЗаголовокЗапроса("Authorization", ТипАвторизации + " " + Токен);
КонецПроцедуры

Функция ПолучитьЗапросHTTP(Сервис, Заголовки = Неопределено, ТелоЗапроса = Неопределено)
	
	Если НЕ ЗначениеЗаполнено(Заголовки) Или ТипЗнч(Заголовки) <> Тип("Соответствие") Тогда
		Заголовки = Новый Соответствие;
	КонецЕсли;
	Запрос = Новый HTTPЗапрос(Сервис, Заголовки);
	Если ЗначениеЗаполнено(ТелоЗапроса) Тогда
		Запрос.УстановитьТелоИзСтроки(ТелоЗапроса);
	КонецЕсли;
	Возврат Запрос;
	
КонецФункции

Функция ПолучитьТокенOAuth2(Сервис, Ключ, Секрет, Scope, СоединениеHTTP)
	
	#Если Сервер И Не Сервер Тогда
		СоединениеHTTP = Новый HTTPСоединение;
	#КонецЕсли
	СтруктураURI = ирОбщий.СтруктураURIЛкс(Сервис);
	Данные = Новый Структура("client_id, client_secret, scope, grant_type", Ключ, Секрет, Scope, "client_credentials");
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Content-Type", "application/json");
	ЗапросHTTP = ПолучитьЗапросHTTP(СтруктураURI.ПутьНаСервере, Заголовки, ирОбщий.ОбъектВСтрокуJSONЛкс(Данные));
	РезультатЗапроса = СоединениеHTTP.ОтправитьДляОбработки(ЗапросHTTP);
	#Если Сервер И Не Сервер Тогда
		РезультатЗапроса = Новый HTTPОтвет;
	#КонецЕсли
	Если РезультатЗапроса.КодСостояния <> 200 Тогда
		Сообщить("Ошибка получения токена OAuth2 - Код ответа " + РезультатЗапроса.КодСостояния);
		Возврат Неопределено;
	КонецЕсли;
	Данные = РезультатЗапроса.ПолучитьТелоКакСтроку();
	СтруктураДанных = ирОбщий.ОбъектВСтрокуJSONЛкс(Данные);
	Если НЕ СтруктураДанных.Свойство("access_token") Тогда
		Сообщить("Ошибка получения токена OAuth2 - В ответе нет поля ""access_token""");
		Возврат Неопределено;
	КонецЕсли;
	Возврат СтруктураДанных.access_token;
	
КонецФункции

Функция ИспользоватьBOMЗапроса()
	ИспользованиеByteOrderMarkМой = Вычислить("ИспользованиеByteOrderMark"); // Доступен с 8.3.6
	Результат = ?(ИспользоватьBOM, ИспользованиеByteOrderMarkМой.Авто, ИспользованиеByteOrderMarkМой.НеИспользовать);
	Возврат Результат;
КонецФункции

Процедура КоманднаяПанельВыполнениеВыполнитьЗапрос(Кнопка = Неопределено)
	
	Если Не ЗначениеЗаполнено(СерверЗапроса) Тогда
		Сообщить("Необходимо указать сервер запроса");
		ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.СерверЗапроса;
		Возврат;
	КонецЕсли;
	// Встречал имена кук, начинающиеся с цифры
	//Если Не ирОбщий.ПроверитьТаблицуПараметровЛкс(КукиЗапроса, "Проверка таблицы ""Куки запроса"". ") Тогда
	//	ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.КукиЗапроса;
	//	Возврат;
	//КонецЕсли; 
	//Если Не ирОбщий.ПроверитьТаблицуПараметровЛкс(ПараметрыЗапроса, "Проверка таблицы ""Параметры запроса GET"". ") Тогда
	//	ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ПараметрыЗапроса;
	//	Возврат;
	//КонецЕсли; 
	СохранитьФайлДляВосстановления();
	Если ИсточникТелаЗапроса = "ДвоичныеДанные" И ТелоЗапросаДвоичныеДанные = Неопределено Тогда
		Сообщить("Необходимо установить двоичные данные, либо выбрать другой источник тела запроса");
		ЭлементыФормы.ПанельТелоЗапроса.ТекущаяСтраница = ЭлементыФормы.ПанельТелоЗапроса.Страницы.ДвоичныеДанные;
		ЭлементыФормы.ПанельЗапрос.ТекущаяСтраница = ЭлементыФормы.ПанельЗапрос.Страницы.ТелоЗапроса;
		ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ИсточникТелаЗапроса;
		Возврат;
	КонецЕсли; 
	ПортВременный = КонечныйПорт(ПортЗапроса, ИспользоватьЗащищенноеСоединение);
	ОписаниеОшибки = "";
	СоединениеHTTP = ирОбщий.СоединениеHTTPЛкс(СерверЗапроса, ПортВременный, ПользовательЗапроса, ПарольЗапроса, СобственныйПрокси, ТаймаутЗапроса, ИспользоватьЗащищенноеСоединение, АутентификацияОС,
		"Основное соединение", КонтекстВыполнения = "Сервер", События,,, ОписаниеОшибки);
	Если СоединениеHTTP = Неопределено Тогда
		ирОбщий.СообщитьЛкс("Не удалось установить соединение: " + ОписаниеОшибки, СтатусСообщения.Внимание);
		Возврат;
	КонецЕсли; 
	Для Каждого СтрокаКУдалению Из ЗаголовкиЗапроса.НайтиСтроки(Новый Структура("Генерируемый", Истина)) Цикл
		ЗаголовкиЗапроса.Удалить(СтрокаКУдалению);
	КонецЦикла; 
	#Если Сервер И Не Сервер Тогда
		СоединениеHTTP = Новый HTTPСоединение;
	#КонецЕсли
	АдресРесурсаСПараметрами = АдресРесурсаСПараметрами();
	ЗапросHTTP = Новый HTTPЗапрос(АдресРесурсаСПараметрами);
	Если ИсточникТелаЗапроса = "ДанныеФормыЗапроса" Тогда
		СформироватьТелоЗапросаИзДанныхФормы();
	КонецЕсли; 
	Если ЭлементыФормы.ПанельЗапрос.Страницы.ТелоЗапроса.Доступность Тогда
		Если ИсточникТелаЗапроса = "ДанныеФормыЗапроса" Или ИсточникТелаЗапроса = "ТелоЗапросаСтрока" Тогда
			ЗапросHTTP.УстановитьТелоИзСтроки(ТелоЗапросаСтрока(), КодировкаЗапроса, ИспользоватьBOMЗапроса());
		Иначе
			ЗапросHTTP.УстановитьТелоИзДвоичныхДанных(ТелоЗапросаДвоичныеДанные);
		КонецЕсли; 
	КонецЕсли; 
	Если ТипАвторизации = "OAuth2" Тогда
		Токен = ПолучитьТокенOAuth2(OAuth2_Сервис, OAuth2_КлючКлиента, OAuth2_СекретКлиента, OAuth2_Scope, СоединениеHTTP);
		Если ЗначениеЗаполнено(Токен) Тогда
			ДобавитьЗаголовокАвторизации(Токен, "Bearer"); 
		КонецЕсли;
	ИначеЕсли ТипАвторизации = "Basic" Тогда
		СтрокаАутентификации = СтрЗаменить(Base64Строка(ПолучитьДвоичныеДанныеИзСтроки(ПользовательЗапроса + ":" + ПарольЗапроса)), Символы.ВК + Символы.ПС, "");
		ДобавитьЗаголовокАвторизации(СтрокаАутентификации);
	ИначеЕсли ТипАвторизации = "Bearer" Тогда
		ДобавитьЗаголовокАвторизации(ПользовательЗапроса, "Bearer");
	КонецЕсли;
	УстановитьЗаголовкиЗапросаHTTP(ЗапросHTTP);
	ВремяНачала = ирОбщий.ТекущееВремяВМиллисекундахЛкс();
	ОчиститьОтвет();
	Попытка
		ОтветHTTP = СоединениеHTTP.ВызватьHTTPМетод(МетодЗапроса, ЗапросHTTP);
	Исключение
		мТекущаяСтрокаДереваЗапросов.Длительность = ирОбщий.ТекущееВремяВМиллисекундахЛкс() - ВремяНачала;
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке), СтатусСообщения.Внимание);
		Возврат;
	КонецПопытки; 
	ЭтаФорма.КодСостояния = ОтветHTTP.КодСостояния;
	Для Счетчик = 1 По 5 Цикл
		Если Автоперенаправление И КодСостояния >= 300 И КодСостояния < 400 Тогда 
			ПрочитатьКуки(ОтветHTTP);
			СтруктураURL = ирОбщий.СтруктураURIЛкс(ОтветHTTP.Заголовки["Location"]);
			ЗапросHTTP.АдресРесурса = СтруктураURL.ПутьНаСервере;
			СоединениеHTTP = ирОбщий.СоединениеHTTPЛкс(СтруктураURL.ИмяСервера, СтруктураURL.ПортHttp, ПользовательЗапроса, ПарольЗапроса, СобственныйПрокси, ТаймаутЗапроса, СтруктураURL.ИспользоватьHTTPS,
				АутентификацияОС, "Перенаправленное соединение", КонтекстВыполнения = "Сервер");
			Если СоединениеHTTP = Неопределено Тогда
				Прервать;
			КонецЕсли; 
			#Если Сервер И Не Сервер Тогда
				СоединениеHTTP = Новый HTTPСоединение;
			#КонецЕсли
			УстановитьЗаголовкиЗапросаHTTP(ЗапросHTTP);
			ОтветHTTP = СоединениеHTTP.ВызватьHTTPМетод(МетодЗапроса, ЗапросHTTP);
			ЭтаФорма.КодСостояния = ОтветHTTP.КодСостояния;
		Иначе
			Прервать;
		КонецЕсли; 
	КонецЦикла;
	мТекущаяСтрокаДереваЗапросов.Длительность = ирОбщий.ТекущееВремяВМиллисекундахЛкс() - ВремяНачала;
	Если СоединениеHTTP = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	ДвоичныеДанныеОтвета = ОтветHTTP.ПолучитьТелоКакДвоичныеДанные();
	УстановитьТелоОтветаСтрока(ОтветHTTP.ПолучитьТелоКакСтроку());
	УстановитьТелоОтветаДвоичныеДанные(ДвоичныеДанныеОтвета);
	Для Каждого ЗаголовокОтвета Из ОтветHTTP.Заголовки Цикл
		СтрокаЗаголовка = ЗаголовкиОтвета.Добавить();
		СтрокаЗаголовка.Имя = ЗаголовокОтвета.Ключ;
		ирОбщий.ОбновитьКопиюСвойстваВНижнемРегистреЛкс(СтрокаЗаголовка);
		СтрокаЗаголовка.Значение = ЗаголовокОтвета.Значение;
		СтрокаОписания = мЗаголовкиHttp.Найти(ЗаголовокОтвета.Ключ, "Заголовок");
		Если СтрокаОписания <> Неопределено Тогда
			СтрокаЗаголовка.Описание = ОписаниеЗаголовка(СтрокаОписания, Ложь);
		КонецЕсли; 
	КонецЦикла;
	ЗаголовкиОтвета.Сортировать("Имя");
	ОбновитьСписокВыбораИсточникаПоискаРезультата();
	ПрочитатьКуки(ОтветHTTP);
	#Если Сервер И Не Сервер Тогда
		мКодыСостояний = Новый ТаблицаЗначений;
	#КонецЕсли
	СтрокаКодаСостояния = мКодыСостояний.Найти(КодСостояния, "Код");
	Если СтрокаКодаСостояния <> Неопределено Тогда
		ЭтаФорма.ОписаниеКодаСостояния = СтрокаКодаСостояния.Описание;
	КонецЕсли; 
	Для Каждого СтрокаГруппы Из мГруппыСостояний Цикл
		Если Цел(СтрокаГруппы.Код / 100) = Цел(КодСостояния / 100) Тогда
			ЭтаФорма.ГруппаКодовСостояний = СтрокаГруппы.Описание;
			Прервать;
		КонецЕсли; 
	КонецЦикла;
	ВыполнитьПоискРезультата();
	УстановитьТелоОтветаHtml();
	ЭтаФорма.Модифицированность = Истина;
	
КонецПроцедуры

Процедура УстановитьТелоОтветаДвоичныеДанные(Знач ДвоичныеДанныеОтвета = Неопределено)
	ЭтаФорма.ТелоОтветаДвоичныеДанные = ДвоичныеДанныеОтвета;
	ЭтаФорма.КоличествоБайтОтвета = 0;
	Если ТелоОтветаДвоичныеДанные <> Неопределено Тогда
		ЭтаФорма.КоличествоБайтОтвета = ТелоОтветаДвоичныеДанные.Размер();
	КонецЕсли;
КонецПроцедуры

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

Процедура УстановитьЗаголовкиЗапросаHTTP(Знач ЗапросHTTP)
	
	Если КукиЗапроса.Количество() > 0 Тогда
		СформироватьЗаголовокКуки();
	КонецЕсли;
	Для Каждого ЗаголовокЗапроса Из ЗаголовкиЗапроса Цикл
		ЗапросHTTP.Заголовки.Вставить(ЗаголовокЗапроса.Имя, ЗаголовокЗапроса.Значение);
	КонецЦикла;

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

Процедура ПрочитатьКуки(Знач ОтветHTTP)
	
	КукиОтвета.Очистить();
	КукиСтрока = ОтветHTTP.Заголовки["Set-Cookie"];
	#Если Сервер И Не Сервер Тогда
		мПлатформа = Обработки.ирПлатформа.Создать();
	#КонецЕсли
	// {ОписаниеРегулярногоВыражения.Начало} конструктор из подсистемы "Инструменты разработчика" (http://devtool1c.ucoz.ru)
	// Перем АтрибутExpires, АтрибутФлаг, АтрибутСоЗначением, Атрибут, Элемент;
	// {Шаблон.Начало}
	// + <АтрибутExpires> = (expires)\s*=\s*([^;]*)\s*
	// + <АтрибутФлаг> = Secure|HttpOnly
	// + <АтрибутСоЗначением> = ([\._ЁА-ЯA-Z\d]+)\s*=\s*([^;,]*)\s*
	// + <Атрибут> = (?:<АтрибутExpires>|<АтрибутСоЗначением>|<АтрибутФлаг>)
	// + <Элемент> = (\s*<Атрибут>;?)+(?:,|$)
	// {Шаблон.Конец}
	АтрибутExpires = "(expires)\s*=\s*([^;]*)\s*";
	АтрибутФлаг = "Secure|HttpOnly";
	АтрибутСоЗначением = "([\._ЁА-ЯA-Z\d]+)\s*=\s*([^;,]*)\s*";
	Атрибут = "(?:" + АтрибутExpires + "|" + АтрибутСоЗначением + "|" + АтрибутФлаг + ")";
	Элемент = "(\s*" + Атрибут + ";?)+(?:,|$)";
	// {ОписаниеРегулярногоВыражения.Конец}
	
	ВхожденияЭлементы = ирОбщий.НайтиРегВыражениеЛкс(КукиСтрока, Элемент, "Элемент",,,,, Истина);
	#Если Сервер И Не Сервер Тогда
	    ВхожденияЭлементы = Обработки.ирПлатформа.Создать().ВхожденияРегВыражения;
	#КонецЕсли
	Для каждого ВхождениеЭлемент Из ВхожденияЭлементы Цикл
		СтрокаКукиЗапроса = Неопределено;
		ВхожденияАтрибуты = ирОбщий.НайтиРегВыражениеЛкс(ВхождениеЭлемент.ТекстВхождения, Атрибут, "Имя, Значение, Имя1, Значение1, Флаг");
		#Если Сервер И Не Сервер Тогда
		    ВхожденияАтрибуты = Обработки.ирПлатформа.Создать().ВхожденияРегВыражения;
		#КонецЕсли
		Для каждого ВхождениеАтрибут Из ВхожденияАтрибуты Цикл
			ИмяКуки = ВхождениеАтрибут.Имя;
			ЗначениеКуки = ВхождениеАтрибут.Значение;
			Если Не ЗначениеЗаполнено(ИмяКуки) Тогда
				ИмяКуки = ВхождениеАтрибут.Имя1;
				ЗначениеКуки = ВхождениеАтрибут.Значение1;
			КонецЕсли; 
			Если СтрокаКукиЗапроса = Неопределено Тогда
				СтрокаКукиЗапроса = КукиЗапроса.Найти(НРег(ИмяКуки), "НИмя");
				Если СтрокаКукиЗапроса = Неопределено Тогда
					СтрокаКукиЗапроса = КукиЗапроса.Добавить();
					СтрокаКукиЗапроса.Имя = ИмяКуки;
					ирОбщий.ОбновитьКопиюСвойстваВНижнемРегистреЛкс(СтрокаКукиЗапроса);
				Иначе
					СтрокаКукиЗапроса.Secure = Ложь;
					СтрокаКукиЗапроса.HttpOnly = Ложь;
				КонецЕсли;
				СтрокаКукиЗапроса.Значение = ЗначениеКуки;
			Иначе
				Если ЗначениеЗаполнено(ИмяКуки) Тогда
					ИмяКуки = СтрЗаменить(ИмяКуки, "-", "");
					Попытка
						СтрокаКукиЗапроса[ИмяКуки] = ЗначениеКуки;
					Исключение
						// Нестандартные атрибуты
					КонецПопытки; 
				Иначе
					СтрокаКукиЗапроса[ВхождениеАтрибут.ТекстВхождения] = Истина;
				КонецЕсли; 
			КонецЕсли; 
		КонецЦикла; 
		СтрокаКукиОтвета = КукиОтвета.Добавить();
		ЗаполнитьЗначенияСвойств(СтрокаКукиОтвета, СтрокаКукиЗапроса); 
	КонецЦикла;
	КукиЗапроса.Сортировать("Имя");
	КукиОтвета.Сортировать("Имя");

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

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

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

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

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

Функция СформироватьЗаголовокКуки()
	
	ЗначениеКук = "";
	Для Каждого СтрокаКуки Из КукиЗапроса Цикл
		Если ЗначениеЗаполнено(ЗначениеКук) Тогда
			ЗначениеКук = ЗначениеКук + "; ";
		КонецЕсли; 
		ЗначениеКук = ЗначениеКук + СтрокаКуки.Имя + "=" + СтрокаКуки.Значение;
		Если ЗначениеЗаполнено(СтрокаКуки.path) Тогда
			ЗначениеКук = ЗначениеКук + "; path=" + СтрокаКуки.path;
		КонецЕсли; 
	КонецЦикла;
	Результат = УстановитьГенерируемыйЗаголовокЗапроса("Cookie", ЗначениеКук);
	Возврат Результат;

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

Функция СформироватьТелоЗапросаИзДанныхФормы()
	
	СоответствияДанныеФормы = Новый Соответствие;
	Для Каждого ЭлементДаныеФормы Из ДанныеФормыЗапроса Цикл
		СоответствияДанныеФормы.Вставить(ЭлементДаныеФормы.Имя, ЭлементДаныеФормы.Значение);
	КонецЦикла;
	РазделительBound = "" + Новый УникальныйИдентификатор();
	УстановитьТелоЗапросаСтрока(ПолучитьТелоPOSTЗапросаFormData(СоответствияДанныеФормы, РазделительBound));
	ЭтаФорма.ТелоЗапросаДвоичныеДанные = Неопределено;
	Результат = УстановитьГенерируемыйЗаголовокЗапроса("Content-Type", "multipart/form-data; boundary=""" + РазделительBound + """");
	Возврат Результат;

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

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

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

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

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

Процедура КонечныйЗапросПриИзменении(Элемент)
	
	ЗагрузитьКонечныйЗапрос(КонечныйURL);
	
КонецПроцедуры

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

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

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

Процедура КПТелоОтветаJSON(Кнопка)
	
	ОткрытьОтветЧерезВременныйФайл("json");
	
КонецПроцедуры

Процедура ОткрытьОтветЧерезВременныйФайл(Знач РасширениеФайла)
	
	Если ТелоОтветаДвоичныеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла(РасширениеФайла);
	ТелоОтветаДвоичныеДанные.Записать(ИмяВременногоФайла);
	ЗапуститьПриложение(ИмяВременногоФайла);

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

Процедура КПТелоОтветаXML(Кнопка)
	
	ОткрытьОтветЧерезВременныйФайл("xml");

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

Процедура КПТелоОтветаHTML(Кнопка)

	ОткрытьОтветЧерезВременныйФайл("html");
	
КонецПроцедуры

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

Процедура ТелоЗапросаПриИзменении(Элемент)
	
	ЭтаФорма.ТелоЗапросаДвоичныеДанные = Неопределено;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

Процедура КП_ЗаголовкиЗапросаОписание(Кнопка)
	
	ЗапуститьПриложение("https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%BE%D0%B2_HTTP");
	
КонецПроцедуры

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

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

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

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

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

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
	
	// СоединениеHTTP.ВызватьHTTPМетод
	Если ирКэш.НомерВерсииПлатформыЛкс() < 803006 Тогда 
		ирОбщий.СообщитьЛкс("Инструмент доступен только на платформе 8.3.6 и выше",,, Истина);
		Отказ = Истина;
	КонецЕсли; 

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

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

Процедура ТипАвторизацииПриИзменении(Элемент)
	
	НастроитьЭлементыФормы();
	
КонецПроцедуры

Процедура КПТелоОткрытьФайлЗапросаВПапке(Кнопка)
	
	Если ТелоЗапросаДвоичныеДанные <> Неопределено Тогда
		ИмяВременногоФайла = ПолучитьИмяВременногоФайла("dat");
		ТелоЗапросаДвоичныеДанные.Записать(ИмяВременногоФайла);
	Иначе
		ИмяВременногоФайла = ПолучитьИмяВременногоФайла("txt");
		ТекстовыйДокумент = Новый ТекстовыйДокумент;
		ТекстовыйДокумент.УстановитьТекст(ТелоЗапросаСтрока());
		ТекстовыйДокумент.Записать(ИмяВременногоФайла);
	КонецЕсли; 
	ирКлиент.ОткрытьФайлВПроводникеЛкс(ИмяВременногоФайла);
	
КонецПроцедуры

Процедура ОткрытьЗапросЧерезВременныйФайл(Знач РасширениеФайла)
	
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла(РасширениеФайла);
	Если ТелоЗапросаДвоичныеДанные <> Неопределено Тогда
		ТелоЗапросаДвоичныеДанные.Записать(ИмяВременногоФайла);
	Иначе
		ТекстовыйДокумент = Новый ТекстовыйДокумент;
		ТекстовыйДокумент.УстановитьТекст(ТелоЗапросаСтрока());
		ТекстовыйДокумент.Записать(ИмяВременногоФайла);
	КонецЕсли; 
	ЗапуститьПриложение(ИмяВременногоФайла);

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

Процедура КПТелоЗапросаJSON(Кнопка)
	
	ОткрытьЗапросЧерезВременныйФайл("json");
	
КонецПроцедуры

Процедура КПТелоЗапросаXML(Кнопка)
	
	ОткрытьЗапросЧерезВременныйФайл("xml");
	
КонецПроцедуры

Процедура КПТелоЗапросаПросмотрДерева(Кнопка)
	
	ирКлиент.ОткрытьПросмотрДереваJSONЛкс(ТелоЗапросаСтрока(), мТекущаяСтрокаДереваЗапросов.Наименование + " - Запрос");
	
КонецПроцедуры

Процедура КПТелоОтветаПросмотрДерева(Кнопка)
	
	ирКлиент.ОткрытьПросмотрДереваJSONЛкс(ТелоОтветаСтрока, мТекущаяСтрокаДереваЗапросов.Наименование + " - Ответ");
	
КонецПроцедуры

Процедура ПараметрыЗапросаЗначениеПриИзменении(Элемент)
	
	ОбновитьКонечныйURL();
	
КонецПроцедуры

Процедура ПараметрыЗапросаПослеУдаления(Элемент)
	
	ОбновитьКонечныйURL();

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

Процедура ПараметрыЗапросаИмяПриИзменении(Элемент)
	
	ОбновитьКонечныйURL();
	
КонецПроцедуры

Процедура ДекодироватьПриИзменении(Элемент)
	
	ЗагрузитьКонечныйЗапрос(КонечныйURL);
	
КонецПроцедуры

Процедура КП_КукиЗапросаОписание(Кнопка)
	
	ЗапуститьПриложение("https://ru.wikipedia.org/wiki/Cookie");
	
КонецПроцедуры

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

Процедура МетодЗапросаПриИзменении(Элемент)
	
	НастроитьЭлементыФормы();
	ОбновитьКонечныйURL();
	
КонецПроцедуры

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

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

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

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

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


Процедура КП_ДанныеФормыЗапросаОписание(Кнопка)
	
	ЗапуститьПриложение("https://ru.wikipedia.org/wiki/Multipart/form-data");
	
КонецПроцедуры

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

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

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

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

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

Процедура РегулярноеВыражениеПриИзменении(Элемент)
	
	ВыполнитьПоискРезультата();
	
КонецПроцедуры

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

Процедура ИсточникСтрокиДляПоискаПриИзменении(Элемент)
	
	ВыполнитьПоискРезультата();
	
КонецПроцедуры

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

Процедура УстановитьТелоОтветаHtml()
	
	ЭлементыФормы.ТелоОтветаHtml.УстановитьТекст(?(ПустаяСтрока(ТелоОтветаСтрока), "<html></html>", ТелоОтветаСтрока));
	ирКлиент.УстановитьГотовностьДанныхСтраницыЛкс(ЭтаФорма, ЭлементыФормы.ПанельОтвет.Страницы.ТелоОтветаHtml, Истина);

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

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

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

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

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

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

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

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

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

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

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

Процедура КП_ДанныеФормыЗапросаЗаполнитьИзСтрокиТела(Кнопка)
	
	ЗаголовокТипаСодержимого = ЗаголовкиЗапроса.Найти(Нрег("Content-Type"), "НИмя");
	Если ЗаголовокТипаСодержимого <> Неопределено Тогда
		// multipart/form-data; boundary="65fd0349-95ae-4604-b788-636e0a5e0d57"
		Если НРег(ирОбщий.ПервыйФрагментЛкс(ЗаголовокТипаСодержимого.Значение, ";")) = "multipart/form-data" Тогда 
			Разделитель = "--" + ирОбщий.ТекстМеждуМаркерамиЛкс(ЗаголовокТипаСодержимого.Значение, """", """", Ложь, Ложь);
			Если ЗначениеЗаполнено(Разделитель) Тогда
				Если ДанныеФормыЗапроса.Количество() > 0 Тогда
					Ответ = Вопрос("Существующие строки будут удалены. Продолжить?", РежимДиалогаВопрос.ОКОтмена);
					Если Ответ <> КодВозвратаДиалога.ОК Тогда
						Возврат;
					КонецЕсли;
				КонецЕсли; 
				ДанныеФормыЗапроса.Очистить();
				ТекстовыйДокумент = Новый ТекстовыйДокумент;
				ТекстовыйДокумент.УстановитьТекст(ТелоЗапросаСтрока());
				ВнутриПараметра = Ложь;
				ВнутриЗначенияПараметра = Ложь;
				ЗаписьЗначения = Неопределено;
				Для Счетчик = 1 По ТекстовыйДокумент.КоличествоСтрок() Цикл
					СтрокаТела = ТекстовыйДокумент.ПолучитьСтроку(Счетчик);
					Если Не ВнутриПараметра Тогда 
						Если Найти(СтрокаТела, Разделитель) = 1 Тогда
							ВнутриПараметра = Истина;
							СтрокаПараметра = ДанныеФормыЗапроса.Добавить();
						КонецЕсли; 
					ИначеЕсли ВнутриПараметра Тогда 
						Если Найти(СтрокаТела, Разделитель) = 1 Тогда
							ВнутриПараметра = Ложь;
							ВнутриЗначенияПараметра = Ложь;
							СтрокаПараметра.Значение = ЗаписьЗначения.Закрыть();
						ИначеЕсли Найти(СтрокаТела, "Content-Type:") = 1 Тогда
							// пока не читаем кодировку
							//СтрокаПараметра.Кодировка = "";
						ИначеЕсли Найти(СтрокаТела, "Content-Disposition:") = 1 Тогда
							СтрокаПараметра.Имя = ирОбщий.ТекстМеждуМаркерамиЛкс(СтрокаТела, "'", "'", Ложь, Ложь);
						ИначеЕсли ПустаяСтрока(СтрокаТела) Тогда 
							ВнутриЗначенияПараметра = Истина;
							ЗаписьЗначения = Новый ЗаписьXML;
							ЗаписьЗначения.УстановитьСтроку("");
							ЗаписьЗначенияПустая = Истина;
						ИначеЕсли ВнутриЗначенияПараметра Тогда 
							Если Не ЗаписьЗначенияПустая Тогда
								ЗаписьЗначения.ЗаписатьБезОбработки(Символы.ПС);
							КонецЕсли; 
							ЗаписьЗначения.ЗаписатьБезОбработки(СтрокаТела);
							ЗаписьЗначенияПустая = Ложь;
						КонецЕсли; 
					КонецЕсли; 
				КонецЦикла;
				ДанныеФормыЗапроса.Сортировать("Имя");
				ЭтаФорма.Модифицированность = Истина;
			КонецЕсли; 
		КонецЕсли;
	КонецЕсли; 
	
КонецПроцедуры

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

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

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

Процедура КП_ДвоичныеДанныеТелаЗапросаОчистить(Кнопка)
	
	ЭтаФорма.ТелоЗапросаДвоичныеДанные = Неопределено;
	
КонецПроцедуры

Процедура КП_ЗаголовкиЗапросаОчистить(Кнопка)
	
	ЗаголовкиЗапроса.Очистить();
	
КонецПроцедуры

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

Процедура СформироватьЗапросOAuth2Нажатие(Элемент)
	
	Данные = Новый Структура("client_id, client_secret, scope, grant_type", OAuth2_КлючКлиента, OAuth2_СекретКлиента, OAuth2_Scope, "client_credentials");
	OAuth2_СервисЛ = OAuth2_Сервис;
	ЭлементыФормы.ДеревоЗапросов.ДобавитьСтроку();
	мТекущаяСтрокаДереваЗапросов.Наименование = ирОбщий.АвтоУникальноеИмяВКоллекцииЛкс(ирОбщий.РодительСтрокиДереваЛкс(мТекущаяСтрокаДереваЗапросов).Строки, "Авторизация OAuth2 ", "Наименование", Ложь);
	ЗагрузитьКонечныйЗапрос(OAuth2_СервисЛ);
	ЭтаФорма.МетодЗапроса = "POST";
	УстановитьГенерируемыйЗаголовокЗапроса("Content-Type", "application/json");
	УстановитьТелоЗапросаСтрока(ирОбщий.ОбъектВСтрокуJSONЛкс(Данные));
	ОбработкаПрерыванияПользователя();
	КоманднаяПанельВыполнениеВыполнитьЗапрос();
	
КонецПроцедуры

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

Процедура КонечныйURLДекодированныйПриИзменении(Элемент)
	
	ЗагрузитьКонечныйЗапрос(КонечныйURLДекодированный, Ложь);
	
КонецПроцедуры

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

Процедура Надпись6Нажатие(Элемент)
	
	ЗапуститьПриложение(КонечныйURL);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ДействияФормыСгенерироватьПрограммныйКод(Кнопка)
	
	Текст = "";
	ПортВременный = КонечныйПорт(ПортЗапроса, ИспользоватьЗащищенноеСоединение);
	АдресРесурсаСПараметрами = АдресРесурсаСПараметрами();
	Если ИсточникТелаЗапроса = "ДанныеФормыЗапроса" Тогда
		СформироватьТелоЗапросаИзДанныхФормы();
	КонецЕсли; 
	Если КукиЗапроса.Количество() > 0 Тогда
		СформироватьЗаголовокКуки();
	КонецЕсли;
	Текст = Текст + "ИнтернетПрокси = Новый ИнтернетПрокси(" + ?(Не СобственныйПрокси, "ИСТИНА", "ЛОЖЬ") + ");";
	Если СобственныйПрокси Тогда
		СобственныеПрокси = ирОбщий.ВосстановитьЗначениеЛкс("ИнтернетПрокси");
		Протокол = ПротоколЗапроса();
		Если СобственныеПрокси.Свойство(Протокол) Тогда 
			НастройкиПрокси = СобственныеПрокси[Протокол];
			Если ЗначениеЗаполнено(НастройкиПрокси.Сервер) Тогда
				Текст = Текст + "
				|ИнтернетПрокси.Установить(""" + Протокол + """, """ + НастройкиПрокси.Сервер + """, " + XMLСтрока(НастройкиПрокси.Порт) + ", """ + НастройкиПрокси.Пользователь 
					+ """, """ + НастройкиПрокси.Пароль + """, " + ?(НастройкиПрокси.АутентификацияОС, "ИСТИНА", "ЛОЖЬ") + ");";
			КонецЕсли; 
		КонецЕсли;
	КонецЕсли; 
	Текст = Текст + "
	|СерверЗапроса = """ + СерверЗапроса + """;
	|ПортВременный = " + XMLСтрока(ПортВременный) + ";
	|ПользовательЗапроса = """ + ПользовательЗапроса + """;
	|ПарольЗапроса = """ + ПарольЗапроса + """;
	|ТаймаутЗапроса = " + XMLСтрока(ТаймаутЗапроса) + ";
	|ЗащищенноеСоединение = " + ?(ИспользоватьЗащищенноеСоединение, "Новый ЗащищенноеСоединениеOpenSSL()", "Неопределено") + ";
	|АутентификацияОС = " + ?(АутентификацияОС, "ИСТИНА", "ЛОЖЬ") + ";
	|СоединениеHTTP = Новый HTTPСоединение(СерверЗапроса, ПортВременный, ПользовательЗапроса, ПарольЗапроса, ИнтернетПрокси, ТаймаутЗапроса, ЗащищенноеСоединение, АутентификацияОС);
	|АдресРесурсаСПараметрами = """ + АдресРесурсаСПараметрами + """;
	|ЗапросHTTP = Новый HTTPЗапрос(АдресРесурсаСПараметрами);";
	Если ЭлементыФормы.ПанельЗапрос.Страницы.ТелоЗапроса.Доступность Тогда
		Если ИсточникТелаЗапроса = "ДанныеФормыЗапроса" Или ИсточникТелаЗапроса = "ТелоЗапросаСтрока" Тогда
			Текст = Текст + "
			|ТелоЗапросаСтрока = " + ирОбщий.ТекстВВыражениеВстроенногоЯзыкаЛкс(ТелоЗапросаСтрока()) + ";
			|КодировкаЗапроса = """ + КодировкаЗапроса + """;
			|ИспользоватьBOMЗапроса = " + ?(ИспользоватьBOM, "ИспользованиеByteOrderMark.Авто", "ИспользованиеByteOrderMark.НеИспользовать") + ";
			|ЗапросHTTP.УстановитьТелоИзСтроки(ТелоЗапросаСтрока, КодировкаЗапроса, ИспользоватьBOMЗапроса);";
		Иначе
			Текст = Текст + "
			|ЗапросHTTP.УстановитьТелоИзДвоичныхДанных(ТелоЗапросаДвоичныеДанные);";
		КонецЕсли; 
	КонецЕсли; 
	Для Каждого ЗаголовокЗапроса Из ЗаголовкиЗапроса Цикл
		Текст = Текст + "
		|ЗапросHTTP.Заголовки.Вставить(""" + ЗаголовокЗапроса.Имя + """, " + ирОбщий.ТекстВВыражениеВстроенногоЯзыкаЛкс(ЗаголовокЗапроса.Значение) + ");";
	КонецЦикла;
	Текст = Текст + "
	|ОтветHTTP = СоединениеHTTP.ВызватьHTTPМетод(""" + МетодЗапроса + """, ЗапросHTTP);
	|КодСостояния = ОтветHTTP.КодСостояния;
	|ТелоОтветаСтрока = ОтветHTTP.ПолучитьТелоКакСтроку();
	|ТелоОтветаДвоичныеДанные = ОтветHTTP.ПолучитьТелоКакДвоичныеДанные();";
	Если ЗначениеЗаполнено(РегулярноеВыражение) Тогда
		Если ИсточникСтрокиДляПоиска = "<Тело>" Тогда
			Текст = Текст + "
			|ТекстГдеИскать = ТелоОтветаСтрока;";
		Иначе
			Текст = Текст + "
			|ТекстГдеИскать = ОтветHTTP.Заголовки[" + ИсточникСтрокиДляПоиска + "];";
		КонецЕсли; 
		Текст = Текст + "
		|мРегВыражение = Новый COMОбъект(""VBScript.RegExp"");
		|мРегВыражение.Global = Ложь;
		|мРегВыражение.IgnoreCase = Истина;
		|мРегВыражение.Pattern = """ + РегулярноеВыражение + """;
		|Вхождения = мРегВыражение.НайтиВхождения(ТекстГдеИскать);
		|Если Вхождения.Количество() > 0 Тогда
		|	Если Вхождения[0].SubMatches().Count = 0 Тогда
		|		РезультатПоиска = Вхождения.Item(0).Value;
		|	Иначе
		|		РезультатПоиска = Вхождения.Item(0).SubMatches(0);
		|	КонецЕсли; 
		|КонецЕсли;";
	КонецЕсли; 
	ирОбщий.ОперироватьСтруктуройЛкс(Текст);
	
КонецПроцедуры

Функция АдресРесурсаСПараметрами()
	
	Результат = ОбновитьКонечныйURL(Ложь);
	Возврат Результат;

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

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

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

Процедура КПТелоОтветаФорматироватьJSON(Кнопка)
	
	УстановитьТелоОтветаСтрока(ирОбщий.ФорматироватьТекстJsonЛкс(ТелоОтветаСтрока));

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

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

Процедура ИспользоватьДляВсехМетодовПриИзменении(Элемент)
	
	ОбновитьКонечныйURL();
	
КонецПроцедуры

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

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

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

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

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

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

Процедура ДействияФормыДобавитьИзКонфигурации(Кнопка)
	
	ДеревоШаблонов = Новый ДеревоЗначений;
	ДеревоШаблонов.Колонки.Добавить("HTTPСервис");
	ДеревоШаблонов.Колонки.Добавить("ШаблонURL");
	ДеревоШаблонов.Колонки.Добавить("HTTPМетод");
	Для Каждого ОбъектМД Из Метаданные.HTTPСервисы Цикл
		#Если Сервер И Не Сервер Тогда
			ОбъектМД = Метаданные.HTTPСервисы.task1;
		#КонецЕсли
		СтрокаСервиса = ДеревоШаблонов.Строки.Добавить();
		СтрокаСервиса.HTTPСервис = ОбъектМД.Имя;
		Для Каждого ШаблонМД Из ОбъектМД.ШаблоныURL Цикл
			#Если Сервер И Не Сервер Тогда
				ШаблонМД = Метаданные.HTTPСервисы.task1.ШаблоныURL.ШаблонURL1;
			#КонецЕсли
			СтрокаШаблона = СтрокаСервиса.Строки.Добавить();
			СтрокаШаблона.HTTPСервис = ОбъектМД.Имя;
			СтрокаШаблона.ШаблонURL = ШаблонМД.Имя;
			Для Каждого МетодМД Из ШаблонМД.Методы Цикл
				#Если Сервер И Не Сервер Тогда
					МетодМД = Метаданные.HTTPСервисы.task1.ШаблоныURL.ШаблонURL1.Методы.Nope;
				#КонецЕсли
				СтрокаМетода = СтрокаШаблона.Строки.Добавить();
				СтрокаМетода.HTTPСервис = ОбъектМД.Имя;
				СтрокаМетода.ШаблонURL = ШаблонМД.Имя;
				СтрокаМетода.HTTPМетод = "" + МетодМД.HTTPМетод;
			КонецЦикла;
		КонецЦикла;
	КонецЦикла;
	РезультатВыбора = ДеревоШаблонов.ВыбратьСтроку();
	Если Ложь
		Или РезультатВыбора = Неопределено
		Или Не ЗначениеЗаполнено(РезультатВыбора.ШаблонURL)
	Тогда
		Возврат;
	КонецЕсли; 
	ЭлементыФормы.ДеревоЗапросов.ДобавитьСтроку();
	ЭлементыФормы.ДеревоЗапросов.ЗакончитьРедактированиеСтроки(Ложь);
	ЭтаФорма.СерверЗапроса = ИмяСервераПриложений();
	Если Не ЗначениеЗаполнено(СерверЗапроса) Тогда
		ЭтаФорма.СерверЗапроса = "localhost";
	КонецЕсли; 
	ЭтаФорма.ПользовательЗапроса = ИмяПользователя();
	ОбъектМД = Метаданные.HTTPСервисы[РезультатВыбора.HTTPСервис];
	#Если Сервер И Не Сервер Тогда
		ОбъектМД = Метаданные.HTTPСервисы.task1;
	#КонецЕсли
	ШаблонМД = ОбъектМД.ШаблоныURL[РезультатВыбора.ШаблонURL];
	#Если Сервер И Не Сервер Тогда
		ШаблонМД = Метаданные.HTTPСервисы.task1.ШаблоныURL.ШаблонURL1;
	#КонецЕсли
	Если ЗначениеЗаполнено(РезультатВыбора.HTTPМетод) Тогда
		ЭтаФорма.МетодЗапроса = РезультатВыбора.HTTPМетод;
	КонецЕсли; 
	ИмяБД = НСтр(СтрокаСоединенияИнформационнойБазы(), "Ref");
	Если Не ЗначениеЗаполнено(ИмяБД) Тогда
		ИмяБД = "DBName";
	КонецЕсли; 
	ЭтаФорма.АдресРесурса = АдресРесурса + ИмяБД + "/hs/" + ОбъектМД.КорневойURL + ШаблонМД.Шаблон;
	Фрагменты = ирОбщий.СтрРазделитьЛкс(ШаблонМД.Шаблон, "/");
	Для Каждого Фрагмент Из Фрагменты Цикл
		Если Лев(Фрагмент, 1) = "{" Тогда
			ПараметрАдреса = ПараметрыURL.Добавить();
			ПараметрАдреса.Имя = Фрагмент;
			ПараметрАдреса.Значение = "-";
		КонецЕсли; 
	КонецЦикла;
	ОбновитьКонечныйURL(); 
	НастроитьЭлементыФормы();
	
КонецПроцедуры

Функция ИмяСервераПриложений()
	
	Возврат ирОбщий.ПервыйФрагментЛкс(НСтр(СтрокаСоединенияИнформационнойБазы(), "Srvr"), ":");

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

Процедура ПанельТелоЗапросаСтрокаПриСменеСтраницы(Элемент, ТекущаяСтраница)
	
	Перем ПозицияВТексте, КонечнаяКолонка, КонечнаяСтрока, НачальнаяКолонка, НачальнаяСтрока, НачальнаяПозиция, КонечнаяПозиция;
	
	Если ЭлементыФормы.ПанельТелоЗапросаСтрока.ТекущаяСтраница = ЭлементыФормы.ПанельТелоЗапросаСтрока.Страницы.JSON Тогда
		Если мРедакторЗапросаJSON = Неопределено Тогда
			Возврат;
		КонецЕсли;
		ЭлементыФормы.РежимДереваТелаЗапросаJSON.Видимость = Истина;
		ЭлементыФормы.ТелоЗапросаСтрока.ПолучитьГраницыВыделения(НачальнаяСтрока, НачальнаяКолонка, КонечнаяСтрока, КонечнаяКолонка);
		ПозицияВТексте = мРедакторЗапросаJSON.getTextSelection(НачальнаяПозиция, КонечнаяПозиция); 
		мРедакторЗапросаJSON.setText(ТелоЗапросаСтрока);
		мРедакторЗапросаJSON.focus();
		Если ПозицияВТексте <> Неопределено Тогда
			ПозицияВТексте.start.row = НачальнаяСтрока;
			ПозицияВТексте.start.column = НачальнаяКолонка;
			ПозицияВТексте.end.row = КонечнаяСтрока;
			ПозицияВТексте.end.column = КонечнаяКолонка;
			мРедакторЗапросаJSON.setTextSelection(ПозицияВТексте.start, ПозицияВТексте.end); 
		КонецЕсли; 
	Иначе
		ЭлементыФормы.РежимДереваТелаЗапросаJSON.Видимость = Ложь;
		Если мРедакторЗапросаJSON <> Неопределено Тогда
			ПозицияВТексте = мРедакторЗапросаJSON.getTextSelection(НачальнаяПозиция, КонечнаяПозиция);
			ЭтаФорма.ТелоЗапросаСтрока = мРедакторЗапросаJSON.getText();
			Если ПозицияВТексте <> Неопределено Тогда
				ЭлементыФормы.ТелоЗапросаСтрока.УстановитьГраницыВыделения(ПозицияВТексте.start.row, ПозицияВТексте.start.column, ПозицияВТексте.end.row, ПозицияВТексте.end.column);
			КонецЕсли; 
		КонецЕсли; 
		//ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ТелоЗапросаСтрока;
	КонецЕсли;
	
КонецПроцедуры

Процедура ТелоЗапросаJSONДокументСформирован(Элемент)

	мРедакторЗапросаJSON = Элемент.Документ.defaultView.Init();
	ирКлиент.РедакторJSON_ИнициироватьЛкс(мРедакторЗапросаJSON);
	ЭлементыФормы.ПанельТелоЗапросаСтрока.ТекущаяСтраница = ЭлементыФормы.ПанельТелоЗапросаСтрока.ТекущаяСтраница; // Вызовет ПриСменеСтраницы

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

Процедура ТелоОтветаJSONДокументСформирован(Элемент)
	
	мРедакторОтветаJSON = Элемент.Документ.defaultView.Init();
	ирКлиент.РедакторJSON_ИнициироватьЛкс(мРедакторОтветаJSON);
	мРедакторОтветаJSON.setText(ТелоОтветаСтрока);
	мРедакторОтветаJSON.aceEditor.setReadOnly(Истина);
	
КонецПроцедуры

Процедура АвтонаименованиеПриИзменении(Элемент = Неопределено)
	
	Если Автонаименование Тогда
		ОбновитьКонечныйURL();
	КонецЕсли; 
	
КонецПроцедуры

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

Процедура ТелоЗапросаJSONonclick(Элемент, pEvtObj)
	
	Если Элемент.ИзменяетДанные И pEvtObj.srcElement.id = "onChange" Тогда
		ЭтаФорма.Модифицированность = Истина;
	КонецЕсли; 
	
КонецПроцедуры

Процедура РежимДереваТелаЗапросаJSONПриИзменении(Элемент = Неопределено)
	
	ирКлиент.ПереключитьРежимДереваРедактораJSONЛкс(мРедакторЗапросаJSON, РежимДереваТелаЗапросаJSON);

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

Процедура РежимДереваТелаОтветаJSONПриИзменении(Элемент = Неопределено)
	
	ирКлиент.ПереключитьРежимДереваРедактораJSONЛкс(мРедакторОтветаJSON, РежимДереваТелаОтветаJSON);
	
КонецПроцедуры

Процедура ДеревоЗапросовНаименованиеПриИзменении(Элемент)
	
	Если Не ЗначениеЗаполнено(Элемент.Значение) Тогда
		Автонаименование = Истина;
	Иначе
		Автонаименование = Ложь;
	КонецЕсли; 
	АвтонаименованиеПриИзменении();
	
КонецПроцедуры

Процедура КПТелоЗапросаФорматироватьXML(Кнопка)
	
	УстановитьТелоЗапросаСтрока(ирОбщий.ФорматироватьТекстXMLЛкс(ТелоЗапросаСтрока()));

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

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

Процедура ДействияФормыИмпортироватьИзPostman(Кнопка)
	
	Файл = ирКлиент.ВыбратьФайлЛкс(, "json");
	Если Файл = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	Файл = Новый Файл(Файл);
	Если Не Файл.Существует() Тогда 
		Возврат;
	КонецЕсли; 
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.Прочитать(Файл.ПолноеИмя);
	Текст = ТекстовыйДокумент.ПолучитьТекст();
	ОбъектИмпорта = ирОбщий.ОбъектИзСтрокиJSONЛкс(Текст, Истина);
	ТипМассив = Тип("Массив");
	ТипСоответствие = Тип("Соответствие");
	ТипСтрока = Тип("Строка");
	Если ТипЗнч(ОбъектИмпорта) <> ТипСоответствие Тогда
		ирОбщий.СообщитьЛкс(ирОбщий.СтрШаблонИменЛкс("неожиданный тип объекта импорта %1",, ТипЗнч(ОбъектИмпорта)));
		Возврат;
	КонецЕсли;
	ОписаниеОбъектаИмпорта = ОбъектИмпорта["info"];
	Если ОписаниеОбъектаИмпорта = Неопределено Тогда
		ОписаниеОшикби = "у объекта импорта отсутствует поле ""info""";
		Возврат;
	КонецЕсли;
	Если ТипЗнч(ОписаниеОбъектаИмпорта) <> ТипСоответствие Тогда
		ирОбщий.СообщитьЛкс(ирОбщий.СтрШаблонИменЛкс("неожиданный тип поля ""info"" объекта импорта %1",, ТипЗнч(ОписаниеОбъектаИмпорта)));
		Возврат;
	КонецЕсли;
	Если ОписаниеОбъектаИмпорта["schema"] <> "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" Тогда
		ирОбщий.СообщитьЛкс("неожиданная версия схемы объекта импорта (ожидается 2.1.0)");
		Возврат;
	КонецЕсли;
	ЗапросыФайла = Новый СписокЗначений;
	СобратьЭлементыИмпортаPostman(ОбъектИмпорта, ЗапросыФайла);
	ПеременныеФайла = ОбъектИмпорта["variable"];
	ЗначенияШаблонов = Новый Соответствие;
	ПеременныеИмпорта = ОбъектИмпорта["variable"];
	Если ПеременныеИмпорта <> Неопределено Тогда
		Для Каждого ПеременнаяИмпорта Из ПеременныеИмпорта Цикл
			ЗначенияШаблонов.Вставить(ПеременнаяИмпорта["key"], ПеременнаяИмпорта["value"]);
		КонецЦикла;
	КонецЕсли;
	Если ЗапросыФайла.Количество() = 1 Тогда
		ЗапросФайла = ЗапросыФайла[0].Значение;
	Иначе
		ЗапросФайла = ЗапросыФайла.ВыбратьЭлемент("Выберите запрос для импорта");
		Если ЗапросФайла = Неопределено Тогда
			Возврат;
		КонецЕсли; 
		ЗапросФайла = ЗапросФайла.Значение;
	КонецЕсли; 
	ЗапросФайла = ЗапросФайла["request"];
	ЭлементСписка = ЭлементыФормы.МетодЗапроса.СписокВыбора.НайтиПоЗначению(ЗапросФайла["method"]);
	Если ЭлементСписка = Неопределено Тогда
		ирОбщий.СообщитьЛкс(ирОбщий.СтрШаблонИменЛкс("неожиданный метод запроса %1",, ЗапросФайла["method"]));
		Возврат;
	КонецЕсли;
	ЭлементыФормы.ДеревоЗапросов.ДобавитьСтроку();
	ЭлементыФормы.ДеревоЗапросов.ЗакончитьРедактированиеСтроки(Ложь);
	ЭтаФорма.МетодЗапроса = ЭлементСписка.Значение;
	ИдентификаторРесурсаИмпорт = ЗначениеПеременнойИмпортаPostman(ЗапросФайла["url"]["raw"], ЗначенияШаблонов);
	Если ЗначениеЗаполнено(ИдентификаторРесурсаИмпорт)  Тогда
		ЗагрузитьКонечныйЗапрос(ИдентификаторРесурсаИмпорт, Ложь);
	КонецЕсли;
	АвторизацияИмпорт = Новый Структура("Тип, Пользователь, Пароль, Токен", ЭлементыФормы.ТипАвторизации.СписокВыбора[0], "", "", "");
	ОбъектАвторизации = ЗапросФайла["auth"];
	Если ОбъектАвторизации <> Неопределено Тогда
		ТипАвторизацииИмпорт = ВРег(ОбъектАвторизации["type"]);
		Для Каждого ЭлементТиповАвторизации Из ЭлементыФормы.ТипАвторизации.СписокВыбора Цикл
			Если ВРег(ЭлементТиповАвторизации.Значение) = ТипАвторизацииИмпорт Тогда
				АвторизацияИмпорт.Тип = ЭлементТиповАвторизации;
				ПараметрыАвторизацииИмпорт = ОбъектАвторизации[ОбъектАвторизации["type"]];
				Для Каждого ПараметрАвторизацииИмпорт Из ПараметрыАвторизацииИмпорт Цикл
					ИмяПараметраАвторизацииИмпорт = НРег(ПараметрАвторизацииИмпорт["key"]);
					Если ИмяПараметраАвторизацииИмпорт = "password" Тогда
						АвторизацияИмпорт.Пароль = ЗначениеПеременнойИмпортаPostman(ПараметрАвторизацииИмпорт["value"], ЗначенияШаблонов);
					ИначеЕсли ИмяПараметраАвторизацииИмпорт = "username" Тогда
						АвторизацияИмпорт.Пользователь = ЗначениеПеременнойИмпортаPostman(ПараметрАвторизацииИмпорт["value"], ЗначенияШаблонов);
					ИначеЕсли ИмяПараметраАвторизацииИмпорт = "token" Тогда
						АвторизацияИмпорт.Токен = ЗначениеПеременнойИмпортаPostman(ПараметрАвторизацииИмпорт["value"], ЗначенияШаблонов);
					КонецЕсли;
				КонецЦикла;
				Прервать;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	Для Каждого ЭлементЗаголовок Из ЗапросФайла["header"] Цикл
		ЗаголовокЗапроса = ЗаголовкиЗапроса.Добавить();
		ЗаголовокЗапроса.Имя = ЗначениеПеременнойИмпортаPostman(ЭлементЗаголовок["key"], ЗначенияШаблонов);
		ЗаголовокЗапроса.Значение = ЗначениеПеременнойИмпортаPostman(ЭлементЗаголовок["value"], ЗначенияШаблонов);
	КонецЦикла;
	ОбъектТелаЗапроса = ЗапросФайла["body"];
	Если ОбъектТелаЗапроса <> Неопределено Тогда
		ТипОбъектаТелаЗапроса = ОбъектТелаЗапроса["mode"];
		Если ТипОбъектаТелаЗапроса = "formdata" Тогда // Form-data
			ЭтаФорма.ИсточникТелаЗапроса = "ДанныеФормыЗапроса";
			ЗначениеТелаЗапросаИмпорта = Новый Массив;
			Для Каждого ЭлементТелаЗапроса Из ОбъектТелаЗапроса[ТипОбъектаТелаЗапроса] Цикл 
				ЭлементТелаЗапросаИмпорта = Новый Структура("Активно, Ключ, Тип, Значение", Истина, ЗначениеПеременнойИмпортаPostman(ЭлементТелаЗапроса["key"], ЗначенияШаблонов));
				Если ЭлементТелаЗапроса["type"] = "file" Тогда
					ЭлементТелаЗапросаИмпорта.Тип = ЭлементыФормы.ДанныеФормыТип.СписокВыбора[1]; 
					ЭлементТелаЗапросаИмпорта.Значение = ПутьКФайлуИзПараметраPostman(ЗначениеПеременнойИмпортаPostman(ЭлементТелаЗапроса["src"], ЗначенияШаблонов));
				Иначе
					ЭлементТелаЗапросаИмпорта.Тип = ЭлементыФормы.ДанныеФормыТип.СписокВыбора[0]; 
					ЭлементТелаЗапросаИмпорта.Значение = ЗначениеПеременнойИмпортаPostman(ЭлементТелаЗапроса["value"], ЗначенияШаблонов);
				КонецЕсли;
				ЗначениеТелаЗапросаИмпорта.Добавить(ЭлементТелаЗапросаИмпорта);
			КонецЦикла;
			ДанныеФормыЗапроса.Очистить();
			Для Каждого ЭлементТелаЗапросаИмпорт Из ЗначениеТелаЗапросаИмпорта Цикл
				ЗаполнитьЗначенияСвойств(ДанныеФормыЗапроса.Добавить(), ЭлементТелаЗапросаИмпорт); // !!!!!!!
			КонецЦикла;
		ИначеЕсли ТипОбъектаТелаЗапроса = "raw" Тогда
			ЭтаФорма.ИсточникТелаЗапроса = "Текст";
			ЗначениеПараметра = ЗначениеПеременнойИмпортаPostman(ОбъектТелаЗапроса[ТипОбъектаТелаЗапроса], ЗначенияШаблонов);
			УстановитьТелоЗапросаСтрока(ЗначениеПараметра);
		ИначеЕсли ТипОбъектаТелаЗапроса = "file" Тогда
			ЭтаФорма.ИсточникТелаЗапроса = "ДвоичныеДанные";
			ЗначениеПараметра = ПутьКФайлуИзПараметраPostman(ЗначениеПеременнойИмпортаPostman(ОбъектТелаЗапроса[ТипОбъектаТелаЗапроса]["src"], ЗначенияШаблонов));
			ЭтаФорма.ТелоЗапросаДвоичныеДанные = Новый ДвоичныеДанные(ЗначениеПараметра);
		КонецЕсли;
	КонецЕсли;
	ИдентификаторРесурса = ИдентификаторРесурсаИмпорт;
	Если АвторизацияИмпорт.Тип <> ЭлементыФормы.ТипАвторизации.СписокВыбора[0].Значение Тогда
		ЭтаФорма.ПользовательЗапроса = АвторизацияИмпорт.Пользователь;
		ЭтаФорма.ПарольЗапроса = АвторизацияИмпорт.Пароль;
		ТокенАвторизации = АвторизацияИмпорт.Токен;
	КонецЕсли;

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

Процедура СобратьЭлементыИмпортаPostman(Знач ОбъектИмпорта, ЗапросыИмпорта)
	Если ОбъектИмпорта["item"] <> Неопределено Тогда
		Для Каждого ЭлементИмпорта Из ОбъектИмпорта["item"] Цикл
			СобратьЭлементыИмпортаPostman(ЭлементИмпорта, ЗапросыИмпорта);
		КонецЦикла;
	ИначеЕсли ОбъектИмпорта["request"] <> Неопределено Тогда
		ЗапросыИмпорта.Добавить(ОбъектИмпорта, ОбъектИмпорта["name"]);
	КонецЕсли;
КонецПроцедуры

Функция ЗначениеПеременнойИмпортаPostman(Знач ОбрабатываемаяСтрока, Знач ЗначенияШаблонов)
	Перем Результат;
	Результат = ОбрабатываемаяСтрока;
	ПозицияНачалаШаблона = Найти(Результат, "{{");
	Пока ПозицияНачалаШаблона > 0 Цикл
		ПозицияОкончанияШаблона = ирОбщий.СтрНайтиЛкс(Результат, "}}", , ПозицияНачалаШаблона);
		Если ПозицияОкончанияШаблона = 0 Тогда
			Прервать;
		КонецЕсли;
		ИмяШаблона = Сред(Результат, ПозицияНачалаШаблона + 2, ПозицияОкончанияШаблона - ПозицияНачалаШаблона - 2);
		ЗначениеШаблона = ЗначенияШаблонов.Получить(ИмяШаблона);
		Если ЗначениеЗаполнено(ЗначениеШаблона) Тогда
			Результат = СтрЗаменить(Результат, "{{" + ИмяШаблона + "}}", ЗначениеШаблона);
		КонецЕсли;
		ПозицияНачалаШаблона = ирОбщий.СтрНайтиЛкс(Результат, "{{", , ПозицияНачалаШаблона + 1);
	КонецЦикла;
	Возврат Результат;
КонецФункции

Функция ПутьКФайлуИзПараметраPostman(Знач ПутьКФайлу)
	Перем Результат;
	Результат = ПутьКФайлу;
	Если Лев(Результат, 1) <> "/" Тогда
		Возврат Результат;
	КонецЕсли;
	ПозицияДвоеточия = Найти(Результат, ":");
	Если ПозицияДвоеточия = 0 Тогда
		Возврат Результат;
	КонецЕсли;
	ПозицияВторогоСлеша = ирОбщий.СтрНайтиЛкс(Результат, "/", , 2);
	Если ПозицияДвоеточия < ПозицияВторогоСлеша Тогда
		Результат = СтрЗаменить(Сред(Результат, 2), "/", "\");
	КонецЕсли;
	Возврат Результат;
КонецФункции

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

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

Процедура СобытияВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
	СобытияАлгоритмНачалоВыбора();
КонецПроцедуры 

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

ирКлиент.ИнициироватьФормуЛкс(ЭтаФорма, "Обработка.ирКонсольHTTPЗапросов.Форма.Форма");

мПлатформа = ирКэш.Получить();
мСтрокаЗагруженаВКонсоль = Ложь;
мСтруктураВосстановления = ирКлиент.ПолучитьСтруктуруВосстановленияКонсолиЛкс("irHttpConsole");
мИменаПростыхСвойствЗапроса = "МетодЗапроса, СерверЗапроса, ПортЗапроса, АдресРесурса, ПользовательЗапроса, ИспользоватьЗащищенноеСоединение, ТипАвторизации, АутентификацияОС, ТаймаутЗапроса, СобственныйПрокси,
|ХранитьПароль, Автоперенаправление, МаксимальныйРазмерОтвета, КодировкаЗапроса, ИспользоватьBOM, ТелоЗапросаСтрока, ТелоЗапросаДвоичныеДанные, РегулярноеВыражение, РезультатПоиска,
|СтатусПоиска, ИсточникСтрокиДляПоиска, ИсточникТелаЗапроса, OAuth2_Сервис, OAuth2_КлючКлиента, OAuth2_СекретКлиента, OAuth2_Scope, ИспользоватьДляВсехМетодов, Автонаименование";
ирОбщий.ГотовитьТаблицуСобытийРедактораЛкс(ЭтаФорма);
