// +++.КЛАСС.ПолеТекстаПрограммы
Перем ПоляТекстовПрограммы;
// ---.КЛАСС.ПолеТекстаПрограммы

Перем ПолеТекстаЗапроса Экспорт;
Перем мИмяОткрытогоФайла;           // имя файла
Перем мТекущаяСтрокаДереваЗапросов; // см. ДеревоЗапросов.Строки[0]
Перем мРежимФормыДляЗаголовка;      // Не меняется после открытия формы

Перем мРезультатЗапроса; // РезультатЗапроса 
Перем мРезультатПакета Экспорт; // Массив[РезультатЗапроса] (только для запросов 1С)
Перем мРезультатПоИменам;              
Перем мВыборкаРезультата;

Перем мКэшПустыхЗначений;

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

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

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

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

	#Если Сервер И Не Сервер Тогда
	    Компонента = Обработки.ирКлсПолеТекстаПрограммы.Создать();
	#КонецЕсли
	ирОбщий.ИнициироватьГлобальныйКонтекстПодсказкиЛкс(Компонента);
	Если Компонента = ПоляТекстовПрограммы.КодОбработкиРезультата Тогда
		ТаблицаТипов = Неопределено;
		ТипЗначенияПеременной = Неопределено;
		Если ТипЗнч(мВыборкаРезультата) = Тип("COMОбъект") Тогда
			ТаблицаТипов = мПлатформа.НоваяТаблицаТипов();
			СтруктураТипа = ТаблицаТипов.Добавить();;
			СтруктураТипа.ИмяОбщегоТипа = "ISWbemObjectSet {WbemScripting.SwbemLocator}";
			СтруктураТипа.Метаданные = мВыборкаРезультата;
		Иначе
			МассивТипов = Новый Массив;
			МассивТипов.Добавить(ТипЗнч(мРезультатЗапроса));
			ТипЗначенияПеременной = Новый ОписаниеТипов(МассивТипов);
		КонецЕсли; 
		Компонента.ДобавитьСловоЛокальногоКонтекста("мРезультатЗапроса", , ТипЗначенияПеременной, мРезультатЗапроса,, мРезультатЗапроса, ТаблицаТипов);
		Компонента.ДобавитьСловоЛокальногоКонтекста("мРезультатПакета", , Новый ОписаниеТипов("Массив"), мРезультатПакета,, мРезультатЗапроса);
		Компонента.ДобавитьСловоЛокальногоКонтекста("мРезультатПоИменам", , Новый ОписаниеТипов("Структура"), мРезультатПоИменам,, мРезультатЗапроса);
	ИначеЕсли Компонента = ПоляТекстовПрограммы.КодПередВыполнениемЗапроса Тогда
	    ДобавитьПараметрыВКомпонентуПередВыполнениемЗапроса(Компонента);
		Компонента.ДобавитьСловоЛокальногоКонтекста("вПолучитьПараметр", "Метод", Новый ОписаниеТипов);
	ИначеЕсли Компонента = ПоляТекстовПрограммы.КодОбработкиСтрокиРезультата Тогда
		//ЭкземплярКомпоненты.ОчиститьТаблицуСловЛокальногоКонтекста();
		ТаблицаТипов = Неопределено;
		ТипЗначенияПеременной = Неопределено;
		МетаданныеСлова = Неопределено;
		Попытка
			Пустышка = мВыборкаРезультата.Count;
			ЭтоWMI = Истина;
		Исключение
			ЭтоWMI = Ложь;
		КонецПопытки;
		Если ЭтоWMI Тогда
			ТаблицаТипов = мПлатформа.НоваяТаблицаТипов();
			СтруктураТипа = ТаблицаТипов.Добавить();;
			СтруктураТипа.ИмяОбщегоТипа = "ISWbemObject {WbemScripting.SwbemLocator}";
			Для Каждого МетаданныеСлова Из мВыборкаРезультата Цикл
				СтруктураТипа.Метаданные = МетаданныеСлова;
				Прервать;
			КонецЦикла;
		КонецЕсли; 
		Если ТаблицаТипов = Неопределено Тогда
			МассивТипов = Новый Массив;
			МассивТипов.Добавить(Тип("СтрокаТаблицыЗначений"));
			ТипЗначенияПеременной = Новый ОписаниеТипов(МассивТипов);
			МетаданныеСлова = РезультатКоллекция;
		КонецЕсли; 
		Компонента.ДобавитьСловоЛокальногоКонтекста("СтрокаРезультата", , ТипЗначенияПеременной, МетаданныеСлова,,, ТаблицаТипов);
		ТипЗначенияПеременной = Новый ОписаниеТипов("Булево");
		Компонента.ДобавитьСловоЛокальногоКонтекста("ЭтоПервыйЭлемент", , ТипЗначенияПеременной);
		Компонента.ДобавитьСловоЛокальногоКонтекста("ЭтоПоследнийЭлемент", , ТипЗначенияПеременной);
	ИначеЕсли Компонента = ПолеТекстаЗапроса Тогда
		ВычислитьПараметрыЗапроса(, Ложь);
		ОбновитьПараметрыКонтекстнойПодсказкиТекстаЗапроса();
		ПрефиксПараметра = Компонента.ПрефиксПараметра();
		//КонецЕсли;
		//МаркерЭкземпляра = КомпонентаТекстаЗапроса.ИмяКласса + "_" + КомпонентаТекстаЗапроса.Имя;
		//Если Лев(Кнопка.Имя, СтрДлина(МаркерЭкземпляра)) = МаркерЭкземпляра Тогда
			Компонента.ОчиститьТаблицуСловЛокальногоКонтекста();
			Для Каждого СтрокаТаблицыПараметра Из Компонента.ДоступныеТаблицы.НайтиСтроки(Новый Структура("Тип", "Параметр")) Цикл
				Компонента.ДоступныеТаблицы.Удалить(СтрокаТаблицыПараметра);
			КонецЦикла;
			Для Каждого СтрокаПараметра Из Параметры Цикл
				//Компонента.ДобавитьСловоЛокальногоКонтекста(ПрефиксПараметра + СтрокаПараметра.ИмяПараметра,, ирОбщий.ОписаниеТиповИзТипаЛкс(ТипЗнч(СтрокаПараметра.Значение)));
				Компонента.ДобавитьСловоЛокальногоКонтекста(ПрефиксПараметра + СтрокаПараметра.ИмяПараметра,,,,, СтрокаПараметра.Значение);
				Если ТипЗнч(СтрокаПараметра.Значение) = Тип("ТаблицаЗначений") Тогда
					ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(Компонента.ДоступныеТаблицы, ПрефиксПараметра + СтрокаПараметра.ИмяПараметра, , "Параметр", СтрокаПараметра.ИмяПараметра);
				КонецЕсли; 
			КонецЦикла;
		//КонецЕсли; 
		Возврат Неопределено;
	КонецЕсли;
	СтруктураПараметров = ПолучитьСтруктуруПараметров();
	Компонента.ДобавитьСловоЛокальногоКонтекста("Параметры", "Свойство", Новый ОписаниеТипов("Структура"), СтруктураПараметров);
	Возврат Неопределено;

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

Функция ОбновитьПараметрыКонтекстнойПодсказкиТекстаЗапроса(ПодключатьсяКМетаданным = Истина)

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

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

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

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

// @@@.КЛАСС.ПолеТекстаПрограммы
Процедура ВнешнееСобытие(Источник, Событие, Данные) Экспорт
	
	Если Не Открыта() Тогда
		Возврат;
	КонецЕсли; 
	ЭкземплярКомпоненты = ТекущаяКомпонентаПоляТекста();
	#Если Сервер И Не Сервер Тогда
	    ЭкземплярКомпоненты = Обработки.ирКлсПолеТекстаПрограммы.Создать();
	#КонецЕсли
	ЭкземплярКомпоненты.ВнешнееСобытиеОбъекта(Источник, Событие, Данные);
	Если Истина
		//И ЭкземплярКомпоненты = ПолеТекстаЗапроса // Почему то в портавном режиме здесь возникала Ложь https://www.hostedredmine.com/issues/966081
		И ЭкземплярКомпоненты = ПолеТекстаЗапроса.ЭтотОбъект 
	Тогда 
		Если мСтруктурноеРедактирование Тогда 
			Если мРедактируемыйУзел = Неопределено Тогда
				ПроверитьВключитьРедактированиеУзлаСтруктурыЗапроса();
			КонецЕсли;
		Иначе
			КодыКлавиш = ирКэш.КодыКлавишЛкс();
			ЛиКомандаНавигации = Ложь
				Или Найти(Данные, КодыКлавиш["CTRL+F3"]) = 1
				Или Найти(Данные, КодыКлавиш["F3"]) = 1
				Или Найти(Данные, КодыКлавиш["F2"]) = 1
				Или Найти(Данные, КодыКлавиш["CTRL+End"]) = 1
				Или Найти(Данные, КодыКлавиш["CTRL+Home"]) = 1
				Или Найти(Данные, КодыКлавиш["Up"]) = 1
				Или Найти(Данные, КодыКлавиш["Down"]) = 1
				Или Найти(Данные, КодыКлавиш["PgUp"]) = 1
				Или Найти(Данные, КодыКлавиш["PgDown"]) = 1;
			#Если Сервер И Не Сервер Тогда
				ОбновитьВедомуюСтруктуруЗапроса();
			#КонецЕсли
			ПодключитьОбработчикОжидания("ОбновитьВедомуюСтруктуруЗапроса", ?(ЛиКомандаНавигации, 0.2, 0.5), Истина);
		КонецЕсли;
	КонецЕсли; 
	
КонецПроцедуры

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

Процедура ПроверитьВключитьРедактированиеУзлаСтруктурыЗапроса()
	
	Если Истина
		И мСтруктурноеРедактирование
		И мТекущаяСтрокаДереваЗапроса <> Неопределено
		И мТекущаяСтрокаДереваЗапроса.Текст <> ПолеТекстаЗапроса.ПолеТекста.ПолучитьТекст() 
	Тогда
		КоманднаяПанельТекстЗапросаИзменитьИлиСохранитьУзелДерева(, Истина);
	КонецЕсли;

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

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

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

Функция ЛиВыражениеПараметра(Знач ТекущееВыражение)
	
	Возврат Ложь
		Или Лев(ТекущееВыражение, 1) = ПолеТекстаЗапроса.ПрефиксПараметра() 
		Или Лев(ТекущееВыражение, 1) = "&";

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Функция ТекущаяКомпонентаПоляТекста(Кнопка = Неопределено)

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

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

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

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

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

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

// Устанавливает текст запроса в текстовом поле
//
// Параметры:
//  Текст - устанавливаемый текст запроса.
//
Процедура УстановитьТекстПоляТекстаЗапроса(Текст)
	
	ПолеТекстаЗапроса.УстановитьТекст(Текст, Истина, Текст);
	
КонецПроцедуры

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

//.
// Возвращаемое значение:
//    Структура - 
Функция ПараметрыADO() Экспорт
	ПараметрыADO = ПолучитьИсточникДанныхADO();
	ПараметрыADO.Вставить("ИспользованиеGWF", ИспользованиеGWF);
	ПараметрыADO.Вставить("СмещениеГодаADO", СмещениеГодаADO);
	ПараметрыADO.Вставить("Типизировать1С", Типизировать1С);
	ПараметрыADO.Вставить("БинарныеВСтроку", БинарныеВСтроку);
	ПараметрыADO.Вставить("РасширенноеПолучениеМетаданных", РасширенноеПолучениеМетаданных);
	Возврат ПараметрыADO;
КонецФункции

//.
// Возвращаемое значение:
//    Структура - 
Функция ПараметрыWMI() Экспорт
	ПараметрыWMI = Новый Структура;
	ПараметрыWMI.Вставить("ТекущийКлассWMI", ТекущийКлассWMI);
	ПараметрыWMI.Вставить("ИмяСервераWMI", ИмяСервераWMI);
	ПараметрыWMI.Вставить("ТочкаПодключенияWMI", ТочкаПодключенияWMI);
	Возврат ПараметрыWMI;
КонецФункции

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

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

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

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

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

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

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

// Подготовка к созданию нового файла запросов
//
// Параметры:
//  Нет.
//
Процедура СоздатьФайл(Отладка = Ложь) Экспорт 

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

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

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

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

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

// Сохраняет дерево запросов в файл
//
// Параметры:
//  ЗапрашиватьСохранение - Булево, *Ложь - признак необходимости предупреждения перед сохранением;
//	ЗапрашиватьИмяФайла - Булево, *Ложь - признак необходимости запроса имени файла.
//
Функция СохранитьВФайл(ЗапрашиватьСохранение = Ложь, ЗапрашиватьИмяФайла = Ложь, Знач ИмяФайла = Неопределено, СброситьМодифицированность = Неопределено, Знач ЭтоФайлВосстановления = Ложь)
	
	Если СброситьМодифицированность = Неопределено Тогда
		СброситьМодифицированность = Не мРежимРедактораЗапроса;
	КонецЕсли; 
	Если ИмяФайла = Неопределено Тогда
		ИмяФайла = мИмяОткрытогоФайла;
	КонецЕсли; 
	
	Если Не ЗакончитьРедактированиеУзла(ЗапрашиватьСохранение) Тогда 
		Возврат Ложь;
	КонецЕсли; 
	СохранитьДанныеТекущейСтрокиДереваЗапросов();
	
	Если Не ЗапрашиватьИмяФайла Тогда
		Если ЗапрашиватьСохранение Тогда
			Если Не Модифицированность Тогда
				Возврат Истина;
			Иначе
				Если мРежимРедактораЗапроса Тогда
					ТекстВопроса = "Применить изменения запроса?";
				Иначе
					ТекстВопроса = "Сохранить текущий файл?";
				КонецЕсли; 
				Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена);
				Если Ответ = КодВозвратаДиалога.Отмена Тогда
					Возврат Ложь;
				ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда
					Возврат Истина;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Если Истина
		И мРежимРедактораЗапроса
		//И ВладелецФормы <> Неопределено //Закомментировано 09.04.2014
		И Не ЗапрашиватьИмяФайла
		И Не ЗначениеЗаполнено(ИмяФайла)
	Тогда
		мОбъектЗапроса.Текст = мТекущаяСтрокаДереваЗапросов.ТекстЗапроса;
		ТекстЗапросаКорректен = Ложь;
		Если ПроверитьКорректностьТекстаЗапросаИЗаполнитьПараметры(, Ложь) Тогда
			Если УстановитьТипЗапроса(, Истина) Тогда 
				ТекстЗапросаКорректен = Истина;
			КонецЕсли;
		КонецЕсли;
		Если Не ТекстЗапросаКорректен Тогда 
			Ответ = Вопрос("Текст запроса содержит ошибки. Продолжить сохранение запроса?", РежимДиалогаВопрос.ОКОтмена);
			Если Ответ = КодВозвратаДиалога.Отмена Тогда
				Возврат Ложь;
			КонецЕсли;
		КонецЕсли;
		//КонструкторЗапроса = Новый КонструкторЗапроса;
		//КонструкторЗапроса.РежимКомпоновкиДанных = Истина;
		//ТекстЗапроса = ПолеТекстаЗапроса.ПолеТекста.ПолучитьТекст();
		//Попытка
		//	КонструкторЗапроса.Текст = ТекстЗапроса;
		//Исключение
		//	ирКлиент.ПоказатьОшибкуВТекстеПрограммыЛкс(ПолеТекстаЗапроса.ПолеТекста,,,, МодальныйРежим, ИнформацияОбОшибке());
		//	Возврат;
		//КонецПопытки;
		лПараметры = Параметры.Скопировать();
		Если ирКэш.НомерИзданияПлатформыЛкс() = "82" Тогда
			// Мультиметка0017216734 Антибаг платформы https://www.hostedredmine.com/issues/944945
			Если ирОбщий.СтрокиРавныЛкс(мТекущаяСтрокаДереваЗапросов.ТипЗапроса, "Компоновка") Тогда
				Для Каждого СтрокаПараметра Из лПараметры Цикл
					СтрокаПараметра.Выражение = СтрЗаменить(СтрокаПараметра.Выражение, "Параметры.", "&"); // Опасно. Лучше сделать через мРегВыражение
				КонецЦикла;
			КонецЕсли; 
		КонецЕсли;
		СтруктураПараметров = Новый Структура;
		СтруктураПараметров.Вставить("НаборДанных", мРедактируемыйНаборДанных);
		СтруктураПараметров.Вставить("Параметры", лПараметры);
		СтруктураПараметров.Вставить("ПараметрыADO", мТекущаяСтрокаДереваЗапросов.ПараметрыADO);
		СтруктураПараметров.Вставить("ПараметрыWMI", мТекущаяСтрокаДереваЗапросов.ПараметрыWMI);
		СтруктураПараметров.Вставить("Запрос", мТекущаяСтрокаДереваЗапросов.ТекстЗапроса);
		СтруктураПараметров.Вставить("ВыделениеДвумерное", ПолеТекстаЗапроса.ПолеТекста.ВыделениеДвумерное());
		
		СтруктураПараметров.Вставить("ТекстЗапроса", мТекущаяСтрокаДереваЗапросов.ТекстЗапроса);
		ЗакрыватьПриВыборе = Ложь;
		ОповеститьОВыборе(СтруктураПараметров);
		ЭтаФорма.РезультатФормы = СтруктураПараметров;
		Модифицированность = Ложь;
	Иначе
		ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
		ДиалогВыбораФайла.Заголовок = "Укажите файл для сохранения списка запросов";
		ДиалогВыбораФайла.Фильтр = ирОбщий.ФильтрДляВыбораФайлаЛкс("sel", "Файл консоли запросов");
		ДиалогВыбораФайла.Расширение = "sel";
		Файл = Новый Файл(мИмяОткрытогоФайла);
		ДиалогВыбораФайла.Каталог = Файл.Путь;
		КопияДерева = ДеревоЗапросов.Скопировать();
		КопияДерева.Колонки.Добавить("КоординатыТекущейСтроки"); // Такой несистемный прием нужен для совместимости по формату со старыми консолями
		Если КопияДерева.Строки.Количество() > 0 Тогда
			КопияДерева.Строки[0].КоординатыТекущейСтроки = ирОбщий.Дерево_ПутьМассивомЛкс(мТекущаяСтрокаДереваЗапросов);
		КонецЕсли; 
		МаксКоличествоСтрокВТЗ = МаксКоличествоСтрокВКаждойТаблицеФайлаВосстановления();
		ВсеСтрокиДерева = ирОбщий.ВсеСтрокиДереваЗначенийЛкс(КопияДерева); 
		ФайлВосстановленияОбрезан = Ложь;
		Для Каждого СтрокаКопииДерева Из ВсеСтрокиДерева Цикл
			Если СтрокаКопииДерева.ПараметрыЗапроса = Неопределено Тогда 
				Продолжить;
			КонецЕсли; 
			ирОбщий.УстановитьМетаданныеКоллекцииЛкс(Параметры.Колонки, СтрокаКопииДерева.ПараметрыЗапроса);
			СтрокаКопииДерева.ПараметрыЗапроса = СтрокаКопииДерева.ПараметрыЗапроса.Скопировать(); 
			Для Каждого СтрокаПараметра Из СтрокаКопииДерева.ПараметрыЗапроса Цикл 
				Если ТипЗнч(СтрокаПараметра.Значение) = Тип("ТаблицаЗначений") Тогда
					КопияТаблицыИзПараметра = СтрокаПараметра.Значение.СкопироватьКолонки();
					Если ЗначениеЗаполнено(СтрокаПараметра.ИмяФайла) Тогда    
						СтрокаПараметра.Значение = КопияТаблицыИзПараметра;   
						Продолжить;
					КонецЕсли;
					Если ЭтоФайлВосстановления Тогда 
						СтрокаПараметра.ВариантыЗначения.Очистить();
						Если СтрокаПараметра.Значение.Количество() > МаксКоличествоСтрокВТЗ Тогда
							Для Счетчик = 1 По МаксКоличествоСтрокВТЗ Цикл
								ЗаполнитьЗначенияСвойств(КопияТаблицыИзПараметра.Добавить(), СтрокаПараметра.Значение[Счетчик - 1]); 
							КонецЦикла;
							СтрокаПараметра.Значение = КопияТаблицыИзПараметра;
							ФайлВосстановленияОбрезан = Истина;
						КонецЕсли;
					КонецЕсли; 
				КонецЕсли; 
			КонецЦикла;
		КонецЦикла;
		ФайлВыбран = ирКлиент.СохранитьФайлВКонсолиСВосстановлениемЛкс(ДиалогВыбораФайла, ИмяФайла, мИмяОткрытогоФайла, КопияДерева, мСтруктураВосстановления, ЗапрашиватьИмяФайла, ФайлВосстановленияОбрезан);
		Если ФайлВыбран Тогда
			СохранитьИмяФайла();
		Иначе
			Возврат Ложь;
		КонецЕсли;
		Если СброситьМодифицированность Тогда
			Модифицированность = Ложь;
		КонецЕсли;
	КонецЕсли;
	Обновить();
	Возврат Истина;
	
КонецФункции

Функция МаксКоличествоСтрокВКаждойТаблицеФайлаВосстановления()
	
	Возврат 555;

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

Процедура ЗавершитьЗагрузкуРезультата() Экспорт

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

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

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

Функция ТаблицаИзРезультатаЗапроса(РезультатЗапроса)

	Если ТипЗнч(РезультатЗапроса) = Тип("Массив") Тогда
		Результат = РезультатЗапроса[0].Выгрузить();
	ИначеЕсли ТипЗнч(РезультатЗапроса) = Тип("РезультатЗапроса") Тогда
		Результат = РезультатЗапроса.Выгрузить();
	Иначе
		Если ИспользованиеGWF = 1 Тогда
			ADOUtils = ПолучитьADOUtils();
		КонецЕсли; 
		Результат = ирОбщий.РезультатЗапросаADOВТаблицуЗначенийОбщийЛкс(РезультатЗапроса, Типизировать1С, БинарныеВСтроку,, ЭтаФорма.СмещениеГодаADO, ИспользованиеGWF = 1, ADOUtils);
	КонецЕсли;
	Возврат Результат;

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

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

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

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

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

Функция РазмерРезультатаЗапроса(РезультатЗапроса = Null, выхВыборкаРезультата = Неопределено) Экспорт 
	
	Если РезультатЗапроса = Null Тогда
		РезультатЗапроса = мРезультатЗапроса;
	КонецЕсли;
	Если РезультатЗапроса = Неопределено Тогда
		лРазмерРезультата = 0;
	ИначеЕсли ТипЗнч(РезультатЗапроса) = Тип("РезультатЗапроса") Тогда
		выхВыборкаРезультата = РезультатЗапроса.Выбрать();
		лРазмерРезультата = выхВыборкаРезультата.Количество();
	Иначе //Если ТипЗнч(РезультатЗапроса) = Тип("COMОбъект") Тогда
		Если ирОбщий.СтрокиРавныЛкс(мОписаниеРезультата.ТипЗапроса, "WQL") Тогда
			выхВыборкаРезультата = РезультатЗапроса;
			лРазмерРезультата = выхВыборкаРезультата.Count;
		ИначеЕсли ирОбщий.СтрокиРавныЛкс(мОписаниеРезультата.ТипЗапроса, "ADO") Тогда
			выхВыборкаРезультата = РезультатЗапроса;
			Если РезультатЗапроса.State = 0 Тогда
				// Выполнена команда
				лРазмерРезультата = 0;
			Иначе
				лРазмерРезультата = выхВыборкаРезультата.RecordCount;
			КонецЕсли; 
		КонецЕсли; 
	КонецЕсли;
	Возврат лРазмерРезультата;

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

Процедура СоздатьКоллекциюРезультата()

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

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

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

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

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

Функция ЗагрузитьРезультатВДеревоРезультатаПоВыборкамИтогов(ПолнаяЗагрузка = Ложь)

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

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

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

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

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

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

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

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

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

Процедура ПереподключитьОбработчикОжиданияОчисткиМВТ()
	
	ОтключитьОбработчикОжидания("ЗапроситьОчисткуМенеджераВременныхТаблиц");
	ПериодОчистки = ирКлиент.ПериодОчисткиМенеджераВременныхТаблицЛкс();
	#Если Сервер И Не Сервер Тогда
		ЗапроситьОчисткуМенеджераВременныхТаблиц();
	#КонецЕсли
	ПодключитьОбработчикОжидания("ЗапроситьОчисткуМенеджераВременныхТаблиц", ПериодОчистки*60);

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

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

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

Функция УстановитьПараметрыЗапроса(ОбъектЗапроса = Неопределено, Знач ДобавитьВыборкуИзВременнойТаблицы = Истина, Знач ИспользоватьТекущийПодзапрос = Истина)

	ОбновитьТекстВОбъектеЗапроса(ОбъектЗапроса, ИспользоватьТекущийПодзапрос);
	Если Истина
		И Не ирОбщий.СтрокиРавныЛкс(мТекущаяСтрокаДереваЗапросов.ТипЗапроса, "WQL") 
		И Не ирОбщий.СтрокиРавныЛкс(мТекущаяСтрокаДереваЗапросов.ТипЗапроса, "ADO") 
	Тогда
		Если Не ПроверитьКорректностьТекстаЗапросаИЗаполнитьПараметры(Ложь,,, ОбъектЗапроса.Текст, ДобавитьВыборкуИзВременнойТаблицы,, Ложь) Тогда 
			//Возврат Ложь; // Запрос.НайтиПараметры иногда выдает ошибку там, где Запрос.Выполнить не выдает https://partners.v8.1c.ru/forum/t/1626426/m/1626426
		КонецЕсли;
	КонецЕсли; 
	Неуникальные = ирОбщий.НеуникальныеЗначенияКолонкиТаблицыЛкс(Параметры, "ИмяПараметра");
	ТекстСообщения = "";
	Для Каждого Неуникальный Из Неуникальные Цикл
		Если ТекстСообщения <> "" Тогда
			ТекстСообщения = ТекстСообщения + Символы.ПС;
		КонецЕсли; 
		ТекстСообщения = ТекстСообщения + "Имя параметра """ + Неуникальный + """ неуникально!";
	КонецЦикла; 
	Если ЗначениеЗаполнено(ТекстСообщения) Тогда
		ирОбщий.СообщитьСУчетомМодальностиЛкс(ТекстСообщения, МодальныйРежим, СтатусСообщения.Внимание);
	КонецЕсли; 
	ВычислитьПараметрыЗапроса(ОбъектЗапроса, Ложь);
	Возврат Истина;
	
КонецФункции

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

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

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

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

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

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

Функция ПолучитьСтруктуруПараметров(пПараметры = Неопределено)

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

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

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

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

// Обработчик нажатия кнопки командной панели "Выполнить"
// В описании параметров нельзя задавать значения по умолчанию, т.к. процедура может вызываться как обработчик кнопки
Функция ВыполнитьЗапрос(Кнопка = Неопределено, Знач пЗагружатьЭлементов = Неопределено, РежимВременнойТаблицы = Неопределено, СохранитьДляОтложеннойОтладки = Неопределено,
	ИспользоватьНастройкиРасширений = Неопределено, ПолучатьСозданнуюВременнуюТаблицу = Неопределено, Знач ИспользоватьТекущийПодзапрос = Неопределено) Экспорт 
	
	#Если Сервер И Не Сервер Тогда
		мОбъектЗапроса = Новый Запрос;
	#КонецЕсли
	Если ИспользоватьНастройкиРасширений = Неопределено Тогда
		ИспользоватьНастройкиРасширений = Ложь;
	КонецЕсли; 
	Если СохранитьДляОтложеннойОтладки = Неопределено Тогда
		СохранитьДляОтложеннойОтладки = Ложь;
	КонецЕсли; 
	Если ПолучатьСозданнуюВременнуюТаблицу = Неопределено Тогда
		ПолучатьСозданнуюВременнуюТаблицу = Истина;
	КонецЕсли; 
	Если пЗагружатьЭлементов = Неопределено И Открыта() Тогда
		пЗагружатьЭлементов = ЗагружатьЭлементов;
	КонецЕсли;
	СохранитьДанныеТекущейСтрокиДереваЗапросов();
	Если ПолучатьСозданнуюВременнуюТаблицу Тогда
		СохранитьФайлДляВосстановления();
	КонецЕсли; 
	Если РежимВременнойТаблицы <> Истина Тогда
		ИспользоватьТекущийПодзапрос = Ложь
			Или мСтруктурноеРедактирование И ИспользоватьТекущийПодзапрос <> Ложь
			Или Не мСтруктурноеРедактирование И ИспользоватьТекущийПодзапрос = Истина;
		ЛиТекущийЗапросПолный = Истина
			И ЛиТекущийЗапросПолный()
			И (Ложь
				Или Не ИспользоватьТекущийПодзапрос
				Или мТекущаяСтрокаДереваЗапроса = ДеревоЗапроса.Строки[0]);
		//мОбъектЗапроса.Текст = ПолучитьТекстЗапроса(ИспользоватьТекущийПодзапрос);
		//Если Не ПроверитьКорректностьТекстаЗапроса() Тогда 
		//	Возврат;
		//КонецЕсли;
		Если Истина
			И ЛиТекущийЗапросПолный
			И мТекущаяСтрокаДереваЗапросов.НовыйМенеджерВременныхТаблиц 
		Тогда
			ПересоздатьМенеджерВременныхТаблиц(Истина);
		КонецЕсли;
		Если Не УстановитьПараметрыЗапроса(, ПолучатьСозданнуюВременнуюТаблицу, ИспользоватьТекущийПодзапрос) Тогда
			Возврат Ложь;
		КонецЕсли;
		//Если ЛиТекущийЗапросПолный Тогда 
		    ДобавитьПараметрыВКомпонентуПередВыполнениемЗапроса(ПоляТекстовПрограммы.КодПередВыполнениемЗапроса);
			Если Не ВыполнитьОбработчикПередВыполнениемЗапроса() Тогда 
				Возврат Ложь;
			КонецЕсли;
		//КонецЕсли; 
		ВременныйЗапрос = Новый Запрос;
		ВременныйЗапрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
		ВременныйЗапрос.Текст = "ВЫБРАТЬ * ПОМЕСТИТЬ ТЗ ИЗ &ТЗ КАК ТЗ ГДЕ ЛОЖЬ";
		Для Каждого КлючИЗначение Из мОбъектЗапроса.Параметры Цикл
			Если ТипЗнч(КлючИЗначение.Значение) = Тип("ТаблицаЗначений") И Найти(НРег(мОбъектЗапроса.Текст), "&" + КлючИЗначение.Ключ) > 0 Тогда
				ТаблицаПараметр = КлючИЗначение.Значение;
				Если ТаблицаПараметр.Количество() > 0 Тогда
					МассивСтрок = ирОбщий.ЗначенияВМассивЛкс(ТаблицаПараметр[0]);
					ТаблицаПараметрОднаСтрока = КлючИЗначение.Значение.Скопировать(МассивСтрок);
					ВременныйЗапрос.УстановитьПараметр("ТЗ", ТаблицаПараметрОднаСтрока);
					Попытка
						ВременныйЗапрос.Выполнить();
					Исключение
						ТаблицаПараметр = ирОбщий.СузитьТипыКолонокТаблицыБезПотериДанныхЛкс(ТаблицаПараметр);
						МассивСтрок = ирОбщий.ЗначенияВМассивЛкс(ТаблицаПараметр[0]);
						ТаблицаПараметрОднаСтрока = ТаблицаПараметр.Скопировать(МассивСтрок);
						ВременныйЗапрос.УстановитьПараметр("ТЗ", ТаблицаПараметрОднаСтрока);
						Попытка
							ВременныйЗапрос.Выполнить();
						Исключение
							ТаблицаПараметр = Неопределено;
						КонецПопытки;
						Если ТаблицаПараметр <> Неопределено Тогда
							ирОбщий.СообщитьЛкс("Для избежания ошибки ""тип не может быть выбран в запросе"" из описаний типов колонок параметра-таблицы """ + КлючИЗначение.Ключ + """ удалены лишние типы без потери данных");
							СтрокаПараметра = Параметры.Найти(КлючИЗначение.Ключ, "ИмяПараметра");
							СтрокаПараметра.Значение = ТаблицаПараметр;
							мОбъектЗапроса.Параметры.Вставить(КлючИЗначение.Ключ, ТаблицаПараметр);
						КонецЕсли; 
					КонецПопытки;
				КонецЕсли; 
			КонецЕсли; 
		КонецЦикла;
	КонецЕсли; 
	ИндексРезультата = 0;
	//мАнализТехножурнала = Неопределено; // Антибаг 8.3.5-7 https://partners.v8.1c.ru/forum/t/1442085/m/1442085
	//мАнализТехножурнала = ирОбщий.СоздатьОбъектПоИмениМетаданныхЛкс("Обработка.ирАнализТехножурнала");
	#Если Сервер И Не Сервер Тогда
		мАнализТехножурнала = Обработки.ирАнализТехножурнала.Создать();
	#КонецЕсли
	СоздаваемыеВременныеТаблицы = Новый СписокЗначений;
	Если ирОбщий.СтрокиРавныЛкс(мТекущаяСтрокаДереваЗапросов.ТипЗапроса, "WQL") Тогда
		ТекстЗапроса = мПолучитьЗапросWMI();
		ПометитьНачалоВыполненияЗапроса();
		НачалоВыполнения = ирОбщий.ТекущееВремяВМиллисекундахЛкс();
		Попытка
			мРезультатЗапроса = ВыполнитьЗапросИсточникаДанных(ТекстЗапроса,,, СохранитьДляОтложеннойОтладки, мРезультатПакета, мРезультатПоИменам); // COMОбъект
		Исключение
			ирОбщий.СообщитьСУчетомМодальностиЛкс("Ошибка выполнения запроса: " + ирОбщий.ПодробноеПредставлениеОшибкиЛкс(ИнформацияОбОшибке().Причина),
				МодальныйРежим, СтатусСообщения.Внимание);
			Возврат Ложь;
		КонецПопытки; 
		Попытка
			Пустышка = мРезультатЗапроса.Count;
		Исключение
			ирОбщий.СообщитьСУчетомМодальностиЛкс("Ошибка выполнения запроса", МодальныйРежим, СтатусСообщения.Внимание);
			Возврат Ложь;
		КонецПопытки;
		//мРезультатПакета = Неопределено;
	ИначеЕсли ирОбщий.СтрокиРавныЛкс(мТекущаяСтрокаДереваЗапросов.ТипЗапроса, "ADO") Тогда
		//ТекстЗапроса = ПолеТекстаЗапроса.ПолеТекста.ПолучитьТекст();
		ТекстЗапроса = мОбъектЗапроса.Текст;
		Если Не СохранитьДляОтложеннойОтладки Тогда
			СоздаваемыеВременныеТаблицы = ПроверитьДобавитьВыборкуИзВременнойТаблицыВТекстЗапроса(ТекстЗапроса);
			// Уничтожаем создаваемые в тексте запроса временные таблицы
			Для Каждого ЭлементСписка Из СоздаваемыеВременныеТаблицы Цикл
				ИмяСоздаваемойВременнойТаблицы = ЭлементСписка.Представление;
				Если Ложь
					Или Не ЗначениеЗаполнено(ИмяСоздаваемойВременнойТаблицы) 
					Или мСозданныеВременныеТаблицыADO[НРег(ИмяСоздаваемойВременнойТаблицы)] = Неопределено // Добавил, т.к. есть опасность удалить статическую таблицу
				Тогда
					Продолжить;
				КонецЕсли;
				УдалитьВременнуюТаблицу(ИмяСоздаваемойВременнойТаблицы);
			КонецЦикла;
		КонецЕсли;
		ПометитьНачалоВыполненияЗапроса();
		НачалоВыполнения = ирОбщий.ТекущееВремяВМиллисекундахЛкс();
		ПредТекст = "";
		Если ИспользоватьТекущийПодзапрос Тогда
			мСлужебноеПолеТекстовогоДокумента.УстановитьТекст(ДеревоЗапроса.Строки[0].Текст);
			мСлужебноеПолеТекстовогоДокумента.УстановитьГраницыВыделения(1,1,
				мТекущаяСтрокаДереваЗапроса.СтрокаДанных.НачальнаяСтрока,
				мТекущаяСтрокаДереваЗапроса.СтрокаДанных.НачальнаяКолонка);
			ПредТекст = мСлужебноеПолеТекстовогоДокумента.ВыделенныйТекст;
		КонецЕсли;
		мРезультатЗапроса = ВыполнитьЗапросИсточникаДанных(ТекстЗапроса, пЗагружатьЭлементов,, СохранитьДляОтложеннойОтладки, мРезультатПакета, мРезультатПоИменам, ПредТекст); // COMОбъект
		Если мРезультатЗапроса = Неопределено Тогда
			//ирОбщий.СообщитьСУчетомМодальностиЛкс("Ошибка выполнения запроса: " + ОписаниеОшибки(), МодальныйРежим, СтатусСообщения.Внимание);
			Возврат Ложь;
		КонецЕсли; 
		//мРезультатПакета = Неопределено;
	Иначе
		СтартоваяСтрока = 0;
		СтартоваяКолонка = 0;
		Если РежимВременнойТаблицы <> Истина Тогда
			Если ИспользоватьТекущийПодзапрос И Не мСтруктурноеРедактирование Тогда 
				Если мТекущаяСтрокаДереваЗапроса.СтрокаДанных <> Неопределено Тогда
					СтартоваяСтрока = мТекущаяСтрокаДереваЗапроса.СтрокаДанных.НачальнаяСтрока - 1;
					СтартоваяКолонка = мТекущаяСтрокаДереваЗапроса.СтрокаДанных.НачальнаяКолонка;
				КонецЕсли;
			КонецЕсли;
			ТекстЗапроса = мОбъектЗапроса.Текст;
			Если Не СохранитьДляОтложеннойОтладки Тогда
				СоздаваемыеВременныеТаблицы = ПолучитьЗапросСНастройкамиИНайтиВременныеТаблицы(ТекстЗапроса, ИспользоватьНастройкиРасширений);
			КонецЕсли;
		Иначе
			ИмяВременноеТаблицы = ЭлементыФормы.ВременныеТаблицы.ТекущиеДанные.Имя;
			ТекстЗапроса = "ВЫБРАТЬ * ИЗ " + ИмяВременноеТаблицы;
			ДобавитьПорядокОтладкиВВыборкуИзВременнойТаблицы(ИмяВременноеТаблицы, ТекстЗапроса);
			мОбъектЗапроса.Текст = ТекстЗапроса;
		КонецЕсли; 
		ТекстЗапроса = мОбъектЗапроса.Текст;
		Если ПолучатьСозданнуюВременнуюТаблицу Тогда
			ПометитьНачалоВыполненияЗапроса(ДатаНачалаВыполнения);
		КонецЕсли; 
		НачалоВыполнения = ирОбщий.ТекущееВремяВМиллисекундахЛкс();
		Если ВыполнятьВТранзакции Тогда
			НачатьТранзакцию();
		КонецЕсли; 
		Попытка
			мРезультатПакета = ВыполнитьЗапросИсточникаДанных(ТекстЗапроса,,, СохранитьДляОтложеннойОтладки,, мРезультатПоИменам);
		Исключение
			Если ВыполнятьВТранзакции Тогда
				ОтменитьТранзакцию();
			КонецЕсли; 
			Если ПолучатьСозданнуюВременнуюТаблицу Тогда
				мАнализТехножурнала.КончитьТрассу(ДатаКонцаВыполнения);
			КонецЕсли; 
			ирКлиент.ПоказатьОшибкуВТекстеПрограммыЛкс(ПолеТекстаЗапроса.ПолеТекста, СтартоваяСтрока, СтартоваяКолонка, Истина, МодальныйРежим, ИнформацияОбОшибке(),,, ЭтаФорма);
			Возврат Ложь;
		КонецПопытки;
		Если ВыполнятьВТранзакции Тогда
			ЗафиксироватьТранзакцию();
		КонецЕсли;
		Если СохранитьДляОтложеннойОтладки Тогда
			// Нужно тут делать, т.к. мРезультатПакета = Неопределено
			Возврат Истина;
		КонецЕсли; 
		мРезультатЗапроса = мРезультатПакета[ПолучитьИндексПоследнегоРезультатЗапросаИзРезультатаПакета()];
		Если РежимВременнойТаблицы <> Истина Тогда
			Если ирКэш.ДоступныТаблицыМенеджераВременныхТаблицЛкс() Тогда
				Для Каждого ВременнаяТаблица Из мОбъектЗапроса.МенеджерВременныхТаблиц.Таблицы Цикл
					ДобавитьОписаниеВременнойТаблицы(ВременнаяТаблица.ПолноеИмя);
				КонецЦикла;
			Иначе
				Для Каждого ЭлементСписка Из СоздаваемыеВременныеТаблицы Цикл
					Если ЗначениеЗаполнено(ЭлементСписка.Представление) Тогда
						ДобавитьОписаниеВременнойТаблицы(ЭлементСписка.Представление);
					КонецЕсли; 
				КонецЦикла;
			КонецЕсли; 
		КонецЕсли; 
	КонецЕсли; 
	Если СохранитьДляОтложеннойОтладки Тогда
		Возврат Истина;
	КонецЕсли; 
	ЗаполнитьОписаниеРезультата(ТекстЗапроса, СоздаваемыеВременныеТаблицы, РежимВременнойТаблицы);
	КонецВыполнения = ирОбщий.ТекущееВремяВМиллисекундахЛкс();
	ЭтаФорма.ДлительностьВыполнения = КонецВыполнения - НачалоВыполнения;
	//ирОбщий.СостояниеЛкс("");
	Если ПолучатьСозданнуюВременнуюТаблицу Тогда
		мАнализТехножурнала.КончитьТрассу(ДатаКонцаВыполнения);
	КонецЕсли; 
	Если РежимВременнойТаблицы <> Истина Тогда
		Если ЛиТекущийЗапросПолный Тогда
			мТекущаяСтрокаДереваЗапросов.Длительность = ДлительностьВыполнения;
			мТекущаяСтрокаДереваЗапросов.ДатаВыполнения = ТекущаяДата();
		КонецЕсли; 
		Если Истина
			И мТекущаяСтрокаДереваЗапроса <> Неопределено
			И мРедактируемыйУзел <> мТекущаяСтрокаДереваЗапроса
		Тогда
			Если мСтруктурноеРедактирование Или ИспользоватьТекущийПодзапрос Тогда 
				СтрокаДереваЗапроса = мТекущаяСтрокаДереваЗапроса;
			Иначе
			    СтрокаДереваЗапроса = ДеревоЗапроса.Строки[0];
			КонецЕсли;
			СтрокаДереваЗапроса.ДлительностьПолная = ДлительностьВыполнения;
			ОбновитьЧистуюДлительность(СтрокаДереваЗапроса);
			Если СтрокаДереваЗапроса.Родитель <> Неопределено Тогда
				ОбновитьЧистуюДлительность(СтрокаДереваЗапроса.Родитель);
			КонецЕсли;
			ОбновитьКоличествоСтрокРезультата(мРезультатЗапроса, СтрокаДереваЗапроса, ПолучатьСозданнуюВременнуюТаблицу);
		КонецЕсли;
		ОбновитьТабличноеПолеВременныхТаблиц();
	КонецЕсли; 
	Если Не ПолучатьСозданнуюВременнуюТаблицу Тогда
		Возврат Истина;
	КонецЕсли; 
	
	//ПанельРезультатаПриСменеСтраницы();
	ТаблицаРезультатаПакета.Очистить();
	Если Истина
		И мРезультатПакета <> Неопределено 
		И РежимВременнойТаблицы <> Истина
		И Открыта()
		И (Ложь
			Или Не ИспользоватьТекущийПодзапрос
			Или мТекущаяСтрокаДереваЗапроса = Неопределено
			Или ЭлементыФормы.ДеревоЗапроса.ТекущаяСтрока = ДеревоЗапроса.Строки[0])
	Тогда
		ЭлементыФормы.РежимРезультатПоИменам.Доступность = Истина
			И мРезультатПоИменам <> Неопределено
			И мРезультатПоИменам.Количество() > 0;
		Если Не ЭлементыФормы.РежимРезультатПоИменам.Доступность Тогда 
			ЭтаФорма.РежимРезультатПоИменам = Ложь;
		КонецЕсли; 
		ЗагрузитьРезультатПакета();
	Иначе
		ЗагрузитьРезультатЗапроса(пЗагружатьЭлементов, РежимВременнойТаблицы, Истина);
		ИзменитьСвернутостьРезультатПакета(Ложь);
	КонецЕсли;
	Возврат Истина;
	
КонецФункции

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

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

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

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

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

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

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

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

Функция ПолучитьИндексПоследнегоРезультатЗапросаИзРезультатаПакета()
	
	Для НомерРезультата = 1 По мРезультатПакета.Количество() Цикл
		ИндексРезультата = мРезультатПакета.Количество() - НомерРезультата;
		РезультатЗапроса = мРезультатПакета[ИндексРезультата];
		Если РезультатЗапроса <> Неопределено Тогда
			Прервать;
		КонецЕсли; 
	КонецЦикла;
	Возврат ИндексРезультата;

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

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

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

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

Функция ПометитьНачалоВыполненияЗапроса(выхДатаНачалаВыполнения = Неопределено)

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

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

Процедура ОбновитьЧистуюДлительность(СтрокаДереваЗапроса)

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

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

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

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

	Если Истина
		И мТекущаяСтрокаДереваЗапросов <> Неопределено
		И ирОбщий.СтрокиРавныЛкс(мТекущаяСтрокаДереваЗапросов.ТипЗапроса, "ADO") 
	Тогда 
		ОтключитьИсточникДанныхADO();
	КонецЕсли; 
	мИсторияПереходов = Неопределено; 
	мЗапоминатьИсториюПереходов = Истина;
	мТекущаяСтрокаДереваЗапросов = ЭлементыФормы.ДеревоЗапросов.ТекущаяСтрока;
	мЗапросЗагруженВКонсоль = Истина
		И ДеревоЗапросов.Строки.Количество() <> 0 
		И мТекущаяСтрокаДереваЗапросов <> НеОпределено 
		И мТекущаяСтрокаДереваЗапросов.ТипЗапроса <> "Папка";
	ОчиститьДеревоЗапроса();
	мСтарыйТекстЗапроса = "";
	УстановитьТекстПоляТекстаЗапроса("");
	Параметры.Очистить();
	ВыборкиИтогов.Очистить();
	мОбъектЗапроса.Параметры.Очистить(); 
	ЭлементыФормы.МенюДереваЗапроса.Доступность = Ложь;
	ЭтаФорма.ПараметрыОтРодителя = Ложь;
	ЭлементыФормы.ПараметрыОтРодителя.Доступность = Истина
		И мТекущаяСтрокаДереваЗапросов <> Неопределено
		И мТекущаяСтрокаДереваЗапросов.Родитель <> Неопределено;
	Если мЗапросЗагруженВКонсоль Тогда
		ЭлементыФормы.КодОбработкиСтрокиРезультата.УстановитьТекст(мТекущаяСтрокаДереваЗапросов.КодОбработкиСтрокиРезультата);
		ЭлементыФормы.КодПередВыполнениемЗапроса.УстановитьТекст(мТекущаяСтрокаДереваЗапросов.КодПередВыполнениемЗапроса);
		ЭлементыФормы.КодОбработкиРезультата.УстановитьТекст(мТекущаяСтрокаДереваЗапросов.КодОбработкиРезультата);
		ТекстЗапроса = мТекущаяСтрокаДереваЗапросов.ТекстЗапроса;
		Маркер = "СтрЗаменить(""";
		Если ирОбщий.СтрНайтиЛкс(ТекстЗапроса, Маркер) > 0 Тогда
			// Антибаг платформы 8.3.20+ https://www.hostedredmine.com/issues/955328
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса, Маркер, "_" + Маркер);
			ирОбщий.СообщитьЛкс("В тексте запроса переименовано обращение к функции СтрЗаменить, т.к. она приводит к аварийному завершению программы");
		КонецЕсли;
		УстановитьТекстПоляТекстаЗапроса(ТекстЗапроса);
		ВосстановитьТекущуюСтрокуВТекстеЗапроса = Истина;
		Если ЗначениеЗаполнено(ДеревоЗапросовСтрокаПоиска) Тогда
			ВосстановитьТекущуюСтрокуВТекстеЗапроса = Не ирКлиент.НайтиПоказатьФрагментВПолеТекстаЛкс(ЭтаФорма, ПолеТекстаЗапроса.ПолеТекста, ДеревоЗапросовСтрокаПоиска, Ложь,, мРазрешитьАктивациюРедактора, Истина);
		КонецЕсли; 
		Если ВосстановитьТекущуюСтрокуВТекстеЗапроса И мТекущаяСтрокаДереваЗапросов.НачальнаяСтрока > 0 Тогда
			ПолеТекстаЗапроса.ПолеТекста.УстановитьГраницыВыделения(мТекущаяСтрокаДереваЗапросов.НачальнаяСтрока, мТекущаяСтрокаДереваЗапросов.НачальнаяКолонка,
				мТекущаяСтрокаДереваЗапросов.КонечнаяСтрока, мТекущаяСтрокаДереваЗапросов.КонечнаяКолонка,, ЭтаФорма);
		КонецЕсли; 
		ЭтаФорма.ПараметрыОтРодителя = мТекущаяСтрокаДереваЗапросов.ПараметрыОтРодителя;
		ЗагрузитьТаблицуПараметровЗапроса();
		ЭтаФорма.СтандартнаяВыгрузкаВДерево = мТекущаяСтрокаДереваЗапросов.СтандартнаяВыгрузкаВДерево;
		ЭтаФорма.АвтовыборкиИтогов = мТекущаяСтрокаДереваЗапросов.АвтовыборкиИтогов;
		//ЭтаФорма.ОбходитьИерархическиеВыборкиРекурсивно = мТекущаяСтрокаДереваЗапросов.ОбходитьИерархическиеВыборкиРекурсивно;
		ЭтаФорма.АвтозаполнениеДоступныхПолей = мТекущаяСтрокаДереваЗапросов.АвтоЗаполнениеДоступныхПолей; 
		ЭтаФорма.ДобавлятьСлужебныеКолонкиРезультата = мТекущаяСтрокаДереваЗапросов.ДобавлятьСлужебныеКолонкиРезультата;
		Если мТекущаяСтрокаДереваЗапросов.ВыборкиИтогов <> Неопределено Тогда
			ЭтаФорма.ВыборкиИтогов = мТекущаяСтрокаДереваЗапросов.ВыборкиИтогов.Скопировать();
		КонецЕсли;
		Если Не ЭлементыФормы.СпособВыгрузки.ТолькоПросмотр Тогда
			Если Не ЗначениеЗаполнено(мТекущаяСтрокаДереваЗапросов.СпособВыгрузки) Тогда
				мТекущаяСтрокаДереваЗапросов.СпособВыгрузки = 1;
			КонецЕсли;
			ЭтаФорма.СпособВыгрузки = мТекущаяСтрокаДереваЗапросов.СпособВыгрузки;
		КонецЕсли; 
		ЭтаФорма.ВыбратьВсеПоля = мТекущаяСтрокаДереваЗапросов.ВыбратьВсеПоля;
		ЭтаФорма.Автоупорядочивание = мТекущаяСтрокаДереваЗапросов.Автоупорядочивание;
		Если ТипЗнч(мТекущаяСтрокаДереваЗапросов.Настройка) = Тип("Строка") Тогда
			Компоновщик.ЗагрузитьНастройки(ирОбщий.ВосстановитьНастройкуКомпоновкиИзСтрокиXMLЛкс(мТекущаяСтрокаДереваЗапросов.Настройка));
		КонецЕсли;
		
		// WMI
		Если ТипЗнч(мТекущаяСтрокаДереваЗапросов.ПараметрыWMI) = Тип("Структура") Тогда
			ЗаполнитьЗначенияСвойств(ЭтаФорма, мТекущаяСтрокаДереваЗапросов.ПараметрыWMI);
			ЭлементыФормы.КлассыWMI.ОтборСтрок.ТочкаПодключения.Установить(ТочкаПодключенияWMI);
		КонецЕсли; 
		//Если ирОбщий.СтрокиРавныЛкс(мТекущаяСтрокаДереваЗапросов.ТипЗапроса, "WQL") Тогда
		//	НастроитьКомпоновщикWMI();
		//КонецЕсли; 
		
		// ADO
		ЭтаФорма.РасширенноеПолучениеМетаданных = Ложь;
		Если ТипЗнч(мТекущаяСтрокаДереваЗапросов.ПараметрыADO) = Тип("Структура") Тогда
			ПараметрыADO = мТекущаяСтрокаДереваЗапросов.ПараметрыADO;
			Если Не ПараметрыADO.Свойство("АутентификацияОС") Тогда
				ПараметрыADO.Вставить("АутентификацияОС", Ложь);
			КонецЕсли; 
			ЗаполнитьЗначенияСвойств(ЭтаФорма, ПараметрыADO);
			УстановитьИсточникДанныхADO(ПараметрыADO, Ложь);
			ПараметрыПлатформыADO = ПараметрыПлатформыADO_Получить(ПараметрыADO.Платформа);
			ФормаКонтроль_ПлатформаADO(ПараметрыПлатформыADO);
			ФормаКонтроль_ТипИДADO();
		Иначе
			ADOUtils = ПолучитьADOUtils(Ложь);
			Если ADOUtils <> Неопределено Тогда
				//ЭтаФорма.ИспользованиеGWF = 1; // Преобразование в ТЗ
				ЭтаФорма.ИспользованиеGWF = 2;   // Преобразование в результат запроса
			КонецЕсли; 
		КонецЕсли; 
		//мСоединениеADO = Неопределено;
		//Если ирОбщий.СтрокиРавныЛкс(мТекущаяСтрокаДереваЗапросов.ТипЗапроса, "ADO") Тогда
		//КонецЕсли; 
		
		//ВычислитьПараметрыЗапроса();
		УправлениеКолонкамиПараметры();
		Если мСтруктурноеРедактирование Тогда 
			Если РазобратьТекстЗапроса() <> Истина Тогда 
				КоманднаяПанельФормыРежимДереваЗапроса();
			Иначе
				ИзменитьСвернутостьПанельДеревоЗапроса(Истина);
			КонецЕсли;
			Если ЗначениеЗаполнено(ДеревоЗапросовСтрокаПоиска) Тогда
				СтрокаПоискаПриИзменении(, Ложь, Истина, Ложь, Истина);
			КонецЕсли; 
		Иначе
			ОбновитьВедомуюСтруктуруЗапроса();
		КонецЕсли;
		//УстановитьТипЗапроса();
		ПанельЗапросаПриСменеСтраницы();
	Иначе
		ИзменитьСвернутостьПанельДеревоЗапроса(Ложь);
	КонецЕсли;
	мРазрешитьАктивациюРедактора = Истина;
	УстановитьТипЗапроса();
	ЭлементыФормы.КоманднаяПанельФормы.Кнопки.ВыполнитьЗапрос.Доступность = мЗапросЗагруженВКонсоль;
	ЭлементыФормы.КоманднаяПанельФормы.Кнопки.ВыполнитьСНастройками.Доступность = мЗапросЗагруженВКонсоль;
	ЭлементыФормы.КоманднаяПанельФормы.Кнопки.СохранитьОбъектДляОтладки.Доступность = мЗапросЗагруженВКонсоль;
	ЭлементыФормы.КоманднаяПанельФормы.Кнопки.Открыть_КонсольКомпоновокДанных.Доступность = мЗапросЗагруженВКонсоль;
	ЭлементыФормы.КоманднаяПанельФормы.Кнопки.ИсполняемыйЗапрос.Доступность = мЗапросЗагруженВКонсоль;
	//ЭлементыФормы.КоманднаяПанельФормы.Кнопки.ТипЗапроса.Доступность = мТекущаяСтрокаДереваЗапросов <> НеОпределено; // Доступность для подменю не реализована в платформе
	ОбновитьДоступностьПанелиЗапроса();
	//ЭлементыФормы.ПанельРезультата.Страницы.КодОбработкиСтрокиРезультата.Доступность = ТипЗнч(РезультатКоллекция) <> Тип("ДеревоЗначений");
	КлсПолеТекстаПрограммыОбновитьКонтекст(ПоляТекстовПрограммы.КодПередВыполнениемЗапроса);

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

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

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

Функция ВладелецПараметровЗапроса(СтрокаДерева = Неопределено)

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

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

Процедура УничтожитьВременныеТаблицыПодзапроса(СтрокаДереваЗапроса)

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

КонецПроцедуры // УничтожитьВременныеТаблицыПодзапроса()

Процедура ОчиститьДеревоЗапроса()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

		лПолеТекстаПрограммы = ирОбщий.НовыйАнализаторКодаЛкс();
		#Если Сервер И Не Сервер Тогда
			лПолеТекстаПрограммы = Обработки.ирКлсПолеТекстаПрограммы.Создать();
			ВыполнитьЛокальноКодПередВыполнениемЗапроса();
		#КонецЕсли
		лПолеТекстаПрограммы.Инициализировать(ПоляТекстовПрограммы,
			ЭтаФорма, ЭлементыФормы.КодПередВыполнениемЗапроса, , , "ВыполнитьЛокальноКодПередВыполнениемЗапроса", ЭтаФорма); 
			
		лПолеТекстаПрограммы = ирОбщий.НовыйАнализаторКодаЛкс();
		#Если Сервер И Не Сервер Тогда
			лПолеТекстаПрограммы = Обработки.ирКлсПолеТекстаПрограммы.Создать();
			ВыполнитьЛокальноКодОбработкиРезультата();
		#КонецЕсли
		лПолеТекстаПрограммы.Инициализировать(ПоляТекстовПрограммы,
			ЭтаФорма, ЭлементыФормы.КодОбработкиРезультата, , , "ВыполнитьЛокальноКодОбработкиРезультата", ЭтаФорма);
			
		лПолеТекстаПрограммы = ирОбщий.НовыйАнализаторКодаЛкс();
		#Если Сервер И Не Сервер Тогда
			лПолеТекстаПрограммы = Обработки.ирКлсПолеТекстаПрограммы.Создать();
			ВыполнитьЛокальноКодОбработкиСтрокиРезультата();
		#КонецЕсли
		лПолеТекстаПрограммы.Инициализировать(ПоляТекстовПрограммы,
			ЭтаФорма, ЭлементыФормы.КодОбработкиСтрокиРезультата, , , "ВыполнитьЛокальноКодОбработкиСтрокиРезультата", ЭтаФорма);
			
		//МассивТипов = Новый Массив;
		//МассивТипов.Добавить(ТипЗнч(мОбъектЗапроса));
		//ПолеТекстаПрограммы.КодПередВыполнениемЗапроса.ДобавитьСловоЛокальногоКонтекста(
		//		"мОбъектЗапроса", "Свойство", Новый ОписаниеТипов(МассивТипов));
		//		
		
		// ---.КЛАСС.ПолеТекстаПрограммы
	КонецЕсли; 
	
	// Таким способом появится проблема превращения ссылочных значений в строковые при выборе их в поле "Значение" в таблице параметров, если консоль открыта через От()
	// http://forum.infostart.ru/forum9/topic21000/message2169079/#message2169079
	//ПодключитьОбработчикОжидания("ПодключитьДанныеКолонкиЗначениеТаблицыПараметров", 0.2, Истина);
	ПодключитьДанныеКолонкиЗначениеТаблицыПараметров();
	
	ЭтотОбъект.ВыполнятьВТранзакции = ирОбщий.ВосстановитьЗначениеЛкс("ирКонсольЗапросов_ВыполнятьВТранзакции") = Истина;
	ЭлементыФормы.КоманднаяПанельФормы.Кнопки.РежимТранзакции.Пометка = ВыполнятьВТранзакции;
	ПоказыватьИтогиТаблицы = ирОбщий.ВосстановитьЗначениеЛкс("ирКонсольЗапросов_ПоказыватьИтогиТаблицы") = Истина;
	Если ПоказыватьИтогиТаблицы = Истина Тогда
		КлсКомандаНажатие(ЭлементыФормы.КоманднаяПанельКоллекция.Кнопки.ПоказыватьИтоги);
	КонецЕсли; 
	ЭлементыФормы.КоманднаяПанельПередВыполнениемЗапроса.Кнопки.ВыполнятьНаСервере.Доступность = Не ирКэш.ЛиПортативныйРежимЛкс();
	ЭлементыФормы.КоманднаяПанельОбработкаСтрокиРезультата.Кнопки.ВыполнятьНаСервере.Доступность = Не ирКэш.ЛиПортативныйРежимЛкс();
	ЭлементыФормы.КоманднаяПанельОбработкиРезультата.Кнопки.ВыполнятьНаСервере.Доступность = Не ирКэш.ЛиПортативныйРежимЛкс();
	ЭлементыФормы.КоманднаяПанельКоллекция.Кнопки.РасшифроватьСтроку.Доступность = ирКэш.ЛиПлатформаWindowsЛкс();
	ирКлиент.КнопкаКоманднойПанелиЭкземпляраКомпонентыЛкс(ПолеТекстаЗапроса, "КонструкторЗапросовИР").Доступность = ирКэш.ЛиПлатформаWindowsЛкс();
	НастроитьКолонкиТабличногоПоляРезультата();
	ЭтаФорма.ВключатьДеревоЗапросаПриОтладке = ирОбщий.ВосстановитьЗначениеЛкс("ирКонсольЗапросов_ВключатьДеревоЗапросаПриОтладке") <> Ложь;
	ЭтаФорма.ПоказыватьСвойства = ирОбщий.ВосстановитьЗначениеЛкс("ирКонсольЗапросов_ПоказыватьСвойства") = Истина;
	ЭтаФорма.ПоказыватьРезультатПакета = ирОбщий.ВосстановитьЗначениеЛкс("ирКонсольЗапросов_ПоказыватьРезультатПакета") = Истина;
	НовоеЗагружатьЭлементов = ирОбщий.ВосстановитьЗначениеЛкс("ирКонсольЗапросов_ЗагружатьЭлементов");
	Если НовоеЗагружатьЭлементов <> Неопределено Тогда
		ЭтаФорма.ЗагружатьЭлементов = НовоеЗагружатьЭлементов;
	КонецЕсли; 
	//ЭлементыФормы.КоманднаяПанельФормы.Кнопки.ВключитьТехножурнал.Пометка = ВключитьТехножурнал;
	
	Если мРежимРедактораЗапроса Тогда
		мРежимФормыДляЗаголовка = "Редактирование";
		Если ВладелецФормы <> Неопределено Тогда
			ВладелецФормы.Панель.Доступность = Ложь;
		КонецЕсли; 
	ИначеЕсли мКоллекцияДляЗаполнения <> Неопределено Тогда
		мРежимФормыДляЗаголовка = "Заполнение коллекции";
		Если мСтрокаЗапросаПараметра = Неопределено Тогда
			Если ДеревоЗапросов.Строки.Количество() > 0 Тогда
				мСтрокаЗапросаПараметра = ДеревоЗапросов.Строки[0];
			Иначе
				ИнициализацияСлужебногоРежима();
			КонецЕсли; 
		КонецЕсли; 
		Если ТипЗнч(мКоллекцияДляЗаполнения) = Тип("ТаблицаЗначений") Тогда
			#Если Сервер И Не Сервер Тогда
				мКоллекцияДляЗаполнения = Новый ТаблицаЗначений;
			#КонецЕсли
			мСтрокаЗапросаПараметра.СпособВыгрузки = 1;
		Иначе
			мСтрокаЗапросаПараметра.СпособВыгрузки = 2;
		КонецЕсли;
		ЭлементыФормы.СпособВыгрузки.ТолькоПросмотр = Истина;
		СоздатьКоллекциюРезультата();
		Если мКоллекцияДляЗаполнения.Колонки.Количество() > 0 Тогда
			УстановитьКоллекциюРезультата(мКоллекцияДляЗаполнения.СкопироватьКолонки(), Истина);
			ИмяПараметра = "ТЗ";
			ДополнитьТаблицуПараметровЗапросаПоСтруктуре(Новый Структура(ИмяПараметра, мКоллекцияДляЗаполнения), мСтрокаЗапросаПараметра.ПараметрыЗапроса, Истина);
			мТекущаяСтрокаДереваЗапросов = Неопределено; // Чтобы параметры поместились в форму при повторном открытии
			Если Не ЗначениеЗаполнено(мСтрокаЗапросаПараметра.ТекстЗапроса) Тогда  
				Если Ложь
					Или ТипЗнч(мКоллекцияДляЗаполнения) <> Тип("ТаблицаЗначений")
					Или мКоллекцияДляЗаполнения.Количество() = 0 
				Тогда
					ТекстЗапроса = Новый Массив;
					Для Каждого КолонкаКоллекции Из мКоллекцияДляЗаполнения.Колонки Цикл
						ТекстЗапроса.Добавить("	НЕОПРЕДЕЛЕНО КАК " + КолонкаКоллекции.Имя);
					КонецЦикла;
					ТекстЗапроса = "ВЫБРАТЬ
					|" + ирОбщий.СтрСоединитьЛкс(ТекстЗапроса, "," + Символы.ПС);
				Иначе
					ТекстЗапроса = ирОбщий.ТекстЗапросаПоместитьИзПараметраЛкс("ТЗ", ИмяПараметра,,, Истина);
					мСтрокаЗапросаПараметра.Запрос = "Запрос к таблице значений";
				КонецЕсли; 
				мСтрокаЗапросаПараметра.ТекстЗапроса = ТекстЗапроса;
			КонецЕсли; 
		КонецЕсли;
	ИначеЕсли КлючУникальности = "Расшифровки" Тогда
		мРежимФормыДляЗаголовка = "Расшифровки";
	КонецЕсли;
	Если Не мРежимРедактораЗапроса И мКоллекцияДляЗаполнения = Неопределено Тогда
		Если ЭлементыФормы.КоманднаяПанельФормы.Кнопки.Найти("Применить") <> Неопределено Тогда
			ЭлементыФормы.КоманднаяПанельФормы.Кнопки.Удалить(ЭлементыФормы.КоманднаяПанельФормы.Кнопки.Применить);
		КонецЕсли; 
	КонецЕсли; 
	Если Истина
		И мТекущаяСтрокаДереваЗапросов = Неопределено
		И ЭлементыФормы.ДеревоЗапросов.ТекущаяСтрока <> Неопределено 
	Тогда
		ДеревоЗапросовПриАктивизацииСтроки();
	КонецЕсли; 
	//УстановитьЗаголовокФормы();
	
	Если Ложь
		Или мРежимРедактораЗапроса
		Или КлючУникальности = "Расшифровки"
		//Или мКоллекцияДляЗаполнения <> Неопределено
	Тогда
		//Для Каждого лКнопка Из ЭлементыФормы.КоманднаяПанельФормы.Кнопки.ТипЗапроса.Кнопки Цикл
		//	лКнопка.Доступность = Ложь;
		//КонецЦикла;
		ЭлементыФормы.МенюДереваЗапроса.Кнопки.СкопироватьВНовыйЗапрос.Доступность = Ложь;
		ЭлементыФормы.МенюДереваЗапросов.Кнопки.ДобавитьПапку.Доступность = Ложь;
		ЭлементыФормы.МенюДереваЗапросов.Кнопки.ПеренестиСтрокуДереваВКорень.Доступность = Ложь;
		ЭлементыФормы.МенюДереваЗапросов.Кнопки.ПоместитьВоВременныеТаблицы.Доступность = Ложь;
		ЭлементыФормы.ДеревоЗапросов.ТолькоПросмотр = Истина;
		
		Кнопки = ЭлементыФормы.КоманднаяПанельФормы.Кнопки;
		Кнопки.НовыйФайл.Доступность = Ложь;
		Кнопки.ОткрытьФайл.Доступность = Ложь;
		Кнопки.Сохранить.Доступность = Ложь;
		Кнопки.Настройки.Доступность = Ложь;
		//Кнопки.ПеренестиСтрокуДерева.Доступность = Ложь;
		
		Кнопки = ЭлементыФормы.КоманднаяПанельФормы.Кнопки.Файл.Кнопки;
		Кнопки.НовыйФайл.Доступность = Ложь;
		Кнопки.ОткрытьФайл.Доступность = Ложь;
		Если Кнопки.Найти("ОткрытьПоследние") <> Неопределено Тогда
			Кнопки.ОткрытьПоследние.Доступность = Ложь; // Не имеет эффекта, у подменю всегда Истина остается
			Кнопки.Удалить(Кнопки.ОткрытьПоследние);
		КонецЕсли; 
		Кнопки.ОбъединитьФайл.Доступность = Ложь;
		Кнопки.Сохранить.Доступность = Ложь;
		Кнопки.Настройки.Доступность = Ложь;
	КонецЕсли; 
	Если мОбъектЗапроса.МенеджерВременныхТаблиц = Неопределено Тогда
		мОбъектЗапроса.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
	Иначе
		ОбновитьТабличноеПолеВременныхТаблиц();
	КонецЕсли;
	Если Не (Ложь
		Или мРежимОтладки // Было закомментировано
		//Или мРежимРедактораЗапроса
		Или ДеревоЗапросов.Строки.Количество() > 0)
	Тогда
		ОписаниеФайлаВосстановления = Новый Структура;
		ИмяФайлаВосстановления = ирКлиент.ПроверитьВыбратьФайлВосстановленияКонсолиЛкс(мСтруктураВосстановления, ОписаниеФайлаВосстановления);
		Если ИмяФайлаВосстановления <> "" Тогда
			мИмяОткрытогоФайла = ИмяФайлаВосстановления;
		Иначе
			// Попытаемся загрузить последний открывавшийся файл
			мИмяОткрытогоФайла = ирОбщий.ВосстановитьЗначениеЛкс(Метаданные().Имя + "_ИмяФайла");
			Если мИмяОткрытогоФайла = НеОпределено Тогда
				мИмяОткрытогоФайла = "";
			КонецЕсли;
		КонецЕсли;
		Если ПустаяСтрока(мИмяОткрытогоФайла) Тогда
			СоздатьФайл();
		Иначе
			ЗагрузитьЗапросыИзФайла(, мИмяОткрытогоФайла = ИмяФайлаВосстановления);
		КонецЕсли;
		Если ИмяФайлаВосстановления <> "" Тогда
			ЭтаФорма.Модифицированность = Истина;
			мИмяОткрытогоФайла = ирКлиент.ПослеВосстановленияФайлаКонсолиЛкс(ОписаниеФайлаВосстановления);
		КонецЕсли; 
		#Если Сервер И Не Сервер Тогда
			СохранитьФайлДляВосстановленияПериодически();
		#КонецЕсли
		ПодключитьОбработчикОжидания("СохранитьФайлДляВосстановленияПериодически", 30);
	Иначе
		ПриИзмененииДереваЗапросов();
	КонецЕсли;
	мИсторияФайлов = ирОбщий.ВосстановитьЗначениеЛкс(Метаданные().Имя + "_ИсторияФайлов");
	Если мИсторияФайлов = Неопределено Тогда
		мИсторияФайлов = Новый СписокЗначений;
	КонецЕсли;
	ОбновитьПодменюИсторииФайлов();
	ОбновитьДоступностьКнопкиОтключиться();
	Если мРежимРедактораЗапроса Тогда
		ПолеТекстаЗапроса.РежимКомпоновкиДанных = (мТекущаяСтрокаДереваЗапросов.ТипЗапроса = "Компоновка");
	КонецЕсли;
	Если мРежимОтладки Тогда
		ЭлементыФормы.КоманднаяПанельФормы.Кнопки.УдалитьВременныеТаблицы.Доступность = Ложь;
		Если Истина
			И ВключатьДеревоЗапросаПриОтладке
			И СтрДлина(ПолеТекстаЗапроса.ПолеТекста.ПолучитьТекст()) < 30000 
		Тогда
			КоманднаяПанельФормыРежимДереваЗапроса();
		КонецЕсли; 
		// Баг платформы https://partners.v8.1c.ru/forum/t/1356801/m/1356801
		//ПодключитьОбработчикОжидания("ВключитьРежимДереваЗапросаОтложенно", 0.1, Истина);
		
		//Если Истина
		//	И ирОбщий.СтрокиРавныЛкс(мТекущаяСтрокаДереваЗапросов.ТипЗапроса, "ADO")
		//	И ЗначениеЗаполнено(мТекущаяСтрокаДереваЗапросов.ПлатформаADO)
		//Тогда
		//	ПлатформаADOПриИзменении();
		//КонецЕсли;
		//Если мТекущаяСтрокаДереваЗапросов <> Неопределено Тогда
		Если мЗапросЗагруженВКонсоль Тогда
			// Это нужно для предотвращения наложения ограничения типов на значения параметров. Но так не будет открываться системное окно поиска.
			Параметры.Колонки.Удалить("Значение");
			Параметры.Колонки.Добавить("Значение");
			ирОбщий.ЗагрузитьВТаблицуЗначенийЛкс(мТекущаяСтрокаДереваЗапросов.ПараметрыЗапроса, Параметры,,, Истина);
			Для Каждого СтрокаПараметра Из Параметры Цикл
				ирОбщий.ОбновитьКопиюСвойстваВНижнемРегистреЛкс(СтрокаПараметра, "ИмяПараметра");
				ОбновитьТипЗначенияВСтрокеПараметровВФорме(СтрокаПараметра);
			КонецЦикла;
		КонецЕсли; 
	КонецЕсли;
	
	// Антибаг платформы http://www.hostedredmine.com/issues/883933 , в немодальном режиме тоже помогает избежать лишних поломок привязок
	#Если Сервер И Не Сервер Тогда
		ПослеОткрытия();
	#КонецЕсли
	ПодключитьОбработчикОжидания("ПослеОткрытия", 0.1, Истина);
	
	ЭлементыФормы.РезультатТабДокСвод.ТекущаяОбласть = ЭлементыФормы.РезультатТабДокСвод.Область(1,1);
	УстановитьРежимВыполненияКодаНаСервере();
	
	// Антибаг конфигуратора http://www.hostedredmine.com/issues/862503
	ЭлементыФормы.КП_СвойстваСтрокиРезультата.Видимость = Ложь;
	ЭлементыФормы.МенюДереваЗапросов.Видимость = Ложь;
	ЭлементыФормы.МенюДереваЗапроса.Видимость = Ложь;
	ЭлементыФормы.КП_ТаблицаПакета.Видимость = Ложь;
	
	ирКлиент.ДопСвойстваЭлементаФормыЛкс(ЭтаФорма, ЭлементыФормы.ДеревоЗапроса).МенеджерПоиска = ирКлиент.СоздатьМенеджерПоискаВТабличномПолеЛкс(,,, Истина,, "ДеревоЗапросов");
	ПереподключитьОбработчикОжиданияОчисткиМВТ();
	мАнализТехножурнала = ирОбщий.СоздатьОбъектПоИмениМетаданныхЛкс("Обработка.ирАнализТехножурнала");
	
КонецПроцедуры

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

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

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

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

Процедура ВключитьРежимДереваЗапросаОтложенно()
	
	КоманднаяПанельФормыРежимДереваЗапроса();

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

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

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

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

Процедура ВыполнитьОбработкуСтрокРезультата(ТекстДляВыполнения)

	Если флРаботатьВТранзакции Тогда
		НачатьТранзакцию();
	КонецЕсли;
	Попытка
		Продолжать = Истина;
		ВремяНачалаОбработки = ТекущаяДата();
		Если ТипЗнч(мРезультатЗапроса) = Тип("РезультатЗапроса") Тогда
			ВыборкаРезультата = мРезультатЗапроса.Выбрать();
			КоличествоОбщее = ВыборкаРезультата.Количество();
		Иначе
			//! мРезультатЗапроса = 0; // COMОбъект
			Попытка
				КоличествоОбщее = мРезультатЗапроса.Count;
			Исключение
				КоличествоОбщее = мРезультатЗапроса.RecordCount;
			КонецПопытки
		КонецЕсли; 
		Если ТолькоВыделенные Тогда
			МассивСтрок = ирКлиент.ВыделенныеСтрокиТабличногоПоляЛкс(ЭлементыФормы.РезультатКоллекция);
			СтрокиДляОбработки = ирКлиент.ТаблицаИлиДеревоЗначенийИзТаблицыФормыСКоллекциейЛкс(ЭлементыФормы.РезультатКоллекция, МассивСтрок);
			КоличествоОбщее = СтрокиДляОбработки.Количество();
		Иначе
			СтрокиДляОбработки = РезультатКоллекция;
		КонецЕсли; 
		ВсеСчитано = КоличествоОбщее = СтрокиДляОбработки.Количество();
		Если Не ВсеСчитано И НаСервере Тогда
			ирОбщий.СообщитьЛкс("Для выполнения обработки строк результата на сервере необходимо загрузить результат полностью");
			Если флРаботатьВТранзакции Тогда
				ОтменитьТранзакцию();
			КонецЕсли;
			Возврат;
		КонецЕсли; 
		Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоличествоОбщее);
		ТекстДляВыполнения = ТекстУстановкиПараметровОбработчикаСтрокиРезультата() + ТекстДляВыполнения;
		СтруктураПараметров = ПолучитьСтруктуруПараметров();
		НомерСтроки = 0;
		Если Ложь
			Или ТипЗнч(мРезультатЗапроса) = Тип("РезультатЗапроса") 
			Или ЭтаФорма.мСоединениеADO <> Неопределено
		Тогда
			Если ВсеСчитано Тогда
				РазмерПорции = 20;
				НомерСтроки = 1;
				ПодключитьОбработчикОжидания("УдалитьВременноеХранилище", 0.1, Истина);
				мАдресТаблицыРезультата = ПоместитьВоВременноеХранилище(СтрокиДляОбработки, Новый УникальныйИдентификатор);
				Пока НомерСтроки <= СтрокиДляОбработки.Количество() Цикл
					ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
					ирОбщий.ОбработатьПорциюСтрокТаблицыЛкс(мАдресТаблицыРезультата, НомерСтроки, РазмерПорции, МодальныйРежим, флПропускатьОшибки, ТекстДляВыполнения, СтруктураПараметров, НаСервере);
					НомерСтроки = Мин(НомерСтроки + РазмерПорции, КоличествоОбщее + 1);
					Попытка
						Индикатор.Счетчик = НомерСтроки - 1;
					Исключение
						// Строка могла быть удалена, если например открывался модальный диалог
					КонецПопытки; 
				КонецЦикла;
			Иначе
				Пока ВыборкаРезультата.Следующий() Цикл
					НомерСтроки = НомерСтроки + 1;
					ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
					Попытка
						ирОбщий.ВыполнитьАлгоритм(ТекстДляВыполнения, ,, СтруктураПараметров, ВыборкаРезультата, НомерСтроки = 1, НомерСтроки = РазмерРезультата);
					Исключение
						Если Не флПропускатьОшибки Тогда
							ирОбщий.СообщитьЛкс("Ошибка обработки выборки результата запроса");
							ВызватьИсключение 
						КонецЕсли;
						ирОбщий.СообщитьСУчетомМодальностиЛкс("Строка выборки №" + НомерСтроки + ": " + ОписаниеОшибки(), МодальныйРежим);
					КонецПопытки;
				КонецЦикла; 
			КонецЕсли; 
		Иначе // WMI
			ирОбщий.СообщитьЛкс("Выполняем обработку строк результата на клиенте, т.к. результат загружен не полностью");
			Для Каждого СтрокаРезультата Из мВыборкаРезультата Цикл
				НомерСтроки = НомерСтроки + 1;
				ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
				Попытка
					ирОбщий.ВыполнитьАлгоритм(ТекстДляВыполнения, ,, СтруктураПараметров, СтрокаРезультата, НомерСтроки = 1, НомерСтроки = РазмерРезультата);
				Исключение
					Если Не флПропускатьОшибки Тогда
						ВызватьИсключение 
					КонецЕсли;
					ирОбщий.СообщитьСУчетомМодальностиЛкс("Строка результата №" + (мВыборкаРезультата.ItemIndex(СтрокаРезультата) + 1) + ": " + ОписаниеОшибки(), МодальныйРежим);
				КонецПопытки;
			КонецЦикла;
		КонецЕсли; 
		ирОбщий.ОсвободитьИндикаторПроцессаЛкс(, Истина);
	Исключение
		Если флРаботатьВТранзакции Тогда 
			ОтменитьТранзакцию();
		КонецЕсли; 
		ВызватьИсключение;
	КонецПопытки;
	Если флРаботатьВТранзакции Тогда
		ЗафиксироватьТранзакцию();
	КонецЕсли;

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

Процедура УдалитьВременноеХранилище()
	Попытка
		УдалитьИзВременногоХранилища(мАдресТаблицыРезультата);
	Исключение
	КонецПопытки; 
КонецПроцедуры

Функция ТекстУстановкиПараметровОбработчикаСтрокиРезультата()
	
	Возврат "Параметры = _П0; СтрокаРезультата = _П1; ЭтоПервыйЭлемент = _П2; ЭтоПоследнийЭлемент = _П3;";

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

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

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

Функция ВыполнитьЗапросИсточникаДанных(ТекстЗапроса, пЗагружатьЭлементов = 0, ВыводитьСообщения = Истина, СохранитьДляОтложеннойОтладки = Ложь, выхРезультатПакета = Неопределено,
	выхРезультатПоИменам = Неопределено, Знач ПредыдущийТекстПолногоЗапроса = "") Экспорт 
	
	выхРезультатПакета = Неопределено;
	выхРезультатПоИменам = Неопределено;
	Если ирОбщий.СтрокиРавныЛкс(мТекущаяСтрокаДереваЗапросов.ТипЗапроса, "WQL") Тогда
		WMIЗапрос = ПолучитьWMIСлужбу();
		Результат = WMIЗапрос.ExecQuery(ТекстЗапроса);
	ИначеЕсли ирОбщий.СтрокиРавныЛкс(мТекущаяСтрокаДереваЗапросов.ТипЗапроса, "ADO") Тогда
		ИсточникДанныхADO = ПолучитьИсточникДанныхADO();
		СтруктураЗапросаADO = Новый Структура();
		//СтруктураЗапросаADO.Вставить("ПараметрыЗапроса", мОбъектЗапроса.Параметры);
		СтруктураЗапросаADO.Вставить("СпособВыгрузки", 1); // способ выгрузки результата запроса по умолчанию
		СтруктураЗапросаADO.Вставить("ИзменятьРезультат", Ложь); // признак изменения результата выгрузки запроса в форме консоли
		СтруктураЗапросаADO.Вставить("ИсточникДанных", ИсточникДанныхADO); // структура с параметрами источника данных
		ОпцииADO = ОпцииЗапросаADOПоУмолчанию();
		ОпцииADO.MaxRecords = пЗагружатьЭлементов;
		ОпцииADO.RecordsetUse = Ложь;  // Выполнить через Command или Recordset
		ОпцииADO.РезультатADOВРезультатЗапросаGWF = ИспользованиеGWF = 2;
		ОпцииADO.NamedParameters = ЭтаФорма.ИменованныеПараметрыADO;
		СтруктураЗапросаADO.Вставить("стОпции", ОпцииADO); // служебная колонка со структурой опций выполнения запроса
		СтруктураЗапросаADO.Вставить("спПараметры", Неопределено); // служебная колонка со списком параметров запроса
		СтруктураЗапросаADO.Вставить("ТекстЗапроса", ТекстЗапроса);
		Результат = ЗапросADOВыполнить(СтруктураЗапросаADO, Параметры,, ВыводитьСообщения, выхРезультатПакета, ПредыдущийТекстПолногоЗапроса);
		ОбновитьДоступностьКнопкиОтключиться();
	Иначе
		СтарыйТекстЗапроса = мОбъектЗапроса.Текст;
		мОбъектЗапроса.Текст = ТекстЗапроса;
		Если СохранитьДляОтложеннойОтладки Тогда
			ИмяОтложенногоОбъекта = мТекущаяСтрокаДереваЗапросов.Запрос;
			Если Не ВвестиЗначение(ИмяОтложенногоОбъекта, "Введите имя объекта для отладки. Отмена - автоимя.", Тип("Строка")) Тогда 
				ИмяОтложенногоОбъекта = "";
			КонецЕсли; 
			РезультатОтложения = ирОбщий.ОтладитьЛкс(мОбъектЗапроса,,,, Истина,,, ИмяОтложенногоОбъекта);
			ирОбщий.СообщитьЛкс(РезультатОтложения);
		Иначе
			Попытка
				Результат = мОбъектЗапроса.ВыполнитьПакет();
			Исключение
				мОбъектЗапроса.Текст = СтарыйТекстЗапроса;
				Если ВыводитьСообщения Тогда
					ВызватьИсключение;
				КонецЕсли; 
			КонецПопытки;
		КонецЕсли; 
		мОбъектЗапроса.Текст = СтарыйТекстЗапроса;
		выхРезультатПакета = Результат;
	КонецЕсли;
	Если выхРезультатПакета <> Неопределено Тогда
		выхРезультатПоИменам = мПлатформа.СтруктураРезультатаПакетногоЗапроса(ТекстЗапроса, ПолеТекстаЗапроса.мПараметрыДиалектаSQL.СтрочныйКомментарий);
	КонецЕсли; 
	Возврат Результат;
	
КонецФункции

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

Процедура УничтожитьКомпоненты() Экспорт
	
	Если Не мРежимОтладки Тогда
		ОтключитьИсточникДанныхADO();
	КонецЕсли; 
	// +++.КЛАСС.ПолеТекстаПрограммы
	// Уничтожение всех экземпляров компоненты. Обязательный блок.
	Если ПоляТекстовПрограммы <> Неопределено Тогда
		Для Каждого Экземпляр Из ПоляТекстовПрограммы Цикл
			Экземпляр.Значение.Уничтожить();
		КонецЦикла;
	КонецЕсли; 
	// ---.КЛАСС.ПолеТекстаПрограммы

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

Функция УдалитьВременныеТаблицыADO()

	// Оставляем в менеджере временных таблиц только те таблицы, которые существовали на момент подключения к источнику данных
	Для Каждого КлючИЗначение Из мСозданныеВременныеТаблицыADO Цикл
		УдалитьВременнуюТаблицу(КлючИЗначение.Значение);
	КонецЦикла;
	мСозданныеВременныеТаблицыADO.Очистить();
	Возврат Неопределено;

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

Процедура УдалитьВременнуюТаблицу(ИмяВременнойТаблицы)
	
	ВыполнитьЗапросИсточникаДанных("DROP TABLE " + ИмяВременнойТаблицы,, Ложь);
	ВыполнитьЗапросИсточникаДанных("DROP " + ИмяВременнойТаблицы,, Ложь);
	
КонецПроцедуры

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

// @@@.КЛАСС.ПолеТекстаПрограммы
// Процедура служит для выполнения программы поля текстового документа в локальном контексте.
// Вызывается из компоненты ирКлсПолеТекстаПрограммы в режиме внутреннего языка.
//
// Параметры:
//  ТекстДляВыполнения - Строка;
//  *ЛиСинтаксическийКонтроль - Булево, *Ложь - признак вызова только для синтаксического контроля.
//
Функция ВыполнитьЛокальноКодПередВыполнениемЗапроса(ТекстДляВыполнения, ЛиСинтаксическийКонтроль = Ложь) Экспорт

	Есть_ОбъектыДанныхТранзакции = Параметры.Найти("_ОбъектыДанныхТранзакции", "ИмяПараметра") <> Неопределено;
	Если НаСервере И Есть_ОбъектыДанныхТранзакции Тогда
		ирОбщий.СообщитьЛкс("Обработчик перед выполнением запроса выполнен на клиенте из-за наличия сложного параметра _ОбъектыДанныхТранзакции");
	КонецЕсли;
	Если Истина
		И НаСервере 
		И ПолучитьОбъектЗапроса() = мОбъектЗапроса 
		И Не Есть_ОбъектыДанныхТранзакции 
	Тогда
		ПолеТекстаПрограммы = ПоляТекстовПрограммы.КодПередВыполнениемЗапроса;
		#Если Сервер И Не Сервер Тогда
			ПолеТекстаПрограммы = Обработки.ирКлсПолеТекстаПрограммы.Создать();
			ирОбщий.СтруктураОбъектаДляОтладкиЛкс();
		#КонецЕсли
		ТекстДляВыполнения = 
			"СтруктураЗапроса = ЗначениеИзСтрокиВнутр(_П0);
			|Параметры = СтруктураЗапроса.Параметры;
			|мОбъектЗапроса = ирОбщий.ЗапросИзСтруктурыБезВременныхТаблицЛкс(СтруктураЗапроса);
			|" + ТекстДляВыполнения + "
			|_П1 = ирОбщий.СтруктураОбъектаДляОтладкиЛкс(мОбъектЗапроса);";
		СнимокЗапроса = Неопределено;
		СтруктураПараметров = ирОбщий.ЗапросВСтруктуруБезВременныхТаблицЛкс(мОбъектЗапроса);
		СтруктураПараметров = ЗначениеВСтрокуВнутр(СтруктураПараметров); // Антибаг платформы https://www.hostedredmine.com/issues/963727
		ирСервер.ВыполнитьАлгоритм(ТекстДляВыполнения,,, СтруктураПараметров, СнимокЗапроса);
		ирОбщий.ЗапросИзСтруктурыЛкс(СнимокЗапроса.Объект,, мОбъектЗапроса);
	Иначе
		ТекстДляВыполнения = "Параметры = _П0; мОбъектЗапроса = _П1;" + ТекстДляВыполнения;
		ирОбщий.ВыполнитьАлгоритм(ТекстДляВыполнения,,, ПолучитьСтруктуруПараметров(), ПолучитьОбъектЗапроса());
	КонецЕсли;

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

// @@@.КЛАСС.ПолеТекстаПрограммы
// Процедура служит для выполнения программы поля текстового документа в локальном контексте.
// Вызывается из компоненты ирКлсПолеТекстаПрограммы в режиме внутреннего языка.
//
// Параметры:
//  ТекстДляВыполнения - Строка;
//  *ЛиСинтаксическийКонтроль - Булево, *Ложь - признак вызова только для синтаксического контроля.
//
Функция ВыполнитьЛокальноКодОбработкиРезультата(ТекстДляВыполнения, ЛиСинтаксическийКонтроль = Ложь) Экспорт

	Если НаСервере Тогда
		// Сериализация нужна из-за отсутствия автосериализации РезультатЗапроса в управляемом приложении http://www.hostedredmine.com/issues/883928
		ПараметрыОбработчика = Новый Структура;
		ПараметрыОбработчика.Вставить("Параметры", ЗначениеВСтрокуВнутр(ПолучитьСтруктуруПараметров()));
		ПараметрыОбработчика.Вставить("мРезультатЗапроса", ЗначениеВСтрокуВнутр(мРезультатЗапроса));
		ПараметрыОбработчика.Вставить("мРезультатПакета", ЗначениеВСтрокуВнутр(мРезультатПакета));
		ПараметрыОбработчика.Вставить("мРезультатПоИменам", ЗначениеВСтрокуВнутр(мРезультатПоИменам));
		Для Каждого КлючИЗначение Из ПараметрыОбработчика Цикл
			ТекстДляВыполнения = КлючИЗначение.Ключ + " = ЗначениеИзСтрокиВнутр(_АлгоритмОбъект." + КлючИЗначение.Ключ + "); " + ТекстДляВыполнения;
		КонецЦикла;
		ирСервер.ВыполнитьАлгоритм(ТекстДляВыполнения, ПараметрыОбработчика);
	Иначе
		ТекстДляВыполнения = "Параметры = _П0; мРезультатЗапроса = _П2; мРезультатПакета = _П3; мРезультатПоИменам = _П4;" + ТекстДляВыполнения;
		ирОбщий.ВыполнитьАлгоритм(ТекстДляВыполнения, , , ПолучитьСтруктуруПараметров(), , мРезультатЗапроса, мРезультатПакета, мРезультатПоИменам);
	КонецЕсли; 

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

Процедура УправлениеКолонкамиПараметры()

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

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

Процедура КоманднаяПанельФормыУдалитьВременныеТаблицы(Кнопка)
	
	ПересоздатьМенеджерВременныхТаблиц(Истина);
	
КонецПроцедуры

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

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

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

	Если ОбновитьНастройки Тогда
		УстановитьТипЗапроса(,,ТекстЗапроса , ДобавитьВыборкуИзВременнойТаблицы);
	КонецЕсли; 
	Возврат Истина;

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

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

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

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

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

// Результат - ТаблицаЗначений(Имя, ТипЗначения)
Функция ПолучитьПараметрыИзТекстаЗапроса(Знач СтартоваяСтрока, ТекстЗапроса = "", ПривестиИменаКНижнемуРегистру = Ложь, выхИнформацияОбОшибке = Неопределено, СообщитьОшибку = Истина)
	
	ПараметрыЗапроса = Новый ТаблицаЗначений;
	ПараметрыЗапроса.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка"));
	ПараметрыЗапроса.Колонки.Добавить("ТипЗначения", Новый ОписаниеТипов("ОписаниеТипов"));
	Если ирОбщий.СтрокиРавныЛкс(мТекущаяСтрокаДереваЗапросов.ТипЗапроса, "ADO") Тогда 
		ПрефиксПараметра = ПолеТекстаЗапроса.ПрефиксПараметра();
		Если ЗначениеЗаполнено(ПрефиксПараметра) Тогда
			мРегВыражение = мПлатформа.мРегВыражение; 
			мРегВыражение.Pattern = "\" + ПрефиксПараметра + "(\w*)";
			Вхождения = мРегВыражение.НайтиВхождения(ТекстЗапроса);
			Для Каждого Вхождение Из Вхождения Цикл
				СтрокаПараметра = ПараметрыЗапроса.Добавить();
				СтрокаПараметра.Имя = Вхождение.Submatches(0);
				Если Не ЗначениеЗаполнено(СтрокаПараметра.Имя) Тогда
					СтрокаПараметра.Имя = "_" + XMLСтрока(ПараметрыЗапроса.Количество() - 1);
				КонецЕсли; 
			КонецЦикла;
		КонецЕсли; 
	ИначеЕсли ирОбщий.СтрокиРавныЛкс(мТекущаяСтрокаДереваЗапросов.ТипЗапроса, "WQL") Тогда 
	Иначе
		Если ЗначениеЗаполнено(ТекстЗапроса) Тогда
			мОбъектЗапроса.Текст = ТекстЗапроса;
		КонецЕсли; 
		Попытка
			ОписаниеПараметров = мОбъектЗапроса.НайтиПараметры();
		Исключение
			ОписаниеПараметров = Неопределено;
			выхИнформацияОбОшибке = ИнформацияОбОшибке();
			Если СообщитьОшибку Тогда
				ирКлиент.ПоказатьОшибкуВТекстеПрограммыЛкс(ПолеТекстаЗапроса.ПолеТекста, СтартоваяСтрока, , Истина, МодальныйРежим, выхИнформацияОбОшибке,,, ЭтаФорма);
			КонецЕсли; 
		КонецПопытки;
		Если ОписаниеПараметров <> Неопределено Тогда
			Для Каждого ОписаниеПараметра Из ОписаниеПараметров Цикл
				ЗаполнитьЗначенияСвойств(ПараметрыЗапроса.Добавить(), ОписаниеПараметра); 
			КонецЦикла;
		КонецЕсли; 
	КонецЕсли; 
	Если ПривестиИменаКНижнемуРегистру Тогда
		Для Каждого СтрокаПараметра Из ПараметрыЗапроса Цикл
			СтрокаПараметра.Имя = НРег(СтрокаПараметра.Имя);
		КонецЦикла;
	КонецЕсли; 
    Возврат ПараметрыЗапроса;

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

Функция ОбновитьКомпоновщик(Знач НезамаскированныйТекстЗапроса, ПоказыватьОшибки = Ложь)

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

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

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

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

Функция ОбновитьПостроитель(ТекстЗапроса, ПоказыватьОшибки = Ложь)

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

КонецФункции // ОбновитьПостроитель()

// Обработчик нажатия кнопки командной панели "Дополнить из запроса"
//
Процедура КоманднаяПанельФормыПолучитьИзЗапроса(Кнопка)
	
	ПроверитьКорректностьТекстаЗапросаИЗаполнитьПараметры(); 
	
КонецПроцедуры

Функция СкопироватьТекущийПодзапросВНовыйЗапрос(Знач Смещение = 1)

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ПоказатьТекстПодзапроса()

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

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

Процедура СоздатьВременныеТаблицы(СтрокаДереваЗапроса)

	мПлатформа = ирКэш.Получить();
	#Если Сервер И Не Сервер Тогда
		мПлатформа = Обработки.ирПлатформа.Создать();
	#КонецЕсли
	// Создадим служебные временные таблицы
	Для Каждого ДочерняяСтрока Из СтрокаДереваЗапроса.Строки Цикл
		Если ДочерняяСтрока.ТипУзла = "<InUnion>" Тогда 
			Продолжить;
		КонецЕсли;
		Если ДочерняяСтрока.ТипУзла <> "<FromUnion>" Тогда 
			СоздатьВременныеТаблицы(ДочерняяСтрока);
		Иначе
			ВременныйПостроительЗапроса = Новый ПостроительЗапроса;
			Попытка
				ТекстЗапроса = мПлатформа.ЗамаскироватьВременныеТаблицы(мОбъектЗапроса, РазвернутьВложенныеЗапросы(ДочерняяСтрока));
			Исключение
				ирКлиент.ПоказатьОшибкуВТекстеПрограммыЛкс(ПолеТекстаЗапроса.ПолеТекста, , , Истина, МодальныйРежим, ИнформацияОбОшибке(),,, ЭтаФорма);
				Возврат;
			КонецПопытки;
			Попытка 
				ВременныйПостроительЗапроса.Текст = ТекстЗапроса;
			Исключение
				ОписаниеОшибки = ОписаниеОшибки();
				Если Найти(ОписаниеОшибки, "Ожидается псевдоним запроса") > 0 Тогда
					// Сюда попадаем, когда у временной таблицы нет псевдонима
					//ирОбщий.СообщитьСУчетомМодальностиЛкс("В запросе присутствуют временные таблицы без псевдонимов. "
					//	+ "Корректная работа программы возможна только при наличии у каждой временной таблицы псевдонима",
					//ирОбщий.СообщитьСУчетомМодальностиЛкс("В запросе присутствуют временные таблицы без псевдонимов. "
					//	+ "Для максимальной функциональности рекомендуется задать каждой временной таблице псевдоним",
					//	МодальныйРежим, СтатусСообщения.Внимание);
					ирОбщий.СообщитьСУчетомМодальностиЛкс("В запросе присутствуют временные таблицы без псевдонимов. "
						+ "Для максимальной функциональности рекомендуется задать каждой временной таблице псевдоним",
						0, СтатусСообщения.Внимание);
				КонецЕсли; 
				Продолжить;
			КонецПопытки;
			ВременныйПостроительЗапроса.ЗаполнитьНастройки();
			КоллекцияПолей = Новый Массив;
			Для Каждого ВыбранноеПоле Из ВременныйПостроительЗапроса.ВыбранныеПоля Цикл
				ДоступноеПоле = ирОбщий.НайтиПолеНастройкиПоПутиКДаннымЛкс(ВременныйПостроительЗапроса.ДоступныеПоля, ВыбранноеПоле.ПутьКДанным);
				ТипЗначения = ДоступноеПоле.ТипЗначения;
				#Если Сервер И Не Сервер Тогда
				    ТипЗначения = Новый ОписаниеТипов;
				#КонецЕсли
				Если Истина
					И ТипЗначения.КвалификаторыЧисла.Разрядность > 38
				Тогда
					// Антибаг платформы 8.2 https://partners.v8.1c.ru/forum/t/1417281/m/1417281, http://forum.infostart.ru/forum24/topic21000/message1448676/#message1448676
					КвалификаторыЧисла = Новый КвалификаторыЧисла(38, ТипЗначения.КвалификаторыЧисла.РазрядностьДробнойЧасти);
					ТипЗначения = Новый ОписаниеТипов(ТипЗначения,,, КвалификаторыЧисла);
				КонецЕсли; 
				Поле = Новый Структура;
				Поле.Вставить("Имя", ВыбранноеПоле.Имя);
				Поле.Вставить("ТипЗначения", ТипЗначения);
				КоллекцияПолей.Добавить(Поле);
			КонецЦикла;
			ВыполнитьЗапросИсточникаДанных(ирОбщий.ЗапросИмитаторКоллекцииПолейЛкс(КоллекцияПолей) + " INTO " + ДочерняяСтрока.ИмяСРодителем);
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры // СоздатьВременныеТаблицы()

Процедура ДеревоЗапросаПриАктивизацииСтроки(Элемент = Неопределено) Экспорт 
	
	Перем НачальнаяСтрока, НачальнаяКолонка, КонечнаяСтрока, КонечнаяКолонка; 
	#Если Сервер И Не Сервер Тогда
		ПолеТекстаЗапроса = Обработки.ирКлсПолеТекстаПрограммы.Создать();
	#КонецЕсли
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);
	Элемент = ЭлементыФормы.ДеревоЗапроса;
	ТекущаяСтрока = Элемент.ТекущаяСтрока;
	ПроверитьВключитьРедактированиеУзлаСтруктурыЗапроса();
	Если мСтруктурноеРедактирование И мТекущаяСтрокаДереваЗапроса <> Неопределено Тогда
		ПолеТекстаЗапроса.ПолеТекста.ПолучитьГраницыВыделения(НачальнаяСтрока, НачальнаяКолонка, КонечнаяСтрока, КонечнаяКолонка);
		мТекущаяСтрокаДереваЗапроса.ТекущееВыделение = Новый Структура("НачальнаяСтрока, НачальнаяКолонка, КонечнаяСтрока, КонечнаяКолонка",
			НачальнаяСтрока, НачальнаяКолонка, КонечнаяСтрока, КонечнаяКолонка);
		УничтожитьВременныеТаблицыПодзапроса(мТекущаяСтрокаДереваЗапроса);
	КонецЕсли;
	Если Истина
		И мРедактируемыйУзел <> Неопределено
		И мРедактируемыйУзел = мТекущаяСтрокаДереваЗапроса 
	Тогда
		мРедактируемыйТекстУзла = ПолеТекстаЗапроса.ПолеТекста.ПолучитьТекст();
	КонецЕсли; 
	КнопкиПодменю = ЭлементыФормы.МенюДереваЗапроса.Кнопки;
	КнопкиПодменю.ПоказатьСтруктуруХранения.Доступность = Истина
		И ТекущаяСтрока <> Неопределено
		И ТекущаяСтрока.ТипУзла = "<TableWithName>";
	КнопкиПодменю.ОткрытьФормуСписка.Доступность = Истина
		И ТекущаяСтрока <> Неопределено
		И ТекущаяСтрока.ТипУзла = "<TableWithName>";
	КнопкиПодменю.ПерейтиКОпределению.Доступность = Истина
		И ТекущаяСтрока <> Неопределено
		И ТекущаяСтрока.ТипУзла = "<TableWithName>";
	ДоступностьКомандПодзапроса = Истина
		И мСтруктурноеРедактирование
		И ТекущаяСтрока <> Неопределено
		И (Ложь
			Или ТекущаяСтрока.ТипУзла = "<FromUnion>"
			Или ТекущаяСтрока.ТипУзла = "<InUnion>"
			);
	КнопкиПодменю.ПеренестиВНовыйЗапрос.Доступность = ДоступностьКомандПодзапроса;
	КнопкиПодменю.ПодкраситьЗависимыеЗапросы.Доступность = ЭтоСтрокаСозданияВременнойТаблицы();
	
	ДоступностьКомандТаблицы = Истина  
		И мСтруктурноеРедактирование
		И ТекущаяСтрока <> Неопределено
		И ТекущаяСтрока.СтрокаДанных <> Неопределено
		И (Ложь
			Или ТекущаяСтрока.ТипУзла = "<TableWithName>"
			Или ТекущаяСтрока.ТипУзла = "<FromUnion>"
			Или ТекущаяСтрока.ТипУзла = "<SelectRoot>");
	КнопкиПодменю.ПреобразоватьВПодзапрос.Доступность = ДоступностьКомандТаблицы;
	КнопкиПодменю.ВстроитьИзПодзапроса.Доступность = Истина
		И ТекущаяСтрока <> Неопределено
		И ДоступностьКомандПодзапроса
		И ТекущаяСтрока.Строки.Количество() = 1
		И (Ложь
			Или ТекущаяСтрока.Строки[0].ТипУзла = "<TableWithName>"
			Или ТекущаяСтрока.Строки[0].ТипУзла = "<FromUnion>");
	Если ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;
	//СтрокаЗапросаСоздания = НайтиСтрокуДереваСозданияВременнойТаблицы(ТекущаяСтрока.Текст);
	//КнопкиПодменю.ПерейтиКОпределению.Доступность = ДоступностьКомандТаблицы; //И СтрокаЗапросаСоздания <> Неопределено;
	
	ЗапомнитьИсточникПереходаФормы();
	мТекущаяСтрокаДереваЗапроса = ТекущаяСтрока;
	
	// Подменю "Зависимые запросы"
	КнопкиЗависимыеЗапросы = КнопкиПодменю.ЗависимыеЗапросы.Кнопки;
	КнопкиЗависимыеЗапросы.Очистить();
	КнопкиПодменю.ЗависимыеЗапросы.Доступность = ЭтоСтрокаСозданияВременнойТаблицы();
	Если КнопкиПодменю.ЗависимыеЗапросы.Доступность Тогда
		ИмяВременнойТаблицыДляОтображенияЗависимых = мТекущаяСтрокаДереваЗапроса.НИмяОсновнойТаблицы;
		ЗависимыеСтрокиДерева = Новый СписокЗначений;
		ВсеСтрокиДерева = ДеревоЗапроса.Строки.НайтиСтроки(Новый Структура("ТипУзла",  "<TableWithName>"), Истина);
		Для Каждого СтрокаДерева Из ВсеСтрокиДерева Цикл
			Если Истина
				И ирОбщий.СтрокиРавныЛкс(СтрокаДерева.Текст, ИмяВременнойТаблицыДляОтображенияЗависимых) 
				И СтрокаДерева.Родитель.Родитель <> Неопределено
			Тогда
				Родитель = СтрокаДерева.Родитель;
				Пока Родитель.Родитель <> ДеревоЗапроса.Строки[0] Цикл
					Родитель = Родитель.Родитель;
				КонецЦикла;
				ИндексРодителя = Родитель.Родитель.Строки.Индекс(Родитель);
				Если ЗависимыеСтрокиДерева.НайтиПоЗначению(ИндексРодителя) = Неопределено Тогда
					ЗависимыеСтрокиДерева.Добавить(ИндексРодителя, Родитель.Представление);
				КонецЕсли; 
			КонецЕсли; 
		КонецЦикла;
		Для Каждого ЗависимаяСтрока Из ЗависимыеСтрокиДерева Цикл
			КнопкаЗависимого = КнопкиЗависимыеЗапросы.Добавить();
			КнопкаЗависимого.ТипКнопки = ТипКнопкиКоманднойПанели.Действие;
			КнопкаЗависимого.Текст = ЗависимаяСтрока.Представление;
			КнопкаЗависимого.Имя = мПрефиксИмениКнопкиЗависимогоЗапроса + XMLСтрока(ЗависимаяСтрока.Значение);
			#Если Сервер И Не Сервер Тогда
				ПерейтиКЗависимомуЗапросуНажатие();
			#КонецЕсли
			КнопкаЗависимого.Действие = Новый Действие("ПерейтиКЗависимомуЗапросуНажатие");
		КонецЦикла;
	КонецЕсли;
	Если ПоказыватьРезультатПакета Тогда
		МенюДереваЗапросаНайтиРезультат();
	КонецЕсли;
	СтарыйТекущийЭлементФормы = ТекущийЭлемент;
	Если мРазрешитьАктивациюРедактора И ЭлементыФормы.ПанельЗапроса.ТекущаяСтраница = ЭлементыФормы.ПанельЗапроса.Страницы.ТекстЗапроса Тогда
		ПолеТекстаЗапроса.УстановитьФокус(Истина); // Нужно дать полю текста фокус для обхода ошибки платформы с прокруткой 8.3.22
	КонецЕсли;
	ЕстьРезультатПоиска = Ложь;
	Если Не мСтруктурноеРедактирование Тогда 
		Если Истина
			И ТекущаяСтрока.ТипУзла <> "<TableWithName>"
			И ТекущаяСтрока.СтрокаДанных <> Неопределено
			И Не ТекущаяСтрока.СложныйАнализВыполнен
			И СтрЧислоСтрок(ТекущаяСтрока.Текст) < МаксСтрокДляСложнойВедомойСтруктуры
		Тогда
			ПозицияНачалаУзла = ПолеТекстаЗапроса.ПолеТекста.ПозицияВПолеТекстаПоНомеруСтрокиИКолонки(ТекущаяСтрока.СтрокаДанных.НачальнаяСтрока, ТекущаяСтрока.СтрокаДанных.НачальнаяКолонка);
			ПолеТекстаЗапроса.НайтиВыбранныеТаблицыВТекстеЗапроса(ТекущаяСтрока, ПозицияНачалаУзла, мСлужебноеПолеТекстовогоДокумента);
			ТекущаяСтрока.Строки.Сортировать("Порядок Убыв", Истина);
			СформироватьИменаСтруктурыЗапроса();
		КонецЕсли;
		Если мРазрешитьУстановкуПозицииИзВедомойСтруктуры Тогда
			УстановитьГраницыВыделенияНаЭлементСтруктуры(ТекущаяСтрока);
			НайденныеСтроки = ирКлиент.ДопСвойстваЭлементаФормыЛкс(ЭтаФорма, ЭлементыФормы.ДеревоЗапроса).МенеджерПоиска.НайденныеСтроки;
			Если НайденныеСтроки.Найти(ТекущаяСтрока) <> Неопределено Тогда
				ЕстьРезультатПоиска = ирКлиент.НайтиПоказатьФрагментВПолеТекстаЛкс(ЭтаФорма, ПолеТекстаЗапроса.ПолеТекста, ДеревоЗапросовСтрокаПоиска, Ложь,, мРазрешитьАктивациюРедактора, Истина);
			КонецЕсли;
		КонецЕсли;
	Иначе 
		ПоказатьТекстПодзапроса();
		Если мРедактируемыйУзел = ТекущаяСтрока Тогда
			ПолеТекстаЗапроса.УстановитьТекст(мРедактируемыйТекстУзла,, ТекущаяСтрока.Текст);
		КонецЕсли;
		ТекущееВыделение = ТекущаяСтрока.ТекущееВыделение;
		Если ТекущееВыделение <> Неопределено Тогда
			ПолеТекстаЗапроса.ПолеТекста.УстановитьГраницыВыделения(ТекущееВыделение.НачальнаяСтрока, ТекущееВыделение.НачальнаяКолонка,
				ТекущееВыделение.КонечнаяСтрока, ТекущееВыделение.КонечнаяКолонка,, ЭтаФорма);
		Иначе
			Если ЗначениеЗаполнено(ДеревоЗапросовСтрокаПоиска) Тогда
				ЕстьРезультатПоиска = ирКлиент.НайтиПоказатьФрагментВПолеТекстаЛкс(ЭтаФорма, ПолеТекстаЗапроса.ПолеТекста, ДеревоЗапросовСтрокаПоиска, Ложь,, мРазрешитьАктивациюРедактора, Истина);
			КонецЕсли; 
		КонецЕсли;
		Если Истина
			И мРежимСворачивания 
			И Не ирОбщий.СтрокиРавныЛкс(мТекущаяСтрокаДереваЗапросов.ТипЗапроса, "ADO")
			И Не ирОбщий.СтрокиРавныЛкс(мТекущаяСтрокаДереваЗапросов.ТипЗапроса, "WQL")
		Тогда
			СоздатьВременныеТаблицы(ТекущаяСтрока);
		КонецЕсли;
		ОбновитьКнопкуИзменитьСохранитьУзел();
		ОбновитьТолькоПросмотрПоляТекстаЗапроса();
	КонецЕсли;
	//Если Не ЕстьРезультатПоиска И СтарыйТекущийЭлементФормы = ЭлементыФормы.ДеревоЗапросов Тогда 
	//	ЭтаФорма.ТекущийЭлемент = СтарыйТекущийЭлементФормы; // Это выполнится раньше исправления прокрутки и оно не сработает
	//КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

Процедура УстановитьДоступностьКнопокКоманднойПанели(Кнопки, Доступность, ИсключитьПрефикс = "")
	
	Для Каждого Кнопка Из Кнопки Цикл 
		Если Кнопка.ТипКнопки = ТипКнопкиКоманднойПанели.Действие Тогда
			Если Кнопка.ИзменяетДанные Тогда
				Кнопка.Доступность = Доступность;
			КонецЕсли;
		ИначеЕсли Кнопка.ТипКнопки = ТипКнопкиКоманднойПанели.Подменю Тогда
			Если ЗначениеЗаполнено(ИсключитьПрефикс) И Найти(Кнопка.Имя, ИсключитьПрефикс) = 1 Тогда
				//
			Иначе
				УстановитьДоступностьКнопокКоманднойПанели(Кнопка.Кнопки, Доступность);
			КонецЕсли; 
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

Процедура ЗаблокироватьРедактированиеТекстаЗапроса(ТолькоПросмотрДерева)

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

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

// Проверяет корректность текущего подзапроса.
//
// Параметры:
//  Нет.
//
// Возвращаемое значение:
//   Булево - корректность запроса.
//
Функция ПроверитьТекстПодзапроса()

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

Функция КоманднаяПанельТекстЗапросаСохранитьУзел(НовыйРежимСворачивания = Неопределено)
	
	Если мРедактируемыйУзел <> Неопределено Тогда
		ЭлементыФормы.ДеревоЗапроса.ТекущаяСтрока = мРедактируемыйУзел;
	КонецЕсли; 
	СтрокаДанных = Неопределено;
	ПользовательПодтвердилОшибку = Ложь;
	Если Не ПроверитьТекстПодзапроса() Тогда 
		Ответ = Вопрос("Обнаружена ошибка в тексте подзапроса. Сохранить изменения подзапроса (структура запроса может быть отключена)?", РежимДиалогаВопрос.ОКОтмена,, КодВозвратаДиалога.Отмена);
		//Если Ответ = КодВозвратаДиалога.Да Тогда 
		//	ПолеТекстаЗапроса.УстановитьТекст(мРедактируемыйУзел.Текст);
		//КонецЕсли;
		Если Ответ = КодВозвратаДиалога.Отмена Тогда 
			Возврат Ложь;
		КонецЕсли;
		ПользовательПодтвердилОшибку = Истина;
	КонецЕсли;
	ПутьВДеревеЗапроса = ирОбщий.Дерево_ПутьСтрокойЛкс(мТекущаяСтрокаДереваЗапроса, "");
	СвернутыйТекстНовогоПодзапроса = ПолеТекстаЗапроса.ПолеТекста.ПолучитьТекст();
	РазвернутыйТекстНовогоПодзапроса = РазвернутьВложенныеЗапросы(мТекущаяСтрокаДереваЗапроса, СвернутыйТекстНовогоПодзапроса);
	
	// Закомментировал 31.01.2019
	//Если Истина
	//	И Прав(РазвернутыйТекстНовогоПодзапроса, 1) <> Символы.ПС 
	//	И мТекущаяСтрокаДереваЗапроса.ТипУзла <> "<TableWithName>"
	//Тогда
	//	РазвернутыйТекстНовогоПодзапроса = РазвернутыйТекстНовогоПодзапроса + Символы.ПС;
	//КонецЕсли; 
	
	//Если мРедактируемыйУзел.Текст <> РазвернутыйТекстНовогоПодзапроса Тогда
	//	// Фактически текст не изменился. Поэтому не будем обновлять дерево
	//КонецЕсли; 
	мСлужебноеПолеТекстовогоДокумента.УстановитьТекст(мТекстЗапросаДерева);
	СтрокаДанных = мТекущаяСтрокаДереваЗапроса.СтрокаДанных;
	Если СтрокаДанных <> Неопределено Тогда
		СтрокаДанных = мТекущаяСтрокаДереваЗапроса.СтрокаДанных;
		мСлужебноеПолеТекстовогоДокумента.УстановитьГраницыВыделения(
			СтрокаДанных.НачальнаяСтрока,
			СтрокаДанных.НачальнаяКолонка,
			СтрокаДанных.КонечнаяСтрока,
			СтрокаДанных.КонечнаяКолонка);
		Если ЛиСворачиваемыйТипУзла(мТекущаяСтрокаДереваЗапроса.ТипУзла) Тогда
			мСлужебноеПолеТекстовогоДокумента.ВыделенныйТекст = "(" + РазвернутыйТекстНовогоПодзапроса + ")";
		Иначе
			мСлужебноеПолеТекстовогоДокумента.ВыделенныйТекст = РазвернутыйТекстНовогоПодзапроса;
		КонецЕсли;
	Иначе
		мСлужебноеПолеТекстовогоДокумента.УстановитьТекст(РазвернутыйТекстНовогоПодзапроса);
	КонецЕсли;
	мОбъектЗапроса.Текст = мСлужебноеПолеТекстовогоДокумента.ПолучитьТекст();
	Если Ложь
		Или ирОбщий.СтрокиРавныЛкс(мТекущаяСтрокаДереваЗапросов.ТипЗапроса, "ADO")
		Или ирОбщий.СтрокиРавныЛкс(мТекущаяСтрокаДереваЗапросов.ТипЗапроса, "WQL")
	Тогда
		//
	Иначе
		// **** Этот же блок можно выполнить по результату РазобратьТекстЗапроса()
		Попытка
			ПараметрыЗапроса = мОбъектЗапроса.НайтиПараметры();
		Исключение
			Ответ = КодВозвратаДиалога.ОК;
			Если Не ПользовательПодтвердилОшибку Тогда
				ирОбщий.СообщитьСУчетомМодальностиЛкс("Изменения подзапроса приводят к ошибкам в вышестоящих подзапросах:"
					+ Символы.ПС + ОписаниеОшибки(), МодальныйРежим, СтатусСообщения.Важное);
				Ответ = Вопрос("Изменения приводят к ошибкам в вышестоящих подзапросах. Сохранить изменения (структура запроса может быть отключена)?", РежимДиалогаВопрос.ОКОтмена,, КодВозвратаДиалога.Отмена);
			КонецЕсли; 
			Если Ответ = КодВозвратаДиалога.Отмена Тогда 
				Возврат Ложь;
			КонецЕсли;
		КонецПопытки;
	КонецЕсли; 

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

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

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

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

Функция ОбновитьКнопкуИзменитьСохранитьУзел()

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

Процедура КоманднаяПанельФормыРежимДереваЗапроса(Кнопка = Неопределено) Экспорт 

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

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

Функция ЛиПарсерЗапросаДоступен(ПринудительноВывестиСообщение = Ложь)

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

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

Функция РазобратьТекстЗапроса(Знач ТекстЗапроса = Неопределено, Знач СтроитьДеревоЗапроса = Истина, Знач ПолеТекста = Неопределено, Знач СтартоваяСтрокаДляОтображенияОшибок = 0,
	Знач ЛиВедущая = Истина, Знач РазрешитьПростойРазборДляВедомой = Истина)
	
	#Если Сервер И Не Сервер Тогда
		мПлатформа = Обработки.ирПлатформа.Создать();
		ПолеТекстаЗапроса = Обработки.ирКлсПолеТекстаПрограммы.Создать();
	#КонецЕсли
	Если СтроитьДеревоЗапроса Тогда
		ОчиститьДеревоЗапроса();
	КонецЕсли; 
	Если ПолеТекста = Неопределено Тогда
		ПолеТекста = ПолеТекстаЗапроса.ПолеТекста;
	КонецЕсли; 
	Если ТекстЗапроса = Неопределено Тогда
		ТекстЗапроса = ПолеТекста.ПолучитьТекст(); 
	КонецЕсли; 
	//мОбъектЗапроса.Текст = ТекстЗапроса;
	Если СтроитьДеревоЗапроса Тогда 
		мСлужебноеПолеТекстовогоДокумента.УстановитьТекст(ТекстЗапроса);
		мТаблицаКоординат.Очистить();
		Если ЛиВедущая Тогда
			ЭлементыФормы.ДеревоЗапроса.Колонки.Представление.ТекстШапки = "Структура запроса ведущая";
		Иначе
			ЭлементыФормы.ДеревоЗапроса.Колонки.Представление.ТекстШапки = "Структура запроса ведомая";
		КонецЕсли;
	КонецЕсли;
	НачальнаяСтрока = 0;
	НачальнаяКолонка = 0;
	КонечнаяСтрока = 0;
	КонечнаяКолонка = 0;
	ПолеТекста.ПолучитьГраницыВыделения(НачальнаяСтрока, НачальнаяКолонка, КонечнаяСтрока, КонечнаяКолонка);
	мВременныеТаблицыПакета = Новый Соответствие;
	Если ЛиВедущая И ЛиПарсерЗапросаДоступен(Истина) Тогда
		НачальныйТокен = ПолеТекстаЗапроса.РазобратьТекстЗапроса(ТекстЗапроса, Истина,,,,,, СтартоваяСтрокаДляОтображенияОшибок);
		Если Истина
			И СтроитьДеревоЗапроса 
			И НачальныйТокен <> Неопределено
		Тогда 
			Состояние("Анализ структуры запроса...");
			ПостроитьСтруктуруЗапроса(ДеревоЗапроса, НачальныйТокен);
		КонецЕсли;
	Иначе
		ТекстыЭлементов = ирОбщий.РазбитьГрубоТекстПакетногоЗапросаНаЗапросыЛкс(ТекстЗапроса);
		ИменаСоздаваемыхТаблиц = ирОбщий.СоздаваемыеВременныеТаблицыПакетаЗапросовЛкс(ТекстыЭлементов,, Истина, Истина);
		ИндексЭлемента = 0;
		Если ТекстыЭлементов.Количество() = 1 Тогда
			ИскатьИсточники = Не (РазрешитьПростойРазборДляВедомой И СтрЧислоСтрок(ТекстЗапроса) > МаксСтрокДляСложнойВедомойСтруктуры);
			ДобавитьСтрокуЗапросаВДеревоЗапроса(ИменаСоздаваемыхТаблиц, ИндексЭлемента, ИскатьИсточники, ДеревоЗапроса, ТекстыЭлементов);
		Иначе
			КореньДерева = ДеревоЗапроса.Строки.Добавить(); 
			КореньДерева.СложныйАнализВыполнен = Истина;
			КореньДерева.ТипУзла = "<Packet>";
			КореньДерева.Имя = "Пакет";
			КореньДерева.Текст = ТекстЗапроса;
			ЗаполнитьСтрокуДереваЗапросаУпрощенно(КореньДерева,, Ложь);
			НакопленныйТекст = "";  
			ИскатьИсточники = Не (РазрешитьПростойРазборДляВедомой И КореньДерева.СтрокаДанных.КонечнаяСтрока > МаксСтрокДляСложнойВедомойСтруктуры);
			Для Каждого ТекстЭлемента Из ТекстыЭлементов Цикл
				ДобавитьСтрокуЗапросаВДеревоЗапроса(ИменаСоздаваемыхТаблиц, ИндексЭлемента, ИскатьИсточники, КореньДерева, ТекстыЭлементов, НакопленныйТекст);
				ИндексЭлемента = ИндексЭлемента + 1;
			КонецЦикла;
		КонецЕсли;
	КонецЕсли; 
	Если ДеревоЗапроса.Строки.Количество() > 0 Тогда
		ДеревоЗапроса.Строки.Сортировать("Порядок Убыв", Истина);
		СформироватьИменаСтруктурыЗапроса();
		ирКлиент.ТабличноеПолеДеревоЗначений_АвтоРазвернутьВсеСтрокиЛкс(ЭлементыФормы.ДеревоЗапроса);
		Если ирКэш.НомерВерсииПлатформыЛкс() < 803001 Тогда
			// Антибаг платформы 8.2.15 http://partners.v8.1c.ru/forum/thread.jsp?id=999555#999555
			ЭлементыФормы.ДеревоЗапроса.ОбновитьСтроки();
		КонецЕсли;
		СтрокаДерева = НайтиПозициюТекстаВДеревеЗапроса(ДеревоЗапроса.Строки, НачальнаяСтрока, НачальнаяКолонка, КонечнаяСтрока, КонечнаяКолонка, Истина);
		Если СтрокаДерева <> Неопределено Тогда
			ЭлементыФормы.ДеревоЗапроса.ТекущаяСтрока = СтрокаДерева;
		Иначе
			ЭлементыФормы.ДеревоЗапроса.ТекущаяСтрока = ДеревоЗапроса.Строки[0];
		КонецЕсли;
		Если ЛиВедущая Тогда
			СтрокаДанных = ЭлементыФормы.ДеревоЗапроса.ТекущаяСтрока.СтрокаДанных;
			Если СтрокаДанных <> Неопределено Тогда
				ПолеТекста.УстановитьГраницыВыделения(НачальнаяСтрока - СтрокаДанных.НачальнаяСтрока + 1, НачальнаяКолонка,
					КонечнаяСтрока - СтрокаДанных.НачальнаяСтрока + 1, КонечнаяКолонка);
			КонецЕсли; 
		КонецЕсли;
		мТекстЗапросаДерева = ТекстЗапроса;
		Если ЗначениеЗаполнено(ДеревоЗапросовСтрокаПоиска) Тогда
			ПрименитьСтрокуПоискаКСтруктуреЗапроса();
		КонецЕсли; 
	КонецЕсли;
	Состояние(); 
	ЭлементыФормы.МенюДереваЗапроса.Доступность = ДеревоЗапроса.Строки.Количество() > 0;
	Возврат ДеревоЗапроса.Строки.Количество() > 0;
	
КонецФункции

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

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

Процедура ДобавитьСтрокуЗапросаВДеревоЗапроса(Знач ИменаСоздаваемыхТаблиц, Знач ИндексЭлемента, Знач ИскатьИсточники, Знач КореньДерева, Знач ТекстыЭлементов, НакопленныйТекст = "")
	
	СтрокаДерева = КореньДерева.Строки.Вставить(0);
	СтрокаДерева.Текст = ТекстыЭлементов[ИндексЭлемента];
	ЗапросПакета = ИменаСоздаваемыхТаблиц[ИндексЭлемента];
	Если ЗначениеЗаполнено(ЗапросПакета.Значение) Тогда   
		ИмяОсновнойТаблицы = ЗапросПакета.Представление;
		Если Лев(ИмяОсновнойТаблицы, 1) = "-" Тогда
			ИмяОсновнойТаблицы = Сред(ИмяОсновнойТаблицы, 2);
			СтрокаДерева.ТипУзла = "<DropRoot>";
		ИначеЕсли Лев(ИмяОсновнойТаблицы, 1) = "*" Тогда
			ИмяОсновнойТаблицы = Сред(ИмяОсновнойТаблицы, 2);
			СтрокаДерева.ТипУзла = "<AddRoot>";
		Иначе
			СтрокаДерева.ТипУзла = "<CreateRoot>";
		КонецЕсли;
		СтрокаДерева.НИмяОсновнойТаблицы = ЗапросПакета.Значение;
		СтрокаДерева.Имя = ПрефиксИмениЗапросаСОсновнойТаблицей(СтрокаДерева.ТипУзла) + СтрЗаменить(ИмяОсновнойТаблицы, ".", "_");
	Иначе
		СтрокаДерева.ТипУзла = "<SelectRoot>";
		СтрокаДерева.Имя = "Запрос";
	КонецЕсли; 
	ЗаполнитьСтрокуДереваЗапросаУпрощенно(СтрокаДерева, НакопленныйТекст, ИскатьИсточники);

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

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

	//СтрокаКоординат.НачальнаяСтрока = СтрЧислоВхождений(ПредшествующийТекст, Символы.ПС) + 1; // Долго
	СтрокаКоординат.НачальнаяСтрока = ирОбщий.СтрЧислоСтрокЛкс(ПредшествующийТекст);

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

Функция ПостроитьСтруктуруЗапроса(Знач СтрокаДерева, Знач ТокенСверху, Знач ЭтоВыборТаблицы = Ложь, Знач ПсевдонимСверху = Неопределено, Знач ЭтоЗапросСОсновнойТаблицейСверху = Ложь,
	ПоследнийУзел = Неопределено, Знач УровеньВложенности = 0)
	
	#Если Сервер И Не Сервер Тогда
		СтрокаДерева = ДеревоЗапроса.Строки[0];
	#КонецЕсли
	Данные = ТокенСверху.Data;
	Если Данные = Неопределено Тогда
		Возврат "";
	КонецЕсли;
	УровеньВложенности = УровеньВложенности + 1;
	Если УровеньВложенности > 1000 Тогда
		ВызватьИсключение "Слишком много частей в объединении или запросов в пакете";
	КонецЕсли; 
	СтрокаВниз = СтрокаДерева;
	РодительскоеПравило = Данные.RuleText();
	СоздатьУзелСразу = Ложь
		Или ТипЗнч(СтрокаДерева) = Тип("ДеревоЗначений")
		Или (Истина
			И СтрокаДерева.ТипУзла = "<Packet>"
			И РодительскоеПравило <> "<Packet>"
			И РодительскоеПравило <> "<CommentTerminal>")
		Или (Истина
			// Это часть объединения
			И СтрокаДерева.ЭтоОбъединение
			И (Ложь
				Или РодительскоеПравило = "<CreateQuery>" 
				Или РодительскоеПравило = "<AddQuery>" 
				Или РодительскоеПравило = "<SelectQuery>" 
				Или РодительскоеПравило = "<Query>"))
		;
	Если СоздатьУзелСразу Тогда 
		НоваяСтрока = СтрокаДерева.Строки.Добавить();
		НоваяСтрока.ТипУзла = РодительскоеПравило;
		СтрокаВниз = НоваяСтрока;
	КонецЕсли;
	Если Истина
		И ирОбщий.СтрКончаетсяНаЛкс(РодительскоеПравило, "Union>") 
		И Данные.Count = 2
	Тогда
		СтрокаВниз.ЭтоОбъединение = Истина;
	КонецЕсли; 
	Если Ложь
		Или СоздатьУзелСразу
		Или РодительскоеПравило = "<EmbeddedQuery>"
		Или (Истина
			И РодительскоеПравило = "<Packet>"
			И СтрокаВниз.ТипУзла <> "<Packet>")
		Или (Истина
			И (Ложь
				Или РодительскоеПравило = "<TableName>"
				Или РодительскоеПравило = "<TableParameter>")
			И СтрокаВниз.ТипУзла = "<TableWithName>")
		Или (Истина
			И ЭтоВыборТаблицы
			И РодительскоеПравило = "<TableAS>")
	Тогда
		Если Не ЗначениеЗаполнено(СтрокаВниз.Имя) Тогда 
			Если Ложь
				Или СтрокаВниз.Родитель = Неопределено
				Или СтрокаВниз.Родитель.ТипУзла = "<Packet>"
			Тогда 
				СтрокаВниз.Имя = "Запрос";
			КонецЕсли;
			Если РодительскоеПравило = "<Packet>" Тогда 
				СтрокаВниз.Имя = "Пакет";
			ИначеЕсли РодительскоеПравило = "<EmbeddedQuery>" Тогда 
				СтрокаВниз.Имя = "Подзапрос";
			ИначеЕсли Ложь
				Или РодительскоеПравило = "<CreateUnion>"
				Или РодительскоеПравило = "<AddUnion>"
				Или РодительскоеПравило = "<SelectUnion>"
				Или РодительскоеПравило = "<SimpleUnion>"
			Тогда 
				СтрокаВниз.Имя = "Объединение";
			ИначеЕсли Ложь
				Или РодительскоеПравило = "<CreateQuery>"
				Или РодительскоеПравило = "<AddQuery>"
				Или РодительскоеПравило = "<SelectQuery>"
				Или РодительскоеПравило = "<Query>"
			Тогда
				ИмяЗапросаИзКомментария = "";
				ИмяЧастиОбъединенияИзКомментария = "";
				ТокенКомментария = Данные.Tokens(0);
				//ПолеТекстаПрограммы.ТекстЗапроса.ПолучитьКомментарийИзТокеновЯзыкаЗапросов(ТокенКомментария,, ИмяЗапросаИзКомментария, ИмяЧастиОбъединенияИзКомментария);
				ТекстКомментария = ПолучитьТекстМеждуТокенами(ТокенКомментария.BeginNoise, ТокенКомментария);
				ПолеТекстаЗапроса.РазобратьКомментарий(ТекстКомментария, ИмяЗапросаИзКомментария, ИмяЧастиОбъединенияИзКомментария);
				Если ЗначениеЗаполнено(ИмяЗапросаИзКомментария) Тогда
					СтрокаУзлаЗапроса = СтрокаВниз.Родитель;
					Если СтрокаУзлаЗапроса.ТипУзла = "<SelectUnion>" Тогда
						СтрокаУзлаЗапроса = СтрокаУзлаЗапроса.Родитель;
					КонецЕсли; 
					СтрокаУзлаЗапроса.Имя = ИмяЗапросаИзКомментария;
					СтрокаУзлаЗапроса.РучноеИмя = Истина;
				КонецЕсли; 
				Если ЗначениеЗаполнено(ИмяЧастиОбъединенияИзКомментария) Тогда
					СтрокаВниз.Имя = ИмяЧастиОбъединенияИзКомментария;
					СтрокаВниз.РучноеИмя = Истина;
				Иначе
					СтрокаВниз.Имя = "Выборка";
				КонецЕсли; 
			ИначеЕсли Ложь
				Или РодительскоеПравило = "<CreateRoot>"
				Или РодительскоеПравило = "<SelectRoot>"
			Тогда
				ИмяЗапросаИзКомментария = "";
				ТокенКомментария = Данные.Tokens(0).Data.Tokens(0);
				ТекстКомментария = ПолучитьТекстМеждуТокенами(ТокенКомментария.BeginNoise, ТокенКомментария);
				ПолеТекстаЗапроса.РазобратьКомментарий(ТекстКомментария, ИмяЗапросаИзКомментария);
				Если ЗначениеЗаполнено(ИмяЗапросаИзКомментария) Тогда
					СтрокаВниз.Имя = ИмяЗапросаИзКомментария;
					СтрокаВниз.РучноеИмя = Истина;
				КонецЕсли; 
			ИначеЕсли Ложь
				Или РодительскоеПравило = "<DropRoot>"
				Или РодительскоеПравило = "<UpdateRoot>"
				Или РодительскоеПравило = "<InsertRoot>"
				Или РодительскоеПравило = "<DeleteRoot>"
			Тогда
				ИмяЗапросаИзКомментария = "";
				ТокенКомментария = Данные.Tokens(0);
				//ПолеТекстаПрограммы.ТекстЗапроса.ПолучитьКомментарийИзТокеновЯзыкаЗапросов(ТокенКомментария,, ИмяЗапросаИзКомментария);
				ТекстКомментария = ПолучитьТекстМеждуТокенами(ТокенКомментария.BeginNoise, ТокенКомментария);
				ПолеТекстаЗапроса.РазобратьКомментарий(ТекстКомментария, ИмяЗапросаИзКомментария);
				Если ЗначениеЗаполнено(ИмяЗапросаИзКомментария) Тогда
					СтрокаВниз.Имя = ИмяЗапросаИзКомментария;
					СтрокаВниз.РучноеИмя = Истина;
				КонецЕсли; 
			//ИначеЕсли Ложь
			//	Или РодительскоеПравило = "<TableName>"
			//	Или РодительскоеПравило = "<TableParameter>"
			//Тогда
			//	СтрокаВниз.Имя = "Таблица";
			КонецЕсли;
		КонецЕсли;
		СтрокаВниз.ИмяСРодителем = СтрокаВниз.Имя;
			
		Если СтрокаВниз.Текст = "" Тогда
			СтрокаКоординат = мТаблицаКоординат.Добавить();
			ЗахватыватьКрайниеКомментарии = Истина
				И РодительскоеПравило <> "<EmbeddedQuery>"
				И РодительскоеПравило <> "<TableName>"
				И РодительскоеПравило <> "<TableParameter>";
			НачальныйТокен = Неопределено;
			КонечныйТокен = Неопределено;
			Если ТипЗнч(ТокенСверху) <> Тип("Структура") Тогда
				НачальныйТокен = ТокенСверху.GetBorderToken(0, ЗахватыватьКрайниеКомментарии);
				КонечныйТокен = ТокенСверху.GetBorderToken(1, ЗахватыватьКрайниеКомментарии);
			КонецЕсли; 
			Текст = ПолучитьТекстМеждуТокенами(НачальныйТокен, КонечныйТокен, СтрокаКоординат.НачальнаяСтрока, СтрокаКоординат.НачальнаяКолонка, СтрокаКоординат.КонечнаяСтрока, СтрокаКоординат.КонечнаяКолонка);
			Если ЗначениеЗаполнено(Текст) Тогда
				Порядок = мТаблицаКоординат.Индекс(СтрокаКоординат);
				СтрокаВниз.СтрокаДанных = СтрокаКоординат;
				СтрокаВниз.Порядок = Порядок;
			КонецЕсли; 
			Если РодительскоеПравило = "<EmbeddedQuery>" Тогда 
				СтрокаВниз.Текст = Сред(Текст, 2, СтрДлина(Текст) - 2);
			Иначе 
				СтрокаВниз.Текст = Текст;
			КонецЕсли;
		КонецЕсли; 
	КонецЕсли;
	Если Не СоздатьУзелСразу Тогда 
		Если Ложь
			Или РодительскоеПравило = "<FromUnion>" // Было закомментировано
			Или РодительскоеПравило = "<InUnion>"
			Или РодительскоеПравило = "<SetUnion>"
			Или РодительскоеПравило = "<Exists>"
			Или РодительскоеПравило = "<TableWithName>"
		Тогда 
			НоваяСтрока = СтрокаДерева.Строки.Добавить();
			НоваяСтрока.ТипУзла = РодительскоеПравило;
			СтрокаВниз = НоваяСтрока;
		КонецЕсли;
	КонецЕсли;
	Если НоваяСтрока <> Неопределено Тогда
		ПоследнийУзел = НоваяСтрока;
	КонецЕсли; 
	Если Истина
		И ЭтоЗапросСОсновнойТаблицейСверху
		И РодительскоеПравило = "<TableName>"
	Тогда 
		//ПсевдонимВверх = ПолеТекстаЗапроса.ПолучитьТекстИзДанныхТокена(Данные); 
		ПсевдонимВверх = ПолеТекстаЗапроса.ПолучитьТекстИзТокена(ТокенСверху,,,,, мСлужебноеПолеТекстовогоДокумента); 
	Иначе
		// Очищаем переменные перед рекурсивным спуском 
		ТокенСверху = Неопределено;
		СтрокаДерева = Неопределено;
		ЭтоЗапросСОсновнойТаблицей = Ложь
			Или РодительскоеПравило = "<DropRoot>"
			Или РодительскоеПравило = "<CreateRoot>"
			Или РодительскоеПравило = "<AddQuery>"
			Или РодительскоеПравило = "<AddUnion>"
			Или РодительскоеПравило = "<UpdateRoot>"
			Или РодительскоеПравило = "<InsertRoot>"
			Или РодительскоеПравило = "<DeleteRoot>";
		ПсевдонимВверх = "";
		ВерхнийИндекс = Данные.TokenCount - 1;
		Если _РежимОтладки Тогда 
			// Пассивный оригинал расположенного ниже однострочного кода. Выполняйте изменения синхронно в обоих вариантах. ирОбщий.Пр(_РежимОтладки, 1, 1)
			Для ИндексТокена = 0 По ВерхнийИндекс Цикл
				// Обходим токены с зада на перед
				Токен = Данные.Tokens(ВерхнийИндекс - ИндексТокена);
				Если Токен.Kind = 0 Тогда
					// Не терминальный токен
					ПсевдонимСнизу = ПостроитьСтруктуруЗапроса(СтрокаВниз, Токен, 
						Истина
							И Данные.TokenCount - 1 = ИндексТокена
							И РодительскоеПравило = "<TableWithName>",
						ПсевдонимСверху, 
						Истина
							И РодительскоеПравило <> "<Table>" 
							И РодительскоеПравило <> "<TypeToCast>"
							И (ЭтоЗапросСОсновнойТаблицейСверху Или ЭтоЗапросСОсновнойТаблицей),
						ПоследнийУзел,
						УровеньВложенности);
					Если ЗначениеЗаполнено(ПсевдонимСнизу) Тогда
						Если Ложь
							Или РодительскоеПравило = "<ParametersOfTable>"
							Или РодительскоеПравило = "<Expr>"
							Или РодительскоеПравило = "<SelectExpr>"
							Или РодительскоеПравило = "<OrderExpr>"
							Или РодительскоеПравило = "<MultiField>"
						Тогда
							Продолжить;
						КонецЕсли; 
						Если Ложь
							Или РодительскоеПравило = "<TableWithName>"
							Или РодительскоеПравило = "<FromUnion>"
						Тогда 
							//НоваяСтрока.Имя = ПсевдонимСнизу;
							СтрокаВниз.Имя = ПсевдонимСнизу;
							Если РодительскоеПравило = "<FromUnion>" Тогда
								СтрокаВниз.ТипУзла = РодительскоеПравило;
							КонецЕсли; 
						ИначеЕсли ЭтоЗапросСОсновнойТаблицей Тогда
							Если ЗначениеЗаполнено(ПсевдонимСнизу) Тогда
								СтрокаТекущегоЗапроса = СтрокаВниз;
								//Пока Истина
								//	И СтрокаТекущегоЗапроса.Родитель <> Неопределено
								//	И СтрокаТекущегоЗапроса.Родитель.ТипУзла <> "<Packet>"
								//Цикл 
								//	СтрокаТекущегоЗапроса = СтрокаТекущегоЗапроса.Родитель;
								//КонецЦикла;
								КорневаяСтрока = СтрокаТекущегоЗапроса;
								КорневаяСтрока.ТипУзла = РодительскоеПравило;
								КорневаяСтрока.НИмяОсновнойТаблицы = НРег(ПсевдонимСнизу);
								Если Не КорневаяСтрока.РучноеИмя Тогда
									КорневаяСтрока.Имя = ПрефиксИмениЗапросаСОсновнойТаблицей(РодительскоеПравило) + СтрЗаменить(ПсевдонимСнизу, ".", "_");
								КонецЕсли; 
							КонецЕсли; 
						ИначеЕсли Истина
							И ЭтоЗапросСОсновнойТаблицейСверху 
							И Не РодительскоеПравило = "<CheckExpr>" // Для отсечения В (ВЫБРАТЬ ... КАК <ИмяТаблицы>)
							И Не РодительскоеПравило = "<TableName>"
							И Не РодительскоеПравило = "<Field>"
							//И Не РодительскоеПравило = "<Meaning>" // Теперь там внутри нет <TableName>, а есть только <id>
							И Не РодительскоеПравило = "<TableParameter>"
							И Не РодительскоеПравило = "<FieldPseudoname>"
						Тогда 
							ПсевдонимВверх = ПсевдонимСнизу;
						ИначеЕсли Ложь
							Или РодительскоеПравило = "<TableName>"
							Или РодительскоеПравило = "<TablePseudoname>"
						Тогда 
							ПсевдонимВверх = ПсевдонимСнизу;
						КонецЕсли; 
					КонецЕсли;
				ИначеЕсли Ложь
					//Или РодительскоеПравило = "<TableName>"
					Или (Истина
						И Не ЭтоВыборТаблицы
						И (Ложь 
							ИЛи РодительскоеПравило = "<TableAS>"
							Или РодительскоеПравило = "<SmartID>"))
				Тогда 
					ПсевдонимВверх = Токен.Data;
				//ИначеЕсли ЭтоСозданиеТаблицы Тогда 
				//	ПсевдонимВверх = ПсевдонимСнизу;
				КонецЕсли;
			КонецЦикла;
		Иначе
			// Однострочный код использован для ускорения. Выше расположен оригинал. Выполняйте изменения синхронно в обоих вариантах. Преобразовано консолью кода из подсистемы "Инструменты разработчика" (http://devtool1c.ucoz.ru)
			Для ИндексТокена = 0 По ВерхнийИндекс Цикл    				Токен = Данные.Tokens(ВерхнийИндекс - ИндексТокена);  				Если Токен.Kind = 0 Тогда    					ПсевдонимСнизу = ПостроитьСтруктуруЗапроса(СтрокаВниз, Токен,  						Истина  							И Данные.TokenCount - 1 = ИндексТокена  							И РодительскоеПравило = "<TableWithName>",  						ПсевдонимСверху,  						Истина  							И РодительскоеПравило <> "<Table>"  							И РодительскоеПравило <> "<TypeToCast>"  							И (ЭтоЗапросСОсновнойТаблицейСверху Или ЭтоЗапросСОсновнойТаблицей),  						ПоследнийУзел,  						УровеньВложенности);  					Если ЗначениеЗаполнено(ПсевдонимСнизу) Тогда  						Если Ложь  							Или РодительскоеПравило = "<ParametersOfTable>"  							Или РодительскоеПравило = "<Expr>"  							Или РодительскоеПравило = "<SelectExpr>"  							Или РодительскоеПравило = "<OrderExpr>"  							Или РодительскоеПравило = "<MultiField>"  						Тогда  							Продолжить;  						КонецЕсли;  						Если Ложь  							Или РодительскоеПравило = "<TableWithName>"  							Или РодительскоеПравило = "<FromUnion>"  						Тогда    							СтрокаВниз.Имя = ПсевдонимСнизу;  							Если РодительскоеПравило = "<FromUnion>" Тогда  								СтрокаВниз.ТипУзла = РодительскоеПравило;  							КонецЕсли;  						ИначеЕсли ЭтоЗапросСОсновнойТаблицей Тогда  							Если ЗначениеЗаполнено(ПсевдонимСнизу) Тогда  								СтрокаТекущегоЗапроса = СтрокаВниз;              								КорневаяСтрока = СтрокаТекущегоЗапроса;  								КорневаяСтрока.ТипУзла = РодительскоеПравило;  								КорневаяСтрока.НИмяОсновнойТаблицы = НРег(ПсевдонимСнизу);  								Если Не КорневаяСтрока.РучноеИмя Тогда  									КорневаяСтрока.Имя = ПрефиксИмениЗапросаСОсновнойТаблицей(РодительскоеПравило) + СтрЗаменить(ПсевдонимСнизу, ".", "_");  								КонецЕсли;  							КонецЕсли;  						ИначеЕсли Истина  							И ЭтоЗапросСОсновнойТаблицейСверху  							И Не РодительскоеПравило = "<CheckExpr>"  							И Не РодительскоеПравило = "<TableName>"  							И Не РодительскоеПравило = "<Field>"  							И Не РодительскоеПравило = "<Meaning>"  							И Не РодительскоеПравило = "<TableParameter>"  							И Не РодительскоеПравило = "<FieldPseudoname>"  						Тогда  							ПсевдонимВверх = ПсевдонимСнизу;  						ИначеЕсли Ложь  							Или РодительскоеПравило = "<TableName>"  							Или РодительскоеПравило = "<TablePseudoname>"  						Тогда  							ПсевдонимВверх = ПсевдонимСнизу;  						КонецЕсли;  					КонецЕсли;  				ИначеЕсли Ложь    					Или (Истина  						И Не ЭтоВыборТаблицы  						И (Ложь  							ИЛи РодительскоеПравило = "<TableAS>"  							Или РодительскоеПравило = "<SmartID>"))  				Тогда  					ПсевдонимВверх = Токен.Data;      				КонецЕсли;  			КонецЦикла;  
		КонецЕсли; 
	КонецЕсли; 
	Возврат ПсевдонимВверх;
	
КонецФункции

Функция ПрефиксИмениЗапросаСОсновнойТаблицей(Знач ТипУзла)
	
	Если ТипУзла = "<DropRoot>" Тогда
		ПрефиксИмениЗапроса = "Уничтожить_";
	ИначеЕсли ТипУзла = "<CreateRoot>" Тогда
		ПрефиксИмениЗапроса = "Создать_";
	ИначеЕсли Ложь
		Или ТипУзла = "<AddRoot>"
		Или ТипУзла = "<AddQuery>"
		Или ТипУзла = "<AddUnion>"
	Тогда
		ПрефиксИмениЗапроса = "Добавить_";
	ИначеЕсли ТипУзла = "<UpdateRoot>" Тогда
		ПрефиксИмениЗапроса = "Обновить_";
	ИначеЕсли ТипУзла = "<InsertRoot>" Тогда
		ПрефиксИмениЗапроса = "Вставить_";
	ИначеЕсли ТипУзла = "<DeleteRoot>" Тогда
		ПрефиксИмениЗапроса = "Удалить_";
	Иначе
		ВызватьИсключение "Неизвестное правило " + ТипУзла;
	КонецЕсли;
	Возврат ПрефиксИмениЗапроса;

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

Функция ПолучитьТекстМеждуТокенами(Знач НачальныйТокен, Знач КонечныйТокен, НачальнаяСтрока = Неопределено, НачальнаяКолонка = Неопределено, КонечнаяСтрока = Неопределено,
	КонечнаяКолонка = Неопределено)
	
	Текст = "";
	Если НачальныйТокен <> Неопределено И КонечныйТокен <> Неопределено Тогда
		НачальнаяКолонка = НачальныйТокен.ColumnNumber;
		НачальнаяСтрока = НачальныйТокен.LineNumber;
		
		ТекстКонечногоТокена = КонечныйТокен.Data;
		ТекстКонечногоТокенаТД = Новый ТекстовыйДокумент;
		ТекстКонечногоТокенаТД.УстановитьТекст(ТекстКонечногоТокена);
		КоличествоСтрокКонечногоТокена = ТекстКонечногоТокенаТД.КоличествоСтрок();
		КонечнаяСтрока = КонечныйТокен.LineNumber + КоличествоСтрокКонечногоТокена - 1;
		Если КоличествоСтрокКонечногоТокена = 1 Тогда
			КонечнаяКолонка = КонечныйТокен.ColumnNumber + СтрДлина(ТекстКонечногоТокена);
		Иначе
			КонечнаяКолонка = СтрДлина(ТекстКонечногоТокенаТД.ПолучитьСтроку(КоличествоСтрокКонечногоТокена)) + 1;
		КонецЕсли;
		
		мСлужебноеПолеТекстовогоДокумента.УстановитьГраницыВыделения(НачальнаяСтрока, НачальнаяКолонка, КонечнаяСтрока, КонечнаяКолонка);
		Текст = мСлужебноеПолеТекстовогоДокумента.ВыделенныйТекст;
		//Текст = СокрЛ(Текст); // Этого делать не следует, т.к. могут измениться смещения по строкам и колонкам! Если делать, то надо соответственно корректировать смещения.
	//Иначе 
	ИначеЕсли НачальныйТокен = Неопределено И КонечныйТокен = Неопределено Тогда  // 29.04.2017
		Текст = мСлужебноеПолеТекстовогоДокумента.ПолучитьТекст(); 
		мСлужебноеПолеТекстовогоДокумента.УстановитьГраницыВыделения(1, СтрДлина(Текст) + 1);
		мСлужебноеПолеТекстовогоДокумента.ПолучитьГраницыВыделения(НачальнаяСтрока, НачальнаяКолонка, КонечнаяСтрока, КонечнаяКолонка);
	КонецЕсли;
	Возврат Текст;

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

Функция ЛиСворачиваемыйТипУзла(ТипУзла)
	
	Результат = Ложь
		Или ТипУзла = "<FromUnion>"
		Или ТипУзла = "<InUnion>"
		Или ТипУзла = "<SetUnion>"
		Или ТипУзла = "<Exists>"
		;
	Возврат Результат;
	
КонецФункции

Процедура СвернутьПодзапросы(СтрокаДерева, НачальнаяСтрока, НачальнаяКолонка)

	Если ЛиСворачиваемыйТипУзла(СтрокаДерева.ТипУзла) Тогда
		ВыделитьТекстПодзапросаВТекстеРодительскогоЗапроса(СтрокаДерева, НачальнаяКолонка, НачальнаяСтрока);
		Если Ложь
			Или СтрокаДерева.ТипУзла = "<InUnion>" 
			Или СтрокаДерева.ТипУзла = "<SetUnion>"
			Или СтрокаДерева.ТипУзла = "<Exists>" 
		Тогда
			мОбъектЗапроса.УстановитьПараметр("_" + СтрокаДерева.Имя + "_",);
			мСлужебноеПолеТекстовогоДокумента.ВыделенныйТекст = "(&" + СтрокаДерева.ИмяСРодителем + ")";
		ИначеЕсли СтрокаДерева.ТипУзла = "<FromUnion>" Тогда
			мСлужебноеПолеТекстовогоДокумента.ВыделенныйТекст = СтрокаДерева.ИмяСРодителем;
		КонецЕсли;
	Иначе
		Для Каждого ДочерняяСтрока Из СтрокаДерева.Строки Цикл
			СвернутьПодзапросы(ДочерняяСтрока, НачальнаяСтрока, НачальнаяКолонка);
		КонецЦикла;
	КонецЕсли;
	
КонецПроцедуры

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

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

Функция ОбработатьСтрокуДереваЗапроса(СтрокаДерева, НачальнаяСтрока = 1, НачальнаяКолонка = 1, НесуществующиеТаблицы = Неопределено)
	
	#Если Сервер И Не Сервер Тогда
	    СтрокаДерева = Новый ДеревоЗначений;
		СтрокаДерева = СтрокаДерева.Строки.Добавить();
	#КонецЕсли
	Представление = СтрокаДерева.Имя;
	//Фрагменты = ирОбщий.СтрРазделитьЛкс(СтрокаДерева.Текст);
	//Если Фрагменты.Количество() > 1 Тогда
	//            ПолноеИмяМД = Фрагменты[0] + "." + Фрагменты[1];
	//            ОбъектМетаданных = ирКэш.ОбъектМДПоПолномуИмениЛкс(ПолноеИмяМД);
	//            Если ОбъектМетаданных <> Неопределено Тогда
	//                            Представление = Представление + "=" + СтрокаДерева.Текст;
	//            КонецЕсли; 
	//КонецЕсли; 
	Если СтрокаДерева.ТипУзла = "<TableWithName>" Тогда
		Представление = Представление + " = " + ирОбщий.ПервыйФрагментЛкс(СтрокаДерева.Текст, "(");
		СтрокаДерева.ДлительностьПолная = "";
		ИмяВременнойТаблицы = СтрокаДерева.Текст;
		НИмяВременнойТаблицы = НРег(СтрокаДерева.Текст);
		Если мВременныеТаблицыПакета[НИмяВременнойТаблицы] = Неопределено Тогда
			мВременныеТаблицыПакета[НИмяВременнойТаблицы] = 1;
		Иначе
			мВременныеТаблицыПакета[НИмяВременнойТаблицы] = мВременныеТаблицыПакета[НИмяВременнойТаблицы] + 1;
		КонецЕсли; 
		Если Истина
			И Не ирОбщий.СтрокиРавныЛкс(мТекущаяСтрокаДереваЗапросов.ТипЗапроса, "ADO")
			И Не ирОбщий.СтрокиРавныЛкс(мТекущаяСтрокаДереваЗапросов.ТипЗапроса, "WQL")
			И ирОбщий.ЛиИмяПеременнойЛкс(НИмяВременнойТаблицы)
			И Не ирОбщий.СтрокиРавныЛкс(НИмяВременнойТаблицы, "Константы")
			И Не ирОбщий.СтрокиРавныЛкс(НИмяВременнойТаблицы, ирОбщий.ПеревестиИзРусскогоВАнглийскийЛкс("Константы"))
		Тогда
			СтрокаВременнойТаблицы = ВременныеТаблицы.Найти(НРег(ИмяВременнойТаблицы), "НИмя");
			Если СтрокаВременнойТаблицы = Неопределено Тогда
				СтрокаВременнойТаблицы = ОбновитьСтатусВременойТаблицы(ИмяВременнойТаблицы, НесуществующиеТаблицы);
			КонецЕсли; 
			Если СтрокаВременнойТаблицы <> Неопределено Тогда
				СтрокаДерева.РазмерРезультата = СтрокаВременнойТаблицы.РазмерРезультата;
			КонецЕсли; 
		КонецЕсли; 
	КонецЕсли; 
	СтрокаДерева.Представление = Представление;
	
	// Нормализация динамических имен
	МассивДинамическихИмен = ирОбщий.ЗначенияВМассивЛкс("Выборка", "Подзапрос", "Запрос");
	Для Каждого ДинамическоеИмя Из МассивДинамическихИмен Цикл
		СтрокиДинамическогоИмени = СтрокаДерева.Строки.НайтиСтроки(Новый Структура("Имя", ДинамическоеИмя));
		ВГраница = СтрокиДинамическогоИмени.ВГраница();
		Для Счетчик = 0 По ВГраница Цикл
			ДочерняяСтрока = СтрокиДинамическогоИмени[Счетчик];
			БазовоеИмя = ДочерняяСтрока.Имя;
			Если Истина
				И ДинамическоеИмя = "Выборка" 
				И СтрокаДерева.Родитель <> Неопределено
				И СтрокаДерева.Родитель.Родитель = Неопределено 
			Тогда
				БазовоеИмя = БазовоеИмя + (СтрокаДерева.Родитель.Строки.Индекс(СтрокаДерева) + 1) + "_";
			КонецЕсли; 
			ДочерняяСтрока.Имя = БазовоеИмя + Строка(Счетчик + 1);
		КонецЦикла;
	КонецЦикла;
	
	// Автопсевдонимы таблиц
	СтрокиДинамическогоИмени = СтрокаДерева.Строки.НайтиСтроки(Новый Структура("Имя, ТипУзла", "", "<TableWithName>"));
	ВГраница = СтрокиДинамическогоИмени.ВГраница();
	Для Счетчик = 0 По ВГраница Цикл
		ДочерняяСтрока = СтрокиДинамическогоИмени[Счетчик];
		НовоеИмя = ирОбщий.ИдентификаторИзПредставленияЛкс(ирОбщий.ПервыйФрагментЛкс(ДочерняяСтрока.Текст, "("));
		ДочерняяСтрока.Имя = НовоеИмя;
	КонецЦикла;
	
	Результат = "";
	РазделительЗапятая = ", ";
	КоличествоТаблицВПредставлении = 3;
	Для Счетчик = 1 По СтрокаДерева.Строки.Количество() Цикл
		ДочерняяСтрока = СтрокаДерева.Строки[Счетчик - 1];
		ПсевдонимПодзапроса = "_" + СтрокаДерева.Имя + "_" + ДочерняяСтрока.Имя + "_";
		ДочерняяСтрока.ИмяСРодителем = ПсевдонимПодзапроса;
		СтрокаДанных = ДочерняяСтрока.СтрокаДанных;
		Если ЛиСворачиваемыйТипУзла(ДочерняяСтрока.ТипУзла) Тогда
			СмещениеКолонки = 1;
		Иначе
			СмещениеКолонки = 0;
		КонецЕсли;
		Если мСтруктурноеРедактирование Тогда
			Если СтрокаДанных = Неопределено Тогда
				// ВЫБРАТЬ * ИЗ &ТТ
				Продолжить;
			КонецЕсли;
			РезультатДочерней = ОбработатьСтрокуДереваЗапроса(ДочерняяСтрока, СтрокаДанных.НачальнаяСтрока, СтрокаДанных.НачальнаяКолонка + СмещениеКолонки, НесуществующиеТаблицы);
		Иначе
			РезультатДочерней = ОбработатьСтрокуДереваЗапроса(ДочерняяСтрока,,, НесуществующиеТаблицы);
		КонецЕсли;
		Если Истина
			И КоличествоТаблицВПредставлении >= 0 
			И СтрокаДерева.ТипУзла <> "<CreateRoot>"
			И СтрокаДерева.ТипУзла <> "<CreateUnion>"
		Тогда
			Если РезультатДочерней = "" Тогда
				РезультатДочерней = "<>";
			КонецЕсли; 
			Если Ложь
				Или ДочерняяСтрока.ТипУзла = "<SelectUnion>" 
				Или ДочерняяСтрока.ТипУзла = "<SimpleUnion>"
				Или ДочерняяСтрока.ТипУзла = "<FromUnion>"
			Тогда 
				Результат = Результат + РазделительЗапятая + РезультатДочерней;
			ИначеЕсли Ложь
				Или ДочерняяСтрока.ТипУзла = "<CreateQuery>" 
				Или ДочерняяСтрока.ТипУзла = "<AddQuery>" 
				Или ДочерняяСтрока.ТипУзла = "<SelectQuery>" 
				Или ДочерняяСтрока.ТипУзла = "<Query>" 
			Тогда 
				Если Результат <> "" Тогда
					Результат = Результат + "; ";
				КонецЕсли; 
				Если КоличествоТаблицВПредставлении = 0 Тогда
					Результат = Результат + "...";
				Иначе
					Результат = Результат + РезультатДочерней;
				КонецЕсли; 
				КоличествоТаблицВПредставлении = КоличествоТаблицВПредставлении - 1;
			ИначеЕсли ДочерняяСтрока.ТипУзла = "<TableWithName>" Тогда 
				Если КоличествоТаблицВПредставлении = 0 Тогда
					Результат = Результат + РазделительЗапятая + "...";
				Иначе
					Результат = Результат + РазделительЗапятая + ДочерняяСтрока.Имя;
				КонецЕсли; 
				КоличествоТаблицВПредставлении = КоличествоТаблицВПредставлении - 1;
			КонецЕсли;
		КонецЕсли; 
	КонецЦикла;
	Если Истина
		И ЗначениеЗаполнено(Результат) 
		//И СтрокаДерева.ТипУзла <> "<SelectUnion>" 
		//И СтрокаДерева.ТипУзла <> "<SimpleUnion>"
		И (Ложь
			Или СтрокаДерева.ТипУзла = "<InUnion>" 
			Или СтрокаДерева.ТипУзла = "<SelectRoot>" 
			Или СтрокаДерева.ТипУзла = "<SelectQuery>" 
			Или СтрокаДерева.ТипУзла = "<CreateQuery>" 
			//Или СтрокаДерева.ТипУзла = "<AddQuery>" 
			Или СтрокаДерева.ТипУзла = "<Query>")
	Тогда
		Если ирОбщий.СтрНачинаетсяСЛкс(Результат, РазделительЗапятая) Тогда
			Результат = Сред(Результат, СтрДлина(РазделительЗапятая) + 1);
		КонецЕсли; 
		СтрокаДерева.Представление = СтрокаДерева.Представление + ": " + Результат;
	ИначеЕсли СтрокаДерева.ТипУзла = "<FromUnion>" Тогда
		Результат = СтрокаДерева.Имя;
	КонецЕсли; 
	Если Не мРежимСворачивания Тогда
		Возврат Результат;
	КонецЕсли;
	мСлужебноеПолеТекстовогоДокумента.УстановитьТекст(СтрокаДерева.Текст);
	Для Каждого ДочерняяСтрока Из СтрокаДерева.Строки Цикл
		СвернутьПодзапросы(ДочерняяСтрока, НачальнаяСтрока, НачальнаяКолонка);
	КонецЦикла;
	СтрокаДерева.Текст = мСлужебноеПолеТекстовогоДокумента.ПолучитьТекст();
	Возврат Результат;
	
КонецФункции

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

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

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

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

Процедура лРазвернутьВложенныеПодзапросы(Текст, СтрокаДерева)

	Если ЛиСворачиваемыйТипУзла(СтрокаДерева.ТипУзла) Тогда
		Если Ложь
			Или СтрокаДерева.ТипУзла = "<InUnion>" 
			Или СтрокаДерева.ТипУзла = "<SetUnion>"
			Или СтрокаДерева.ТипУзла = "<Exists>" 
		Тогда
			Текст = СтрЗаменить(Текст, "(&" + СтрокаДерева.ИмяСРодителем + ")", "(" + РазвернутьВложенныеЗапросы(СтрокаДерева) + ")");
		ИначеЕсли СтрокаДерева.ТипУзла = "<FromUnion>" Тогда
			Текст = СтрЗаменить(Текст, СтрокаДерева.ИмяСРодителем, "(" + РазвернутьВложенныеЗапросы(СтрокаДерева) + ")");
		КонецЕсли;
	Иначе
		Для Каждого СубДочерняяСтрока Из СтрокаДерева.Строки Цикл
			лРазвернутьВложенныеПодзапросы(Текст, СубДочерняяСтрока);
		КонецЦикла;
	КонецЕсли;

КонецПроцедуры // лРазвернутьВложенныеПодзапросы()

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

КонецФункции // РазвернутьВложенныеЗапросы()

Процедура ДеревоЗапросаПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Экспорт
	
	ирКлиент.ТабличноеПолеПриВыводеСтрокиЛкс(ЭтаФорма, Элемент, ОформлениеСтроки, ДанныеСтроки);
	ИмяКолонки = "Представление";
	Ячейка = ОформлениеСтроки.Ячейки[ИмяКолонки];
	Ячейка.ОтображатьКартинку = Истина;
	Если ДанныеСтроки.ТипУзла = "<FromUnion>" Тогда 
		Ячейка.ИндексКартинки = 0;
	ИначеЕсли Ложь
		Или ДанныеСтроки.ТипУзла = "<InUnion>" 
		Или ДанныеСтроки.ТипУзла = "<SetUnion>" 
		Или ДанныеСтроки.ТипУзла = "<Exists>" 
	Тогда 
		Ячейка.ИндексКартинки = 1;
	ИначеЕсли ДанныеСтроки.ТипУзла = "<IntoCreate>" Тогда 
		Ячейка.ИндексКартинки = 13;
	//ИначеЕсли ДанныеСтроки.ТипУзла = "<DropRoot>" Тогда 
	//	Ячейка.ИндексКартинки = 26;
	ИначеЕсли Ложь
		Или ДанныеСтроки.ТипУзла = "<CreateQuery>"
		Или ДанныеСтроки.ТипУзла = "<SelectQuery>"
		Или ДанныеСтроки.ТипУзла = "<Query>"
	Тогда
		// Объединение
		Ячейка.ИндексКартинки = 16;
	ИначеЕсли ДанныеСтроки.ТипУзла = "<TableWithName>" Тогда 
		ПолноеИмяТаблицы = ирОбщий.ПервыйФрагментЛкс(ДанныеСтроки.Текст, "(");
		ТипТаблицы = ирОбщий.ТипТаблицыБДЛкс(ПолноеИмяТаблицы);
		Ячейка.ИндексКартинки = ирКлиент.ИндексКартинкиТипаТаблицыБДЛкс(ТипТаблицы);
	КонецЕсли;
	Если ДанныеСтроки.РучноеИмя Тогда
		Ячейка.ЦветТекста = Новый Цвет(0, 0, 255);
	КонецЕсли; 
	Если ирОбщий.СтрокиРавныЛкс(ДанныеСтроки.Текст, мИмяВременнойТаблицыДляОтображенияЗависимых) Тогда
		ОформлениеСтроки.ЦветФона = ирОбщий.ЦветФонаАкцентаЛкс();
	КонецЕсли; 
	ОформлениеСтроки.Ячейки.РазмерРезультата.Гиперссылка = Истина;
	Если Истина
		И ТипЗнч(ДанныеСтроки.РазмерРезультата) <> Тип("Число") 
		И ДанныеСтроки.ТипУзла <> "<TableWithName>"
	Тогда
		ОформлениеСтроки.Ячейки.РазмерРезультата.УстановитьТекст("выполнить");
	КонецЕсли; 
	
КонецПроцедуры

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

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

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

Функция ПолучитьПостроительЗапросовДляИтогов(СообщатьОбОшибке = Ложь, ТекстЗапроса = "")

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

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

Функция УстановитьТипЗапроса(НовыйТип = "", ПоказыватьОшибки = Ложь, ТекстЗапроса = "", Знач ДобавитьВыборкуИзВременнойТаблицы = Ложь)

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

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

Функция ПроверитьДобавитьВыборкуИзВременнойТаблицыВТекстЗапроса(выхТекстЗапроса, Знач ДобавитьВыборкуИзВременнойТаблицы = Истина)

	#Если Сервер И Не Сервер Тогда
		ПолеТекстаЗапроса = Обработки.ирКлсПолеТекстаПрограммы.Создать();
	#КонецЕсли
	СоздаваемыеВременныеТаблицы = ирОбщий.СоздаваемыеВременныеТаблицыПакетаЗапросовЛкс(выхТекстЗапроса,,, Истина);
	Если Истина
		И ДобавитьВыборкуИзВременнойТаблицы
		И СоздаваемыеВременныеТаблицы.Количество() > 0 
		И ПолеТекстаЗапроса <> Неопределено
		И ПолеТекстаЗапроса.мПараметрыДиалектаSQL.Пакет
	Тогда
		ЭлементСписка = СоздаваемыеВременныеТаблицы[СоздаваемыеВременныеТаблицы.Количество() - 1];
		Если ЗначениеЗаполнено(ЭлементСписка.Представление) Тогда
			выхТекстЗапроса = выхТекстЗапроса + "
			|; " + КомментарийСлужебнойВыборки() + "  
			|SELECT * FROM " + ирОбщий.ПоследнийФрагментЛкс(ЭлементСписка.Представление, "*");
		КонецЕсли;
		Если СоздаваемыеВременныеТаблицы.Количество() = 1 Тогда
			СтрокаПорядкаОтладки = СтрокаПорядкаОтладки(выхТекстЗапроса);
			ДобавитьПорядокОтладки(выхТекстЗапроса, СтрокаПорядкаОтладки);
		КонецЕсли;
	КонецЕсли;
	Если мСтруктурноеРедактирование И ЭлементыФормы.ДеревоЗапроса.ТекущаяСтрока = ДеревоЗапроса.Строки[0] Тогда 
		мРегВыражение = мПлатформа.мРегВыражение;
		мРегВыражение2 = мПлатформа.мРегВыражение2;
		мРегВыражение.Global = Истина;
		Для Каждого ЭлементСписка Из СоздаваемыеВременныеТаблицы Цикл
			Если Не ЗначениеЗаполнено(ЭлементСписка.Представление) Тогда
				Продолжить;
			КонецЕсли; 
			мРегВыражение.Pattern = "(\s|;|^)(?:УНИЧТОЖИТЬ|DROP(?:\s+TABLE)?)\s+(" + ЭлементСписка.Представление + ")(\s*(?:;|$))";
			Вхождения = мРегВыражение.НайтиВхождения(выхТекстЗапроса);
			Если Вхождения.Количество() = 1 Тогда
				ПоследнееВхождение = Вхождения[Вхождения.Количество() - 1];
				мРегВыражение2.Pattern = "(ПОМЕСТИТЬ|INTO\s+TABLE|INTO)\s+" + ЭлементСписка.Представление + "\s+";
				Вхождения = мРегВыражение2.НайтиВхождения(Сред(выхТекстЗапроса, ПоследнееВхождение.FirstIndex));
				Если Вхождения.Количество() = 0 Тогда
					выхТекстЗапроса = мРегВыражение.Заменить(выхТекстЗапроса, "$1SELECT 0 FROM $2 WHERE FALSE$3");
				КонецЕсли; 
			КонецЕсли; 
		КонецЦикла;
	КонецЕсли; 
	Возврат СоздаваемыеВременныеТаблицы;

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

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

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

Процедура ДобавитьПорядокОтладки(выхТекстЗапроса, Знач СтрокаПорядкаОтладки)
	
	Если ЗначениеЗаполнено(СтрокаПорядкаОтладки) Тогда 
		СловоУпорядочить = ПолеТекстаЗапроса.СловоЯзыкаЗапросов("ORDER");
		Если Найти(выхТекстЗапроса, СловоУпорядочить) = 0 Тогда 
			выхТекстЗапроса = выхТекстЗапроса + "
			|" + СловоУпорядочить + " " + ПолеТекстаЗапроса.СловоЯзыкаЗапросов("BY") + " " + СтрокаПорядкаОтладки;
		КонецЕсли;
	КонецЕсли;

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

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

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

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

	ЭлементыФормы.ПанельЗапроса.Доступность = Истина
		И мТекущаяСтрокаДереваЗапросов <> Неопределено
		И мТекущаяСтрокаДереваЗапросов.ТипЗапроса <> "Папка"
	;
	//Если мТекущаяСтрокаДереваЗапросов <> Неопределено Тогда
	//	Если мТекущаяСтрокаДереваЗапросов.ТипЗапроса = "Папка" Тогда
	//		ЭлементыФормы.ПанельЗапроса.ТекущаяСтраница = ЭлементыФормы.ПанельЗапроса.Страницы.Папка;
	//	КонецЕсли; 
	//	ЭлементыФормы.ПанельЗапроса.Страницы.ТекстЗапроса.Видимость = мТекущаяСтрокаДереваЗапросов.ТипЗапроса <> "Папка";
	//	ЭлементыФормы.ПанельЗапроса.Страницы.Параметры.Видимость = мТекущаяСтрокаДереваЗапросов.ТипЗапроса <> "Папка";
	//	ЭлементыФормы.ПанельЗапроса.Страницы.КодПередВыполнениемЗапроса.Видимость = мТекущаяСтрокаДереваЗапросов.ТипЗапроса <> "Папка";
	//	ЭлементыФормы.ПанельЗапроса.Страницы.ВыборкиИтогов.Видимость = мТекущаяСтрокаДереваЗапросов.ТипЗапроса <> "Папка";
	//КонецЕсли; 

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

Процедура ИзменитьТипЗапроса(Кнопка)
	
	УстановитьТипЗапроса(Кнопка.Имя);
	 
КонецПроцедуры

Функция РезультирующийЗапрос(ЗапросПриемник, Знач ТекстЗапроса = "", ИспользоватьНастройкиРасширений = Ложь)

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

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

Функция ДобавитьДоступныеПоляВЭлементыУсловногоОформления(ЭлементыОформления, ЭлементыДоступныхПолей) Экспорт

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

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

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

Процедура МенюДереваЗапросаПеренестиВНовыйЗапрос(Кнопка)
	
	Если Не ЗакончитьРедактированиеУзла() Тогда 
		Возврат;
	КонецЕсли;
	СохранитьДанныеТекущейСтрокиДереваЗапросов();
	ИмяВременнойТаблицы = мТекущаяСтрокаДереваЗапроса.Имя;
	Если Не ВвестиСтроку(ИмяВременнойТаблицы, "Введите имя временной таблицы") Тогда
		Возврат;
	КонецЕсли; 
	Если мВременныеТаблицыПакета[Нрег(ИмяВременнойТаблицы)] <> Неопределено Тогда
		Ответ = Вопрос("В пакете уже есть запрос создания временной таблицы с таким именем. Хитете продолжить (Да) или сравнить запросы (Нет)?", РежимДиалогаВопрос.ДаНетОтмена,, КодВозвратаДиалога.Да);
		Если Ответ = КодВозвратаДиалога.Нет Тогда
			СтрокаДереваЗапроса = НайтиСтрокуДереваСозданияВременнойТаблицы(ИмяВременнойТаблицы);
			Если СтрокаДереваЗапроса <> Неопределено Тогда
				ирКлиент.Сравнить2ЗначенияВФормеЛкс(мТекущаяСтрокаДереваЗапроса.Текст, СтрокаДереваЗапроса.Текст,, "Новый", "Существующий");
			КонецЕсли; 
		КонецЕсли;
		Если Ответ <> КодВозвратаДиалога.Да Тогда
			Возврат;
		КонецЕсли;
	КонецЕсли; 
	ПутьВДеревеЗапроса = ирОбщий.Дерево_ПутьСтрокойЛкс(мТекущаяСтрокаДереваЗапроса, "Имя", ДеревоЗапроса.Строки[0].ТипУзла = "<Packet>");
	СтараяСтрокаДереваЗапросов = мТекущаяСтрокаДереваЗапросов;
	ТекстЗапроса = СтараяСтрокаДереваЗапросов.ТекстЗапроса;
	СтрокаДанных = мТекущаяСтрокаДереваЗапроса.СтрокаДанных;
	мСлужебноеПолеТекстовогоДокумента.УстановитьТекст(ТекстЗапроса);
	мСлужебноеПолеТекстовогоДокумента.УстановитьГраницыВыделения(
		СтрокаДанных.НачальнаяСтрока,
		СтрокаДанных.НачальнаяКолонка,
		СтрокаДанных.КонечнаяСтрока,
		СтрокаДанных.КонечнаяКолонка);
	Если мТекущаяСтрокаДереваЗапроса.ТипУзла = "<InUnion>" Тогда
		Если ПолеТекстаЗапроса.ЭтоРусскийВариантТекстаЗапроса(ТекстЗапроса) Тогда
			ОпределениеТаблицы = "(ВЫБРАТЬ * ИЗ " + ИмяВременнойТаблицы + ")";
		Иначе
			ОпределениеТаблицы = "(SELECT * FROM " + ИмяВременнойТаблицы + ")";
		КонецЕсли; 
		мСлужебноеПолеТекстовогоДокумента.ВыделенныйТекст = ОпределениеТаблицы;
	Иначе
		мСлужебноеПолеТекстовогоДокумента.ВыделенныйТекст = ИмяВременнойТаблицы + " ";
	КонецЕсли; 
	НовыйТекстСтарогоЗапроса = мСлужебноеПолеТекстовогоДокумента.ПолучитьТекст();
	Ответ = Вопрос("Хотите добавить запрос в текущий пакетный запрос (Да) или создать отдельный простой запрос (Нет)?", РежимДиалогаВопрос.ДаНет);
	ЭтаФорма.Модифицированность = Истина;
	Если Ответ = КодВозвратаДиалога.Да Тогда
		ТекстЗапросаПоместить = ПолучитьТекстЗапроса(Истина);
		ТекстЗапросаПоместить = ПолеТекстаЗапроса.ИзменитьОператорПоместитьЗапроса(ТекстЗапросаПоместить, ИмяВременнойТаблицы);
		СтрокаВерхнегоЗапроса = мТекущаяСтрокаДереваЗапроса;
		Пока СтрокаВерхнегоЗапроса.Родитель.Родитель <> Неопределено Цикл
			СтрокаВерхнегоЗапроса = СтрокаВерхнегоЗапроса.Родитель;
		КонецЦикла; 
		Если ДеревоЗапроса.Строки[0].ТипУзла <> "<Packet>" Тогда
			СтрокаВерхнегоЗапроса = СтрокаВерхнегоЗапроса.Родитель;
		КонецЕсли; 
		мСлужебноеПолеТекстовогоДокумента.УстановитьГраницыВыделения(
			СтрокаВерхнегоЗапроса.СтрокаДанных.НачальнаяСтрока,
			СтрокаВерхнегоЗапроса.СтрокаДанных.НачальнаяКолонка,
			СтрокаВерхнегоЗапроса.СтрокаДанных.НачальнаяСтрока,
			СтрокаВерхнегоЗапроса.СтрокаДанных.НачальнаяКолонка);
		мСлужебноеПолеТекстовогоДокумента.ВыделенныйТекст = ТекстЗапросаПоместить + Символы.ПС + ";" + Символы.ПС;
		РазобратьТекстЗапроса(,,мСлужебноеПолеТекстовогоДокумента);
	Иначе
		НоваяСтрокаЗапроса = СкопироватьТекущийПодзапросВНовыйЗапрос(-1);
		НоваяСтрокаЗапроса.Запрос = "*" + НоваяСтрокаЗапроса.Запрос;
		ТекстЗапросаПоместить = ПолеТекстаЗапроса.ИзменитьОператорПоместитьЗапроса(НоваяСтрокаЗапроса.ТекстЗапроса, ИмяВременнойТаблицы);
		НоваяСтрокаЗапроса.ТекстЗапроса = ТекстЗапросаПоместить;
		ЭлементыФормы.ДеревоЗапросов.ТекущаяСтрока = НоваяСтрокаЗапроса;
		ВыполнитьЗапрос();
		СтараяСтрокаДереваЗапросов.ТекстЗапроса = НовыйТекстСтарогоЗапроса;
		ЭлементыФормы.ДеревоЗапросов.ТекущаяСтрока = СтараяСтрокаДереваЗапросов;
	КонецЕсли;
	НоваяТекущаяСтрокаДереваЗапроса = ирОбщий.Дерево_НайтиПоПутиСтрокойЛкс(ДеревоЗапроса, "Имя",  ПутьВДеревеЗапроса, ДеревоЗапроса.Строки[0].ТипУзла = "<Packet>");
	Если НоваяТекущаяСтрокаДереваЗапроса <> Неопределено Тогда
		ЭлементыФормы.ДеревоЗапроса.ТекущаяСтрока = НоваяТекущаяСтрокаДереваЗапроса;
	КонецЕсли; 
	
КонецПроцедуры

Процедура МенюДереваЗапросаПреобразоватьВПодзапрос(Кнопка)
	
	СохранитьДанныеТекущейСтрокиДереваЗапросов();
	ПутьВДеревеЗапроса = ирОбщий.Дерево_ПутьСтрокойЛкс(мТекущаяСтрокаДереваЗапроса, "Имя", ДеревоЗапроса.Строки[0].ТипУзла = "<Packet>");
	СтрокаДанных = мТекущаяСтрокаДереваЗапроса.СтрокаДанных;
	мСлужебноеПолеТекстовогоДокумента.УстановитьТекст(мТекстЗапросаДерева);
	ОтветЗаменитьВременные = Вопрос("Хотите заменить обращение к временным таблицам их определениями (Да), иначе будет сформирован подзапрос из текущего текста (Нет)?", РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Нет);
	Если ОтветЗаменитьВременные = КодВозвратаДиалога.Да Тогда
		ОпределениеТаблицы = "";
		ВсеСтроки = ирОбщий.ВсеСтрокиДереваЗначенийЛкс(мТекущаяСтрокаДереваЗапроса);
		Для Индекс = 1 - ВсеСтроки.Количество() По 0 Цикл // Обратный обход
			СтрокаДерева = ВсеСтроки[-Индекс];
			Если СтрокаДерева.ТипУзла = "<TableWithName>" Тогда 
				СтрокаДанных = СтрокаДерева.СтрокаДанных;
				СтрокаЗапросаСоздания = НайтиСтрокуДереваСозданияВременнойТаблицы(СтрокаДерева.Текст);
				Если СтрокаЗапросаСоздания <> Неопределено Тогда
					мСлужебноеПолеТекстовогоДокумента.УстановитьГраницыВыделения(
						СтрокаДанных.НачальнаяСтрока,
						СтрокаДанных.НачальнаяКолонка,
						СтрокаДанных.КонечнаяСтрока,
						СтрокаДанных.КонечнаяКолонка);
					ОпределениеТаблицы = ПолеТекстаЗапроса.ИзменитьОператорПоместитьЗапроса(СтрокаЗапросаСоздания.Текст);
					НовыйВыделенныйТекст = "(" + ОпределениеТаблицы + ") ";
					мСлужебноеПолеТекстовогоДокумента.ВыделенныйТекст = НовыйВыделенныйТекст;
				КонецЕсли;
			КонецЕсли; 
		КонецЦикла;
	Иначе
		мСлужебноеПолеТекстовогоДокумента.УстановитьГраницыВыделения(
			СтрокаДанных.НачальнаяСтрока,
			СтрокаДанных.НачальнаяКолонка,
			СтрокаДанных.КонечнаяСтрока,
			СтрокаДанных.КонечнаяКолонка);
		НовыйВыделенныйТекст = РазвернутьВложенныеЗапросы(ЭлементыФормы.ДеревоЗапроса.ТекущаяСтрока, мТекущаяСтрокаДереваЗапроса.Текст);
		ТипУзла = мТекущаяСтрокаДереваЗапроса.ТипУзла;
		Если мТекущаяСтрокаДереваЗапроса.Родитель <> Неопределено Тогда
			ТекстДляОпределенияЯзыка = мТекущаяСтрокаДереваЗапроса.Родитель.Текст;
		Иначе
			ТекстДляОпределенияЯзыка = мТекущаяСтрокаДереваЗапроса.Текст;
		КонецЕсли; 
		ЭтоРусскийЯзык = ПолеТекстаЗапроса.ЭтоРусскийВариантТекстаЗапроса(ТекстДляОпределенияЯзыка);
		ПсевдонимВложенногоЗапроса = мТекущаяСтрокаДереваЗапроса.Имя;
		Если Истина
			И мТекущаяСтрокаДереваЗапроса.Строки.Количество() = 1
			И (Ложь
				Или мТекущаяСтрокаДереваЗапроса.Строки[0].ТипУзла = "<TableWithName>"
				Или мТекущаяСтрокаДереваЗапроса.Строки[0].ТипУзла = "<FromUnion>")
			И ЗначениеЗаполнено(мТекущаяСтрокаДереваЗапроса.Строки[0].Имя) 
		Тогда
			ПсевдонимВложенногоЗапроса = мТекущаяСтрокаДереваЗапроса.Строки[0].Имя;
		КонецЕсли; 
		//Если Не ЗначениеЗаполнено(ПсевдонимВложенногоЗапроса) Тогда
		//	Если ЭтоРусскийЯзык Тогда
		//		ПсевдонимВложенногоЗапроса = "ВложенныйЗапрос";
		//	Иначе
		//		ПсевдонимВложенногоЗапроса = "EmbeddedQuery";
		//	КонецЕсли; 
		//КонецЕсли; 
		Если ТипУзла = "<TableWithName>" Тогда 
			Если ЭтоРусскийЯзык Тогда
				ОпределениеТаблицы = "ВЫБРАТЬ * ИЗ " + НовыйВыделенныйТекст + " КАК " + ПсевдонимВложенногоЗапроса;
			Иначе
				ОпределениеТаблицы = "SELECT * FROM " + НовыйВыделенныйТекст + " AS " + ПсевдонимВложенногоЗапроса;
			КонецЕсли; 
			НовыйВыделенныйТекст = "(" + ОпределениеТаблицы + ") ";
		ИначеЕсли ТипУзла = "<FromUnion>" Тогда 
			НовыйВыделенныйТекст = "(" + ирКэш.Получить().ПреобразоватьЗапросВПодзапрос(НовыйВыделенныйТекст, , ПсевдонимВложенногоЗапроса,, ЭтоРусскийЯзык) + ") ";
		ИначеЕсли ТипУзла = "<SelectRoot>" Тогда
			НовыйВыделенныйТекст = ирКэш.Получить().ПреобразоватьЗапросВПодзапрос(НовыйВыделенныйТекст, , ПсевдонимВложенногоЗапроса,, ЭтоРусскийЯзык);
		КонецЕсли;
		мСлужебноеПолеТекстовогоДокумента.ВыделенныйТекст = НовыйВыделенныйТекст;
	КонецЕсли;
	
	// Данная проверка нужна только для корня
	мОбъектЗапроса.Текст = мСлужебноеПолеТекстовогоДокумента.ПолучитьТекст();
	Если Не ПроверитьКорректностьТекстаЗапросаИЗаполнитьПараметры(Ложь, Ложь,, мОбъектЗапроса.Текст) Тогда 
		Ответ = Вопрос("Новый текст запроса содержит логические ошибки. Продолжить?", РежимДиалогаВопрос.ОКОтмена);
		Если Ответ <> КодВозвратаДиалога.ОК Тогда
			Возврат;
		КонецЕсли;
	КонецЕсли;
	
	ЭтаФорма.Модифицированность = Истина;
	РазобратьТекстЗапроса(,, мСлужебноеПолеТекстовогоДокумента);
	НоваяТекущаяСтрокаДереваЗапроса = ирОбщий.Дерево_НайтиПоПутиСтрокойЛкс(ДеревоЗапроса, "Имя",  ПутьВДеревеЗапроса, ДеревоЗапроса.Строки[0].ТипУзла = "<Packet>");
	Если НоваяТекущаяСтрокаДереваЗапроса <> Неопределено Тогда
		ЭлементыФормы.ДеревоЗапроса.ТекущаяСтрока = НоваяТекущаяСтрокаДереваЗапроса;
	КонецЕсли; 
	
КонецПроцедуры

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

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

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

Процедура ДеревоЗапросовПослеУдаления(Элемент)

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

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

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

Процедура МенюДереваЗапросаШагнутьЧерез(Кнопка)
	
	//Если Не мСтруктурноеРедактирование Тогда 
	//	Возврат;
	//КонецЕсли;
	ВыполнитьЗапрос();
	ТекущаяСтрокаДереваЗапроса = ЭлементыФормы.ДеревоЗапроса.ТекущаяСтрока;
	РодительУровня = ТекущаяСтрокаДереваЗапроса.Родитель;
	Если РодительУровня = Неопределено Тогда
		РодительУровня = ДеревоЗапроса;
	КонецЕсли; 
	СтрокиУровня = РодительУровня.Строки;
	ТекущийИндекс = СтрокиУровня.Индекс(ТекущаяСтрокаДереваЗапроса);
	Если СтрокиУровня.Количество() = ТекущийИндекс + 1 Тогда
		Возврат;
	КонецЕсли; 
	ЭлементыФормы.ДеревоЗапроса.ТекущаяСтрока = СтрокиУровня[ТекущийИндекс + 1];
	
КонецПроцедуры

Процедура ОбновлениеОтображения()
	
	ирКлиент.Форма_ОбновлениеОтображенияЛкс(ЭтаФорма);
	ирОбщий.ОбновитьЗаголовокФормыСОткрытымФайломЛкс(ЭтаФорма, ?(ЗначениеЗаполнено(мРежимФормыДляЗаголовка), мРежимФормыДляЗаголовка, мИмяОткрытогоФайла));
	ЭлементыФормы.ВыборкиИтогов.ТолькоПросмотр = АвтовыборкиИтогов;
	ЭлементыФормы.ДобавлятьСлужебныеКолонкиРезультата.Доступность = Не СтандартнаяВыгрузкаВДерево;
	ЭлементыФормы.АвтовыборкиИтогов.Доступность = Не СтандартнаяВыгрузкаВДерево;
	//ЭлементыФормы.ОбходитьИерархическиеВыборкиРекурсивно.Доступность = Не СтандартнаяВыгрузкаВДерево;
	//ЭлементыФормы.ПанельРезультата.Страницы.КодОбработкиСтрокиРезультата.Доступность = ТипЗнч(РезультатКоллекция) <> Тип("ДеревоЗначений");
	ЭлементыФормы.КоманднаяПанельКоллекция.Кнопки.ПоказатьНеуникальные.Доступность = ТипЗнч(РезультатКоллекция) = Тип("ТаблицаЗначений");
	ЭлементыФормы.КоманднаяПанельКоллекция.Кнопки.СвернутьДерево.Доступность = ТипЗнч(РезультатКоллекция) = Тип("ДеревоЗначений");
	ЭлементыФормы.КоманднаяПанельКоллекция.Кнопки.РазвернутьДерево.Доступность = ТипЗнч(РезультатКоллекция) = Тип("ДеревоЗначений");
	ирКлиент.ТабличноеПолеСОтборомПросмотраОбновитьПредставлениеЛкс(ЭтаФорма, ЭлементыФормы.РезультатКоллекция);
	
	// Антибаг платформы 8.2.18 http://www.partners.v8.1c.ru/forum/thread.jsp?id=1173836#1173836 
	ЭлементыФормы.КоманднаяПанельКоллекция.Кнопки.КонсольКомпоновки.Доступность = ТипЗнч(РезультатКоллекция) = Тип("ТаблицаЗначений");

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

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

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

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

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

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

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

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

Процедура ДеревоЗапросовПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Колонка)

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

Процедура ДеревоЗапросовПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Колонка)

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

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

Функция ЭтоПеретаскиваниеСтрокПараметров(Знач ЗначениеПеретаскивания)
	
	Возврат Истина
		И ТипЗнч(ЗначениеПеретаскивания) = Тип("Массив")
		И ЗначениеПеретаскивания.Количество() > 0
		И ТипЗнч(ЗначениеПеретаскивания[0]) = Тип("СтрокаТаблицыЗначений") 
		И ТипЗнч(ЗначениеПеретаскивания[0].Владелец()) = Тип("ТаблицаЗначений")
		И ЗначениеПеретаскивания[0].Владелец().Колонки.Найти("ИмяПараметра") <> Неопределено
		И ЗначениеПеретаскивания[0].Владелец().Колонки.Найти("Значение") <> Неопределено;

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

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

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

Процедура КоманднаяПанельОбработкаСтрокиРезультатаШаблонЧтениеИЗаписьСсылочногоОбъекта(Кнопка)
	
	Текст =
	"Объект = СтрокаРезультата.Ссылка.ПолучитьОбъект();
	|
	|// Обработка объекта
	|Объект.Реквизит1 = ?;
	|
	|//Объект.ОбменДанными.Загрузка = Истина;
	|//Объект.ЗаписьИсторииДанных.Отказ = Истина; // 8.3.15+
	|Объект.Записать();";
	
	ирКлиент.УстановитьТекстСОткатомЛкс(ЭлементыФормы.КодОбработкиСтрокиРезультата, Текст);
	ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.КодОбработкиСтрокиРезультата;
	
КонецПроцедуры

Процедура КоманднаяПанельОбработкаСтрокиРезультатаШаблонЧтениеИЗаписьМенеджераЗаписи(Кнопка)

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

Процедура КоманднаяПанельОбработкаСтрокиРезультатаШаблонЧтениеИЗаписьНабораЗаписей(Кнопка)

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

Процедура КоманднаяПанельОбработкаРезультатаШаблонОбходПоГруппировкам(Кнопка)

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

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

Процедура КоманднаяПанельФормыСверткаРезультаты(Кнопка = Неопределено)
	
	ИзменитьСвернутостьПанельРезультата(Не ПоказыватьРезультат);
	
КонецПроцедуры

Функция ПолучитьТекстЗапросаСВыбромМетаданных(ЛиТаблицыИзменения = Ложь) Экспорт

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

КонецФункции // ПолучитьТекстЗапросаСВыбромМетаданных()

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

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

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

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

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

Функция ЭтоРезультатADO()
	ЭтоADO = ТипЗнч(мРезультатЗапроса) <> Тип("РезультатЗапроса");
	Если ЭтоADO Тогда
		Попытка
			Путышка = мРезультатЗапроса.Count;
			ЭтоADO = Ложь;
		Исключение
			ЭтоADO = Истина;
		КонецПопытки;
	КонецЕсли;
	Возврат ЭтоADO;

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

Функция ПолучитьКодПолученияРезультатаЗапроса(СтруктураНатуральныхПараметров = Неопределено)
	
	//РезультирующийЗапрос(мЗапросРезультата, мЗапросРезультата.Текст);
	ТекстЗапроса = ирОбщий.ТекстВВыражениеВстроенногоЯзыкаЛкс(мОписаниеРезультата.ТекстЗапроса);
	Если ирОбщий.СтрокиРавныЛкс(мОписаниеРезультата.ТипЗапроса, "WQL") Тогда
		лИмяСервера = мОписаниеРезультата.ПараметрыWMI.ИмяСервераWMI;
		Если Не ЗначениеЗаполнено(лИмяСервера) Тогда
			лИмяСервера = ".";
		КонецЕсли; 
		ТекстМодуля = "ЛокаторWMI = Новый COMОбъект(""WbemScripting.SWbemLocator"");
		|мОбъектЗапроса = ЛокаторWMI.ConnectServer(""" + лИмяСервера + """, , , , ТекущийЯзыкСистемы());"; 
	ИначеЕсли ирОбщий.СтрокиРавныЛкс(мОписаниеРезультата.ТипЗапроса, "ADO") Тогда 
		СоединениеФакт = "";
		ConnectADO(ПолучитьИсточникДанныхADO(),,,,,, СоединениеФакт);
		ТекстМодуля = "СоединениеADO = Новый COMОбъект(""ADODB.Connection"");
		|СоединениеADO.Open(" + ирОбщий.ТекстВВыражениеВстроенногоЯзыкаЛкс(СоединениеФакт) + ");
		|мОбъектЗапроса = Новый COMОбъект(""ADODB.Command"");
		|мОбъектЗапроса.ActiveConnection = СоединениеADO;
		|мОбъектЗапроса.CommandText = " + ТекстЗапроса + ";";
	Иначе
		ТекстМодуля = "мОбъектЗапроса = Новый Запрос;
		|мОбъектЗапроса.Текст = " + ТекстЗапроса + ";
		|Параметры = мОбъектЗапроса.Параметры;";
		Для Каждого СтрокаПараметра Из мОписаниеРезультата.ПараметрыЗапроса Цикл
			ТекстМодуля = ТекстМодуля + "
			|" + КодУстановкиПараметра(СтрокаПараметра,, СтруктураНатуральныхПараметров);
		КонецЦикла;
	КонецЕсли; 
	ТекстПередВыполнением = мОписаниеРезультата.КодПередВыполнениемЗапроса;
	Если Не ПустаяСтрока(ТекстПередВыполнением) Тогда
		ТекстМодуля = ТекстМодуля + "
		|// Обработчик перед выполнением НАЧАЛО
		|" + ТекстПередВыполнением + "
		|// Обработчик перед выполнением КОНЕЦ";
	КонецЕсли; 
	Если ирОбщий.СтрокиРавныЛкс(мОписаниеРезультата.ТипЗапроса, "WQL") Тогда
		ТекстМодуля = ТекстМодуля + "
		|мРезультатЗапроса = мОбъектЗапроса.ExecQuery(" + ТекстЗапроса + ");";
	ИначеЕсли ирОбщий.СтрокиРавныЛкс(мОписаниеРезультата.ТипЗапроса, "ADO") Тогда
		ТекстМодуля = ТекстМодуля + "
		|мРезультатЗапроса = мОбъектЗапроса.Execute();"
	Иначе
		ТекстМодуля = ТекстМодуля + "
		|//мРезультатЗапроса = мОбъектЗапроса.Выполнить();
		|мРезультатПакета = мОбъектЗапроса.ВыполнитьПакет();
		|мРезультатЗапроса = мРезультатПакета[мРезультатПакета.ВГраница()];
		|#Если Сервер И Не Сервер Тогда
		|    мРезультатЗапроса = мОбъектЗапроса.Выполнить();
		|#КонецЕсли
		|";
		Если мРезультатПоИменам <> Неопределено Тогда
			ТекстМодуля = ТекстМодуля + "
			|
			|//мРезультатПоИменам = Обработки.ирПлатформа.Создать().СтруктураРезультатаПакетногоЗапроса(мОбъектЗапроса.Текст);
			|мРезультатПоИменам = Новый Структура;";
			Для Каждого КлючИЗначение Из мРезультатПоИменам Цикл
				ТекстМодуля = ТекстМодуля + "
				|мРезультатПоИменам.Вставить(""" + КлючИЗначение.Ключ + """, " + XMLСтрока(КлючИЗначение.Значение) + ");";
			КонецЦикла;
		КонецЕсли; 
	КонецЕсли; 
	Возврат ТекстМодуля;
КонецФункции

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

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

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

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

Процедура КоманднаяПанельОбработкаСтрокиРезультатаПолучитьТекст(Кнопка)
	
	Если Ложь
		Или мОписаниеРезультата = Неопределено 
		Или мОписаниеРезультата.ТипЗапроса = "Папка"
	Тогда
		Предупреждение("Сначала нужно выполнить запрос", 10);
		Возврат;
	КонецЕсли; 
	СтруктураНатуральныхПараметров = Новый Структура;
	ТекстМодуля = ПолучитьКодПолученияРезультатаЗапроса(СтруктураНатуральныхПараметров);
	ПеременнаяТаблица = "РезультатКоллекция";
	Если ЭтоРезультатADO() Тогда
		ТекстМодуля = ТекстМодуля + "
		|" + ПеременнаяТаблица + " = Новый ТаблицаЗначений;
		|Для каждого Field Из мРезультатЗапроса.Fields Цикл
		|	" + ПеременнаяТаблица + ".Колонки.Добавить(?(Не ЗначениеЗаполнено(Field.Name), ""_"" + " + ПеременнаяТаблица + ".Колонки.Количество(), Field.Name));
		|КонецЦикла;
		|МассивСтрок = мРезультатЗапроса.GetRows().Unload();
		|Для каждого МассивСтроки Из МассивСтрок Цикл
		|	СтрокаРезультата = " + ПеременнаяТаблица + ".Добавить();
		|	Для Индекс = 0 По " + ПеременнаяТаблица + ".Колонки.Количество() - 1 Цикл
		|		СтрокаРезультата[Индекс] = МассивСтроки[Индекс];
		|	КонецЦикла;
		|КонецЦикла;";
	Иначе
		ТекстМодуля = ТекстМодуля + "
		|" + ПеременнаяТаблица + " = мРезультатЗапроса";
		Если ТипЗнч(мРезультатЗапроса) = Тип("РезультатЗапроса") Тогда
			ТекстМодуля = ТекстМодуля + ".Выгрузить()";
		КонецЕсли; 
		ТекстМодуля = ТекстМодуля + ";";
	КонецЕсли; 
	ТекстМодуля = ТекстМодуля + Символы.ПС + ПолучитьКодОбработкиТаблицыРезультата(ПеременнаяТаблица);
	ирОбщий.ОперироватьСтруктуройЛкс(ТекстМодуля,, СтруктураНатуральныхПараметров, НаСервере);
	//ирКлиент.ТекстВБуферОбменаОСЛкс(ТекстМодуля);
	
КонецПроцедуры

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

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

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

Процедура КоманднаяПанельФормыРежимТранзакции(Кнопка)
	
	Кнопка.Пометка = Не Кнопка.Пометка;
	ЭтотОбъект.ВыполнятьВТранзакции = Кнопка.Пометка;
	
КонецПроцедуры

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

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

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

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

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

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

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

Процедура МенюДереваЗапросаОткрытьФормуСписка(Кнопка)
	
	ПолноеИмяМД = ПолноеИмяМетаданныхСтрокиДереваЗапроса();
	Если ПолноеИмяМД <> "" Тогда
		ирКлиент.ОткрытьФормуСпискаЛкс(ПолноеИмяМД);
	КонецЕсли; 
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура КоманднаяПанельЗапросаРезультатаНастройкаТехножурнала(Кнопка)
	
	ирКлиент.ОткрытьНастройкуТехножурналаПоПользователюЛкс();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

Процедура МенюДереваЗапросаВыполнитьЗапросыПакетаДоТекущего(Кнопка)

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

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


// WMI

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

Функция ПреобразоватьРезультатыWMIвТаблицуЗначений(ТаблицаРезультат = Неопределено, РезультатыWMI, Знач СобиратьСистемныеСвойства = Ложь, 
	Знач СобиратьМетоды = Ложь, Знач ПолучатьПуть = Ложь, Знач ПолучатьЗначениеWMI = Ложь, ЗагружатьЭлементов = 100000) Экспорт
	
	Если ТаблицаРезультат = Неопределено Тогда
		ТаблицаРезультат = Новый ТаблицаЗначений;
	КонецЕсли; 
	Если ПолучатьЗначениеWMI Тогда 
		ТаблицаРезультат.Колонки.Добавить("Значение");
	КонецЕсли;
	Если ПолучатьПуть Тогда 
		ТаблицаРезультат.Колонки.Добавить("Path", Новый ОписаниеТипов("Строка")); // Типизация
	КонецЕсли;
	Если СобиратьМетоды Тогда
		ТаблицаРезультат.Колонки.Добавить("Methods");
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ЗагружатьЭлементов) Тогда
		КоличествоЭлементов = Мин(ЗагружатьЭлементов, РезультатыWMI.Count);
	Иначе
		КоличествоЭлементов = РезультатыWMI.Count;
	КонецЕсли; 
	Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоличествоЭлементов, "Загрузка результата");
	СчетчикЭлементов = 0;
	Для Каждого ЗначениеWMI Из РезультатыWMI Цикл
		Если Индикатор.Счетчик = КоличествоЭлементов Тогда
			Прервать;
		КонецЕсли; 
		ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
		СтрокаТаблицыWMI = ТаблицаРезультат.Добавить();
		Если ПолучатьЗначениеWMI Тогда 
			СтрокаТаблицыWMI.Значение = ЗначениеWMI;
		КонецЕсли;
		Свойства = ирОбщий.СтруктураИзЗначенияWMIЛкс(ЗначениеWMI.Properties_);
		//ДобавитьСтруктуруВСтрокуТаблицаЗначений(СтрокаТаблицыWMI, Свойства);
		Если Индикатор.Счетчик = 1 Тогда
			//выхТаблицаWMI.Колонки.Добавить("_Object");
			ЗаполнитьКолонкиТаблицыИзСвойствWMI(ТаблицаРезультат, ЗначениеWMI.Properties_);
		КонецЕсли; 
		//СтрокаТаблицыWMI["_Object"] = ЗначениеWMI;
		
		ЗаполнитьЗначенияСвойств(СтрокаТаблицыWMI, Свойства); 
		Если СобиратьСистемныеСвойства Тогда 
			СистемныеСвойства = ирОбщий.СтруктураИзЗначенияWMIЛкс(ЗначениеWMI.SystemProperties_);
			//ДобавитьСтруктуруВСтрокуТаблицаЗначений(СтрокаТаблицыWMI, СистемныеСвойства);
			ЗаполнитьЗначенияСвойств(СтрокаТаблицыWMI, СистемныеСвойства); 
		КонецЕсли;
		Если ПолучатьПуть Тогда 
			СтрокаТаблицыWMI.Path = ЗначениеWMI.Path_.Path;
		КонецЕсли;
		
		Если СобиратьМетоды Тогда 
			СтрокаТаблицыWMI.Methods = Новый Массив;
			Для Каждого МетодWMI из ЗначениеWMI.Methods_ Цикл
				ОписаниеМетода = "Метод: " + МетодWMI.Name;
				Если МетодWMI.InParameters <> Неопределено Тогда 
					Для Каждого ПараметрWMI из МетодWMI.InParameters.Properties_ Цикл
						КвалификаторыПраметра = ирОбщий.СтруктураИзЗначенияWMIЛкс(ПараметрWMI.Qualifiers_);
						ОписаниеМетода = ОписаниеМетода + Символы.ПС + "Входной параметр: " + ПараметрWMI.Name;
					КонецЦикла;
				КонецЕсли;
				Если МетодWMI.OutParameters <> Неопределено Тогда 
					Для Каждого ПараметрWMI из МетодWMI.OutParameters.Properties_ Цикл
						КвалификаторыПраметра = ирОбщий.СтруктураИзЗначенияWMIЛкс(ПараметрWMI.Qualifiers_);
						ОписаниеМетода = ОписаниеМетода + Символы.ПС + "Выходной параметр: " + ПараметрWMI.Name;
					КонецЦикла;
				КонецЕсли;
				СтрокаТаблицыWMI.Methods.Добавить(ОписаниеМетода);
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
	ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
	//Если КоличествоЭлементов < РезультатыWMI.Count Тогда
	//	ирОбщий.СообщитьЛкс("Результат загружен частично " + КоличествоЭлементов + " из " + РезультатыWMI.Count + " элементов!");
	//КонецЕсли; 
	Возврат ТаблицаРезультат;
	
КонецФункции

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

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

Процедура ОбновитьКлассыWMI(ТолькоДляТочкиПодключения = Ложь)
	
	ТекущаяСтрока = ЭлементыФормы.КлассыWMI.ТекущаяСтрока;
	Если ТекущаяСтрока <> Неопределено Тогда
		КлючТекущейСтроки = ТекущаяСтрока.Имя;
	КонецЕсли;
	Если ТолькоДляТочкиПодключения Тогда
		Если КлассыWMI.НайтиСтроки(Новый Структура("ТочкаПодключения", ТочкаПодключенияWMI)).Количество() > 0 Тогда
			ПроверитьСброситьТекущийКласс();
			Возврат;
		КонецЕсли; 
	Иначе
		КлассыWMI.Очистить();
	КонецЕсли; 
	СлужбаWMI = ПолучитьWMIСлужбу();
	Если СлужбаWMI = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	ирОбщий.СостояниеЛкс("Запрос классов WMI");
	wbemFlagUseAmendedQualifiers = 131072; //&H20000
	КоллекцияКлассов = СлужбаWMI.SubclassesOf(, wbemFlagUseAmendedQualifiers);
	Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоллекцияКлассов.Count, "Загрузка классов WMI");
	Для Каждого ЭлементКоллекции Из КоллекцияКлассов Цикл
		ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
		СтрокаКласса = КлассыWMI.Добавить();
		СтрокаКласса.Имя = ЭлементКоллекции.Path_.Class;
		СтрокаКласса.Представление = ирОбщий.ПолучитьОписаниеЭлементаWMIЛкс(ЭлементКоллекции, "DisplayName");
		СтрокаКласса.Описание = ирОбщий.ПолучитьОписаниеЭлементаWMIЛкс(ЭлементКоллекции);
		СтрокаКласса.ТочкаПодключения = ТочкаПодключенияWMI
	КонецЦикла;
	ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
	КлассыWMI.Сортировать("Имя");
	
	Если КлючТекущейСтроки <> Неопределено Тогда
		ТекущаяСтрока = КлассыWMI.Найти(КлючТекущейСтроки);
		Если ТекущаяСтрока <> Неопределено Тогда
			ЭлементыФормы.КлассыWMI.ТекущаяСтрока = ТекущаяСтрока;
		КонецЕсли; 
	КонецЕсли;
	ПроверитьСброситьТекущийКласс();
	
КонецПроцедуры

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

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

Процедура НастроитьКомпоновщикWMI(ЗагружатьСписокКлассов = Ложь)
	
	Если Истина
		И ЗагружатьСписокКлассов
		И КлассыWMI.НайтиСтроки(Новый Структура("ТочкаПодключения", ТочкаПодключенияWMI)).Количество() = 0 
	Тогда
		ОбновитьКлассыWMI(Истина);
	КонецЕсли; 
	ПроверитьСброситьТекущийКласс();
	Если Не ЗначениеЗаполнено(ТекущийКлассWMI) Тогда
		Возврат;
	КонецЕсли; 
	СлужбаWMI = ПолучитьWMIСлужбу();
	Если СлужбаWMI = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	wbemFlagUseAmendedQualifiers = 131072; //&H20000
	ОписаниеКласса = СлужбаWMI.Get(ТекущийКлассWMI, wbemFlagUseAmendedQualifiers);
	ТаблицаКласса = Новый ТаблицаЗначений;
	МассивКоллекцийСвойств = Новый Массив();
	МассивКоллекцийСвойств.Добавить(ОписаниеКласса.Properties_);
	//Если СобиратьСистемныеСвойстваWMI Тогда
	//	МассивКоллекцийСвойств.Добавить(ОписаниеКласса.SystemProperties_);
	//КонецЕсли; 
	Для Каждого КоллекцияСвойств Из МассивКоллекцийСвойств Цикл
		ЗаполнитьКолонкиТаблицыИзСвойствWMI(ТаблицаКласса, КоллекцияСвойств);
	КонецЦикла;
	мСхемаКомпоновки = ирОбщий.СоздатьСхемуПоТаблицамЗначенийЛкс(Новый Структура("Основной", ТаблицаКласса), , , , Ложь);
	ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(мСхемаКомпоновки);
	Компоновщик.Инициализировать(ИсточникНастроек);

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

Функция ПолучитьWMIСлужбу()

	Если мWMIService = Неопределено Тогда
		Результат = ирКэш.ПолучитьCOMОбъектWMIЛкс(ИмяСервераWMI,, ТочкаПодключенияWMI);
	Иначе
		Результат = мWMIService;
	КонецЕсли; 
	Возврат Результат;

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

Процедура ЗаполнитьКолонкиТаблицыИзСвойствWMI(ТаблицаКласса, КоллекцияСвойств)

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

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

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

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

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

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

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

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

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

Функция мПолучитьЗапросWMI(ПринудительноИзКонструктора = Ложь)
	
	ПанельЗапроса = ЭлементыФормы.ПанельЗапроса;
	Если Истина
		И ПанельЗапроса.ТекущаяСтраница = ПанельЗапроса.Страницы.ТекстЗапроса
		И Не ПринудительноИзКонструктора
	Тогда
		Результат = ПолеТекстаЗапроса.ПолеТекста.ПолучитьТекст();
	Иначе
		Если мСтруктурноеРедактирование Тогда 
			КоманднаяПанельФормыРежимДереваЗапроса();
		КонецЕсли; 
		ирОбщий.КомпоновщикНастроекВосстановитьЛкс(Компоновщик);
		НастройкаКомпоновкиДанных = Компоновщик.Настройки;
		Если НастройкаКомпоновкиДанных.Структура.Количество() = 0 Тогда
			ирОбщий.НайтиДобавитьЭлементСтруктурыГруппировкаКомпоновкиЛкс(НастройкаКомпоновкиДанных.Структура);
		КонецЕсли; 
		СтрокаПорядка = ирОбщий.ВыражениеПорядкаКомпоновкиНаЯзыкеЗапросовЛкс(НастройкаКомпоновкиДанных.Порядок);
		КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
		МакетКомпоновки = КомпоновщикМакета.Выполнить(мСхемаКомпоновки, Компоновщик.Настройки,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"), Ложь);
		ТекстПоля = "";
		ТекстГДЕ = "";
		ТекстПорядок = "";
		ФормаКонструктораЗапроса = ПолеТекстаЗапроса.ПолучитьФорму("КонструкторЗапроса");
		Если МакетКомпоновки.НаборыДанных.Количество() > 0 Тогда
			Для Каждого Поле Из МакетКомпоновки.НаборыДанных.Основной.Поля Цикл
				Если ТекстПоля <> "" Тогда
					ТекстПоля = ТекстПоля + ", " + Символы.ПС;
				КонецЕсли; 
				ТекстПоля = ТекстПоля + Символы.Таб + Поле.ПутьКДанным;
			КонецЦикла;
			ТекстГДЕ = ФормаКонструктораЗапроса.СобратьВыражениеОтбораКомпоновки(НастройкаКомпоновкиДанных.Отбор,,,, Компоновщик.Настройки);
			ТекстПорядок = ирОбщий.ВыражениеПорядкаКомпоновкиНаЯзыкеЗапросовЛкс(НастройкаКомпоновкиДанных.Порядок,,, "WQL"); 
		КонецЕсли; 
		Если Ложь 
			Или Не ЗначениеЗаполнено(ТекстПоля)
			Или ВыбратьВсеПоля
		Тогда
			ТекстПоля = "*";
		КонецЕсли; 
		Результат = 
		"SELECT 
		|" + ТекстПоля + " 
		|FROM " + ТекущийКлассWMI;
		Если ЗначениеЗаполнено(ТекстГДЕ) Тогда
			Результат = Результат + "
			|WHERE " + ТекстГДЕ;
		КонецЕсли; 
		//Если ЗначениеЗаполнено(ТекстПорядок) Тогда
		//	// Extended WQL http://msdn.microsoft.com/en-us/library/ms815501.aspx
		//	Результат = Результат + "
		//	|ORDER BY " + ТекстПорядок;
		//КонецЕсли; 
		//Если Ложь
		//	//Или ИзКонструктора
		//	Или ПринудительноИзКонструктора
		//Тогда
			ПолеТекстаЗапроса.УстановитьТекст(Результат);
		//КонецЕсли; 
	КонецЕсли;
	Возврат Результат;
	
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

Функция ИскатьСтрокуВMSDN(ПоисковыйЗапрос)

	СтрокаЗапуска = "http://social.msdn.microsoft.com/Search/en-US/windows/desktop?query=" + ПоисковыйЗапрос + "&Refinement=181&emptyWatermark=true&searchButtonTooltip=Search&ac=4";
	ЗапуститьПриложение(СтрокаЗапуска);
	Возврат Неопределено;

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

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

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

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

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

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

Процедура СвойстваКлассаWMIКоманднаяПанельОписание(Кнопка)
	
	ТекущаяСтрока = ЭлементыФормы.ДоступныеПоляWMI.ТекущаяСтрока;
	Если ТекущаяСтрока <> Неопределено Тогда
		ИскатьСтрокуВMSDN(ТекущийКлассWMI + "%20" + ТекущаяСтрока.Поле);
	КонецЕсли;
	
КонецПроцедуры

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


// ADO 

Функция ПолучитьADOUtils(ПытатьсяУстанавливать = Истина)
	
	ADOUtils = мПлатформа.ПолучитьADOUtils(ПытатьсяУстанавливать, ЭтаФорма.СмещениеГодаADO, ЭтаФорма.Типизировать1С, ЭтаФорма.БинарныеВСтроку);
	Если ПытатьсяУстанавливать Тогда
		УстановитьЭлементыФормыADO();
	КонецЕсли; 
	Возврат ADOUtils;
	
КонецФункции

// возвращает описание ошибки без информации о модуле , автор //Vitkovsky
Функция ЛокОписаниеОшибки(ЕррорТекст) Экспорт
	//СтрокаМодуля   = ОтделитьРазделителем2(ЕррорТекст, "{");
	//ОписаниеОшибки = ОтделитьРазделителем2(СтрокаМодуля, "}: ");
	//Возврат ОписаниеОшибки;
	Возврат ЕррорТекст;
	
КонецФункции // ЛокОписаниеОшибки()

// выполнение запроса через ADO на клиенте с выгрузкой результата 
Функция ВыполнитьЗапросADO(ИсточникДанных, СоединениеADO, ОбъектЗапрос, Опции, ЗапросТекст, пЗначенияПараметров, ТипыПараметров, ИнфоОшибки, выхРезультатПакета = Неопределено, ПредыдущийТекстПолногоЗапроса = "") Экспорт
	Перем Еррорс;
	Перем Script;
	Перем ScriptError;
	Перем ADOUtils;
	Перем соИтогиБатчей;
	Перем Типизировать1С;
	Перем БинарныеВСтроку;
	
	ТипаБулево = Тип("Булево");
	ТипаМассив = Тип("Массив");
	ТипаСоответствие = Тип("Соответствие");
	
	ИнфоОшибки = "";
	РезультатЗапросаADO = Неопределено;
	
	Если ТипЗнч(Опции) <> Тип("Структура") Тогда
		Опции = Новый Структура;
	КонецЕсли;
	ОпцияРезультатADOВРезультатЗапросаGWF = Неопределено;
	Опции.Свойство("РезультатADOВРезультатЗапросаGWF", ОпцияРезультатADOВРезультатЗапросаGWF);
	Если ТипЗнч(ОпцияРезультатADOВРезультатЗапросаGWF) <> ТипаБулево Тогда
		ОпцияРезультатADOВРезультатЗапросаGWF = Ложь;
	КонецЕсли;
	
	// Опции выполнения запроса (приложение 1С)
	ИндексБатча = Неопределено;
	ВремяВыполнения = Неопределено;
	ВыводСостояния = Неопределено;
	ВыводСостоянияВыгрузки = Неопределено;
	Типизировать1С = Неопределено;
	БинарныеВСтроку = Неопределено;
		
	Опции.Свойство("ИндексБатча", ИндексБатча);
	Опции.Свойство("ВыводСостояния", ВыводСостояния);
	Опции.Свойство("ВыводСостоянияВыгрузки", ВыводСостоянияВыгрузки);
	Опции.Свойство("ВремяВыполнения", ВремяВыполнения);
	Опции.Свойство("Типизировать1С", Типизировать1С);
	Опции.Свойство("БинарныеВСтроку", БинарныеВСтроку);
	
	ADOUtils = Неопределено;
	Если ОпцияРезультатADOВРезультатЗапросаGWF Тогда
		ADOUtils = ПолучитьADOUtils();
		Если ADOUtils = Неопределено Тогда
			ИнфоОшибки = "Не удалось подключить ВК GameWithFire.dll для преобразования результата запроса ADO в результат запроса 1С!";
			Возврат Неопределено;
		КонецЕсли; 
	КонецЕсли;
		
	Если ТипЗнч(ИндексБатча) <> Тип("Число") Тогда
		ИндексБатча = Неопределено;
	Иначе
		ИндексБатча = Цел(ИндексБатча);
	КонецЕсли;
		
	//Если ПакетноеВыполнение = Истина Тогда
	//	тзРезультаты = тзРезультатыПакета_Инит(РежимВыгрузки,ВремяВыполнения);
	//	Если РежимВыгрузки <> Неопределено Тогда
	//		тзРезультаты.Колонки.Добавить("RecordsAffected");
	//	КонецЕсли;
	//	Если ИндексБатча = Неопределено Тогда
	//		ИндексБатча = -1; // по умолчанию - нет ограничения по индексу команы в пакете 
	//	КонецЕсли; 
	//Иначе
		Если ИндексБатча = Неопределено Тогда
			ИндексБатча = 0;  // по умолчанию - результат первой команды из multi-batch-statement 
		КонецЕсли; 
	//КонецЕсли;
		
	Переподключиться = Неопределено;
	НеВыполнять = Неопределено;
	НеОтключаться = Неопределено;
	
	Опции.Свойство("Переподключиться", Переподключиться);
	Опции.Свойство("НеВыполнять", НеВыполнять); // вернуть объект, выполняющий запрос
	Опции.Свойство("НеОтключаться", НеОтключаться);
	
	Если СоединениеADO = Неопределено ИЛИ Переподключиться = Истина Тогда
		// подключаемся или переподключаемся
		Если НЕ ConnectADO(ИсточникДанных, СоединениеADO, Опции, Еррорс) Тогда
			ИнфоОшибки = "Ошибки подключения к источнику данных ADO:";
			Счетчик = 0;
			Для каждого Ерр Из Еррорс Цикл
				Счетчик = Счетчик + 1;
				ИнфоОшибки = ИнфоОшибки + "
				|	" + Счетчик + ")" + Ерр;
			КонецЦикла; 
			Возврат Неопределено;
		КонецЕсли;
		Если ТипЗнч(ОбъектЗапрос) = Тип("COMОбъект") Тогда
			// если передан объект запроса - надо заново установить соединение
			ОбъектЗапрос.ActiveConnection = СоединениеADO;
		КонецЕсли; 
	КонецЕсли;
	
	// Передача параметров запроса
	cтПараметрыТип=ТипЗнч(пЗначенияПараметров);
	ПарТипADOТип=ТипЗнч(ТипыПараметров);
	
	ПараметрыКоличество=0;
	Если Ложь
		Или cтПараметрыТип = ТипаМассив 
		ИЛИ cтПараметрыТип = ТипаСоответствие 
	Тогда
		Если Истина
			И ТипыПараметров <> Неопределено 
			И ПарТипADOТип <> cтПараметрыТип 
		Тогда
			ИнфоОшибки = 
			"Тип значения списка типов параметров ADO ('"+ПарТипADOТип+"') не равен
			|типу значений списка параметров запроса ('"+cтПараметрыТип+"') !";
			Возврат Неопределено;
		КонецЕсли; 
		ПараметрыКоличество = пЗначенияПараметров.Количество();
	КонецЕсли;
	
	// Опции выполнения запроса (ADO)	
	RecordsetUse = Неопределено;
	Options = Неопределено;
	
	Опции.Свойство("RecordsetUse", RecordsetUse);
	Опции.Свойство("Options", Options);
	
	Если ПараметрыКоличество > 0 И RecordsetUse = Истина Тогда
		RecordsetUse = Ложь;
	КонецЕсли;
		
	CommandTimeout = Неопределено;
	CommandType = Неопределено;
	Prepared = Неопределено;
	NamedParameters = Неопределено;
	Parameters = Неопределено;
	
	CursorType = Неопределено;
	CursorLocation = Неопределено;
	LockType = Неопределено;
	MarshalOptions = Неопределено;
	MaxRecords = Неопределено;
	CacheSize = Неопределено;
	PageSize = Неопределено;
	
	Если RecordsetUse = Истина Тогда
		Опции.Свойство("CursorType", CursorType);
		Опции.Свойство("CursorLocation", CursorLocation);
		Опции.Свойство("LockType", LockType);
		Опции.Свойство("MarshalOptions", MarshalOptions);
		Опции.Свойство("MaxRecords", MaxRecords);
		Опции.Свойство("CacheSize", CacheSize);
		Опции.Свойство("PageSize", PageSize);
	Иначе
		Опции.Свойство("CommandTimeout", CommandTimeout);
		Опции.Свойство("CommandType", CommandType);
		//стОпции.Свойство("MaxRecords", MaxRecords);
		Опции.Свойство("Prepared", Prepared);
		Опции.Свойство("NamedParameters", NamedParameters);
		Если NamedParameters = Неопределено Тогда
			// по умолчанию будем смотреть по типу списка параметров запроса
			Если ПараметрыКоличество > 0 Тогда
				Если cтПараметрыТип = ТипаМассив Тогда
					NamedParameters = Ложь;
				ИначеЕсли cтПараметрыТип = ТипаСоответствие Тогда
					NamedParameters = Истина;
				КонецЕсли;
			КонецЕсли; 
		КонецЕсли; 
		Опции.Свойство("Parameters", Parameters);
		Если ТипЗнч(Parameters) = ТипаМассив Тогда
			//Если Parameters.Количество()=0 Тогда
			//	Parameters = Неопределено; // все равно, что нет
			//КонецЕсли; 
		Иначе
			Parameters = Неопределено;
		КонецЕсли; 
		//Если Parameters <> Неопределено И NamedParameters = Истина Тогда
		//	// соответствие параметров - по индексу в переданном массиве
		//	NamedParameters = Ложь;
		//КонецЕсли; 
	КонецЕсли;
	
	// флаг инициализации параметрического запроса (первое выполнение)
	Инициация = Неопределено;
	Если Prepared = Истина Тогда
		Если ОбъектЗапрос = Неопределено Тогда
			Инициация = Истина; 
		Иначе
			Инициация = НЕ ОбъектЗапрос.Prepared; 
		КонецЕсли; 
	КонецЕсли;
	
	соИтогиБатчей = Неопределено;
	Если ОпцияРезультатADOВРезультатЗапросаGWF Тогда
		соИтогиБатчей = Новый Соответствие;
	КонецЕсли;
	
	Если ПустаяСтрока(ЗапросТекст) Тогда
		ЗапросТекстИ = ЗапросТекст;
	Иначе
		ЗапросТекстИ = ОбработатьКомментарииЗапросаADO(ЗапросТекст, соИтогиБатчей);
	КонецЕсли; 
	
	СоединениеADO.Errors.Clear();
	Если RecordsetUse = Истина Тогда
		ОбъектЗапрос = Новый COMОбъект("ADODB.Recordset");
		ОбъектЗапрос.ActiveConnection = СоединениеADO;
		Если CursorType<>Неопределено Тогда
			ОбъектЗапрос.CursorType = CursorType;
		КонецЕсли; 
		Если CursorLocation<>Неопределено Тогда
			ОбъектЗапрос.CursorLocation = CursorLocation;
		КонецЕсли; 
		Если LockType<>Неопределено Тогда
			ОбъектЗапрос.LockType = LockType;
		КонецЕсли;
		Если MarshalOptions<>Неопределено Тогда
			ОбъектЗапрос.MarshalOptions = MarshalOptions;
		КонецЕсли; 
		Если MaxRecords<>Неопределено Тогда
			ОбъектЗапрос.MaxRecords = MaxRecords;
			// Полезно было бы еще после выполнения запроса вернуть в исходное состояние, чтобы если через От открыли, то потом не было мины при продолжении выполнения код
		КонецЕсли; 
		Если CacheSize<>Неопределено Тогда
			ОбъектЗапрос.CacheSize = CacheSize;
		КонецЕсли;
		Если PageSize<>Неопределено Тогда
			ОбъектЗапрос.PageSize = PageSize;
		КонецЕсли;
	Иначе
		Если Не ИменованныеПараметрыADO Тогда 
			Для каждого СтрокаПараметра Из Параметры Цикл
				ЗапросТекстИ = СтрЗаменить(ЗапросТекстИ, ПолеТекстаЗапроса.ПрефиксПараметра() + СтрокаПараметра.ИмяПараметра, ПолеТекстаЗапроса.ПрефиксПараметра() + "/*" + СтрокаПараметра.ИмяПараметра + "*/");
			КонецЦикла;
		КонецЕсли; 
		Если Инициация <> Ложь ИЛИ Инициация = Истина Тогда
			Если мКомандаADO <> Неопределено Тогда
				ОбъектЗапрос = мКомандаADO;
			Иначе
				ОбъектЗапрос = Новый COMОбъект("ADODB.Command");
			КонецЕсли; 
			ОбъектЗапрос.ActiveConnection = СоединениеADO;
			ОбъектЗапрос.CommandText = ЗапросТекстИ;
			
			// В Oracle: Произошла исключительная ситуация (OraOLEDB): Provider cannot derive parameter information and SetParameterInfo has not been called.
			//Попытка
			//	Пустышка = ОбъектЗапрос.Parameters.Count;
			//Исключение
			//	ЕррорИнфо =
			//	"Ошибка заполнения доступных параметров запроса по тексту: 
			//	|	" + ОписаниеОшибки();
			//	Возврат Неопределено;
			//КонецПопытки;
			
			//Если MaxRecords <> Неопределено Тогда
			//	ПараметрМаксимальногоЧислаСтрок = ОбъектЗапрос.Properties("Maximum Rows");
			//	ПараметрМаксимальногоЧислаСтрок.Value = MaxRecords; // Это свойство только для чтения
			//	// Полезно было бы еще после выполнения запроса вернуть в исходное состояние, чтобы если через От открыли, то потом не было мины при продолжении выполнения код
			//КонецЕсли; 
			
			Если CommandType <> Неопределено И Options = Неопределено Тогда
				ОбъектЗапрос.CommandType = CommandType;
			КонецЕсли; 
			Если CommandTimeout <> Неопределено Тогда
				ОбъектЗапрос.CommandTimeout = CommandTimeout;
			КонецЕсли; 
			Если NamedParameters <> Неопределено Тогда
				ОбъектЗапрос.NamedParameters = NamedParameters;
			КонецЕсли;
			Если Prepared <> Неопределено Тогда
				ОбъектЗапрос.Prepared = Prepared;
			КонецЕсли;
		Иначе
			//ирОбщий.СообщитьЛкс("ОбъектЗапрос.Prepared = "+ОбъектЗапрос.Prepared);
		КонецЕсли;
		
		УстановитьПараметры = Ложь;
		Если Parameters = Неопределено Тогда
			// если массив параметров НЕ ПЕРЕДАН
			Если ПараметрыКоличество > 0 Тогда
				// устанавливаем параметры всегда (когда требуется)
				Если Истина
					И NamedParameters = Истина 
					И cтПараметрыТип <> ТипаСоответствие
				Тогда
					ИнфоОшибки = // для ИМЕНОВАННЫХ параметров необходимо передавать имена в ключах списка
						"Тип значения списка ИМЕНОВАННЫХ параметров запроса должен быть 'Соответствие' !";
					Возврат Неопределено;
				ИначеЕсли Истина
					И NamedParameters <> Истина 
					И cтПараметрыТип <> ТипаМассив
				Тогда
					ИнфоОшибки = // для НЕ-ИМЕНОВАННЫХ параметров важен порядок следования, задаваемый индексом массива
						"Тип значения списка НЕ-ИМЕНОВАННЫХ параметров запроса должен быть 'Массив' !";
					Возврат Неопределено;
				КонецЕсли;
				ЗначенияПараметров = пЗначенияПараметров;
				сп_ПарТипADO = ТипыПараметров;
				УстановитьПараметры = Истина;
			КонецЕсли; 
		Иначе // если же массив параметров ПЕРЕДАН
			УстановитьПараметры = Ложь;
			Если Инициация <> Ложь ИЛИ Инициация = Истина Тогда
				// заполняем параметры по переданному массиву объектов ADODB.Parameter
				Если ОбъектЗапрос.Parameters.Count <> Parameters.Количество() Тогда
					Попытка
						Если ОбъектЗапрос.Parameters.Count > 0 Тогда
							// очищаем коллекцию параметров
							Пока ОбъектЗапрос.Parameters.Count > 0 Цикл
								ОбъектЗапрос.Parameters.Delete(0);
							КонецЦикла;
						КонецЕсли; 
						// заполняем коллекцию параметров по массиву
						Для каждого Parameter Из Parameters Цикл
							ОбъектЗапрос.Parameters.Append(Parameter);
						КонецЦикла; 
					Исключение
						ИнфоОшибки=
						"Ошибка заполнения параметров запроса по переданному массиву объектов ADODB.Parameter: 
						|	"+ОписаниеОшибки();
						Возврат Неопределено;
					КонецПопытки;
				КонецЕсли; 
			КонецЕсли; 
		КонецЕсли; 
		
		Если УстановитьПараметры = Истина Тогда
			// инициализация параметров запроса
			Попытка
				Пока ОбъектЗапрос.Parameters.Count > 0 Цикл
					ОбъектЗапрос.Parameters.Delete(0);
				КонецЦикла;
			Исключение
				Пустышка = 0;
			КонецПопытки;
			сзЕррорс = Новый СписокЗначений;
			Индекс = -1;
			ЧислоПараметровТекста = СтрЧислоВхождений(ЗапросТекстИ, ПолеТекстаЗапроса.ПрефиксПараметра());
			СмещениеИндексаПараметра = СтрЧислоВхождений(ПредыдущийТекстПолногоЗапроса, ПолеТекстаЗапроса.ПрефиксПараметра());
			Для каждого ОписаниеПараметра Из ЗначенияПараметров Цикл
				Если cтПараметрыТип = ТипаМассив Тогда
					ПараметрИмя = Неопределено;
					ПараметрЗнч = ОписаниеПараметра;
				ИначеЕсли cтПараметрыТип = ТипаСоответствие Тогда
					ПараметрИмя = СокрЛП(ОписаниеПараметра.Ключ);
					ПараметрЗнч = ОписаниеПараметра.Значение;
				Иначе
					Продолжить;
				КонецЕсли; 
				Индекс = Индекс + 1;
				Если Не ИменованныеПараметрыADO Тогда 
					Если СмещениеИндексаПараметра + ЧислоПараметровТекста = Индекс Тогда
						// Иначе будет ошибка
						// Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Произошли ошибки во время выполнения многошаговой операции OLE DB. По возможности, проверьте значения всех состояний OLE DB. Работа не выполнена.
						Прервать;
					КонецЕсли;
					Если СмещениеИндексаПараметра > Индекс Тогда
						Продолжить;
					КонецЕсли;
				КонецЕсли;
				стТипADO=Неопределено;
				Если ПарТипADOТип=ТипаМассив Тогда
					Если Индекс<=сп_ПарТипADO.Количество()-1 Тогда
						стТипADO = сп_ПарТипADO.Получить(Индекс);
					КонецЕсли; 
				ИначеЕсли ПарТипADOТип = ТипаСоответствие Тогда
					стТипADO = сп_ПарТипADO.Получить(ОписаниеПараметра.Ключ);
				КонецЕсли; 
				ЕррИнфо="";
				Если Истина
					И СмещениеГодаADO > 0
					И ТипЗнч(ПараметрЗнч) = Тип("Дата")
				Тогда
					ПараметрЗнч = Дата(Год(ПараметрЗнч) + СмещениеГодаADO, Месяц(ПараметрЗнч), День(ПараметрЗнч), Час(ПараметрЗнч), Минута(ПараметрЗнч), Секунда(ПараметрЗнч));
				КонецЕсли; 
				Рез = ирОбщий.ADODBCommand_УстановитьПараметрПо1СЛкс(ОбъектЗапрос, Инициация, Индекс, ПараметрИмя, стТипADO, ПараметрЗнч, ADOUtils, ЕррИнфо);
				Если НЕ Рез Тогда
					Если ПараметрИмя = Неопределено Тогда
						сзЕррорс.Добавить("Param["+Индекс+"]", ЕррИнфо);
					Иначе
						сзЕррорс.Добавить(ОписаниеПараметра.Ключ, ЕррИнфо);
					КонецЕсли; 
				КонецЕсли; 
			КонецЦикла;
			Если сзЕррорс.Количество() > 0 Тогда
				ИнфоОшибки = "Ошибки установки параметров запроса через объект 'ADODB.Command':";
				Счетчик = 0;
				Для каждого Ерр Из сзЕррорс Цикл
					Счетчик = Счетчик + 1;
					ИнфоОшибки = ИнфоОшибки + "
					|	" + Счетчик + ") Параметр '"+Ерр.Значение+"': "+Ерр.Представление;
				КонецЦикла; 
				Возврат Неопределено;
			КонецЕсли; 
		КонецЕсли;
	КонецЕсли; 
	
	Если НеВыполнять = Истина Тогда
		// просто вернем COM-объект, выполняющий запрос (через аргумент ОбъектЗапрос).
		Возврат Неопределено;
	КонецЕсли;
		
	RecordsAffected = 0;
	БатчаИндекс = 0; // индекс текущего выполняемого батча (команды)
	
	// чистим коллекцию ошибок и выполняем запрос
	СоединениеADO.Errors.Clear();
	Если ВыводСостояния = Истина Тогда
		СостояниеИнфо = "Запрос через ADO";
		Состояние(СостояниеИнфо + " ...");
	КонецЕсли; 
	Попытка
		Если RecordsetUse = Истина Тогда
			//! ОбъектЗапрос = Новый COMОбъект("ADODB.Connection")
			Если Options=Неопределено Тогда
				ОбъектЗапрос.Open(ЗапросТекстИ);
			Иначе
				ОбъектЗапрос.Open(ЗапросТекстИ, СоединениеADO, CursorType, LockType, Options);
			КонецЕсли;
			РезультатЗапросаADO = ОбъектЗапрос;
		Иначе
			//! ОбъектЗапрос = Новый COMОбъект("ADODB.Command")
			Если Parameters = Неопределено И Options = Неопределено Тогда
				РезультатЗапросаADO = ОбъектЗапрос.Execute(RecordsAffected);
			ИначеЕсли Parameters = Неопределено И Options <> Неопределено Тогда
				РезультатЗапросаADO = ОбъектЗапрос.Execute(RecordsAffected,, Options);
			ИначеЕсли Parameters <> Неопределено И Options = Неопределено Тогда
				РезультатЗапросаADO = ОбъектЗапрос.Execute(RecordsAffected, Parameters);
			Иначе
				РезультатЗапросаADO = ОбъектЗапрос.Execute(RecordsAffected, Parameters, Options);
			КонецЕсли;
		КонецЕсли;
	Исключение
		// ошибки библиотеки ADO
		ОписаниеОшибки = ирОбщий.ПодробноеПредставлениеОшибкиЛкс(ИнформацияОбОшибке().Причина);
		ИнфоОшибки = "Ошибка ADO: " + ОписаниеОшибки;
		Если Истина
			И СмещениеГодаADO = 0
			И (Ложь
				Или ирОбщий.СтрНайтиЛкс(ОписаниеОшибки, "Недопустимое символьное значение для спецификации приведения") > 0)
		Тогда
			ИнфоОшибки = ИнфоОшибки + Символы.ПС + "Попробуйте установить смещение дат на 2000 на странице ""ADO""";
		КонецЕсли; 
		Возврат Неопределено;
	КонецПопытки;
	
	// Иначе при повторном использовании соединения может возникать ошибка "Для требуемой операции необходим объект OLE DB Session, не поддерживаемый текущим поставщиком"
	ОбъектЗапрос.ActiveConnection = Неопределено; 
	// ошибки провайдера данных
	Если СоединениеADO.Errors.Count > 0 Тогда
		ИнфоОшибки = "Ошибки провайдера данных:";
		Счетчик = 0;
		Для каждого Err Из СоединениеADO.Errors Цикл
			Счетчик = Счетчик + 1;
			ErrСтр = "Описание: "+Err.Description+"; Номер: "+Err.Number+"; Источник: "+Err.Source+"; Состояние: "+Err.SQLState+"; Код"+Err.NativeError;
			ИнфоОшибки = ИнфоОшибки + "
			|	" + Счетчик + ") " + ErrСтр;
		КонецЦикла;
	
		Опции.Вставить("RecordsAffected", 0);
		// возвратим результат запроса - объект 'ADODB.Recordset'
		ВозвратЗначение = РезультатЗапросаADO;
		Возврат ВозвратЗначение;
	КонецЕсли;
	
	РезультатПакетаADO = Новый Массив;
	Если СоединениеADO.Properties("Multiple Results").Value <> 0 Тогда
		// Получаем последний результат пакетной команды
		Пока Истина Цикл 
			РезультатПакетаADO.Добавить(РезультатЗапросаADO);
			лРезультат = РезультатЗапросаADO.NextRecordset();
			Если лРезультат = Неопределено Тогда
				Прервать;
			КонецЕсли; 
			РезультатЗапросаADO = лРезультат;
		КонецЦикла; 
	Иначе
		РезультатПакетаADO.Добавить(РезультатЗапросаADO);
	КонецЕсли;
	выхРезультатПакета = Новый Массив;
	Для Каждого РезультатЗапросаADO Из РезультатПакетаADO Цикл
		РезультатЗапроса = РезультатЗапросаADO;
		Если РезультатЗапросаADO.State = 0 Тогда
			// выполнена команда
		Иначе
			// открыта выборка, объектом 'ADODB.Recordset' или при выполнении команды объектом 'ADODB.Command' 
			RecordsAffected = РезультатЗапросаADO.RecordCount;
			Если ОпцияРезультатADOВРезультатЗапросаGWF Тогда
				СтрИтоги = СокрЛП(соИтогиБатчей[БатчаИндекс]);
				Если ПустаяСтрока(СтрИтоги) Тогда
					РезультатЗапроса = ADOUtils.ADORecordsetToQueryResult(РезультатЗапросаADO);
				Иначе
					РезультатЗапроса = ADOUtils.ADORecordsetToQueryResult(РезультатЗапросаADO, СтрИтоги);
				КонецЕсли; 
			КонецЕсли;
			Опции.Вставить("RecordsAffected", RecordsAffected); // возвратим через опции итоговое число обработанных строк
		КонецЕсли;
		выхРезультатПакета.Добавить(РезультатЗапроса);
	КонецЦикла;
	
	Если НеОтключаться <> Истина Тогда
		DisconnectADO(ИсточникДанных, СоединениеADO, Опции, Еррорс);
	КонецЕсли;
	
	Возврат РезультатЗапроса;
КонецФункции

// выполняет запрос с переданным именем, возвращает признак успешности выполнения
//   аргумент Запрос - имя узла структуры запроса или сам узел структуры запроса
Функция ЗапросADOВыполнить(ЭтотЗапрос, Параметры = Неопределено, РезультатADOВРезультатЗапросаGWF = Ложь, ВыводитьСообщения = Истина, выхРезультатПакета = Неопределено,
	Знач ПредыдущийТекстПолногоЗапроса = "") Экспорт 
	
	Перем СтандартнаяОбработка, Отказ;
	Перем ЗапросОбъект;
	Перем СоединениеADO;
	Перем тзРезультаты;
	
	ЕррорИнфо = "";
	СтандартнаяОбработка = Истина;
	Если ЭтотЗапрос.спПараметры = Неопределено  Тогда
		ЭтотЗапрос.спПараметры = спПараметры_Инит();
	КонецЕсли;
	Если Параметры <> Неопределено Тогда
		Для каждого СтрокаПараметра Из Параметры Цикл
			СтрПар = ЭтотЗапрос.спПараметры.Найти(СтрокаПараметра.ИмяПараметра, "Имя");
			Если СтрПар = Неопределено Тогда
				СтрПар = ЭтотЗапрос.спПараметры.Добавить();
				СтрПар.Имя = СтрокаПараметра.ИмяПараметра;
				СтрПар.Значение = СтрокаПараметра.Значение;
			Иначе
				// установим индекс строки для задания прорядка в НЕ-ИМЕНОВАННЫХ списках параметров
				СтрПар.Индекс = Параметры.Индекс(СтрокаПараметра);
			КонецЕсли; 
		КонецЦикла; 
	КонецЕсли; 
			
	Если СтандартнаяОбработка = Истина Тогда
		ЗапросТекст = СокрЛП(ЭтотЗапрос.ТекстЗапроса);
		Если ПустаяСтрока(ЗапросТекст) Тогда
			ЕррорИнфо = "Не задан текст запроса !";
			Перейти ~ВызыватьИсключение;
		КонецЕсли;
		ИсточникДанных = ЭтотЗапрос.ИсточникДанных;
		ЕррорИнфо = "";
		Если Не ЗначениеЗаполнено(ИсточникДанных) Тогда
			ВызватьИсключение "Источник данных ADO не заполнен";
		КонецЕсли; 
		ОпцияВставить(ЭтотЗапрос, "НеОтключаться",Истина);
		СоединениеADO = ПолучитьСоединениеADO();
		Опции = ЭтотЗапрос.стОпции;
		ТаблицаПараметров = ЭтотЗапрос.спПараметры;
		ИспользоватьМассивПараметров = Ложь; 
		РежимИменованныхПараметров = Ложь;
		Опции.Свойство("NamedParameters", РежимИменованныхПараметров);
		ПараметрыВызова = Неопределено;
		ТипыПараметров = Неопределено;
		Если ТаблицаПараметров <> Неопределено Тогда
			Если РежимИменованныхПараметров = Истина Тогда
				ПараметрыВызова = Новый Соответствие;
				ТипыПараметров = Новый Соответствие;
				Для каждого СтрокаПараметра Из ТаблицаПараметров Цикл
					ПараметрыВызова.Вставить(СтрокаПараметра.Имя, СтрокаПараметра.Значение);
					ТипыПараметров.Вставить(СтрокаПараметра.Имя, СтрокаПараметра.ТипADO);
				КонецЦикла; 
			Иначе
				ТипаЧисло = Тип("Число");
				ПараметрыВызова = Новый Массив;
				ТипыПараметров = Новый Массив;
				ИндексН = ТаблицаПараметров.Количество()-1;
				Для каждого СтрокаПараметра Из ТаблицаПараметров Цикл
					// установим индексы в строках, где они не были указаны
					Если ТипЗнч(СтрокаПараметра.Индекс) <> ТипаЧисло Тогда
						ИндексН = ИндексН + 1;
						СтрокаПараметра.Индекс = ИндексН;
					КонецЕсли; 
				КонецЦикла; 
				// список параметров в порядке индекса
				ТаблицаПараметров.Сортировать("Индекс asc");
				Для каждого СтрокаПараметра Из ТаблицаПараметров Цикл
					ПараметрыВызова.Добавить(СтрокаПараметра.Значение);
					ТипыПараметров.Добавить(СтрокаПараметра.ТипADO);
				КонецЦикла;
			КонецЕсли;
		КонецЕсли; 
		Попытка
			// обычный запрос ч/з ADO
			Если ИспользоватьМассивПараметров = Истина Тогда
				Опции.Вставить("Parameters", ирОбщий.ParametersArrayПолучитьЛкс(ПараметрыВызова, ТипыПараметров));
				РезультатRecordSet = ВыполнитьЗапросADO(ИсточникДанных, СоединениеADO, ЗапросОбъект, Опции, ЗапросТекст, Неопределено, Неопределено, ЕррорИнфо, выхРезультатПакета, ПредыдущийТекстПолногоЗапроса);
			Иначе
				РезультатRecordSet = ВыполнитьЗапросADO(ИсточникДанных, СоединениеADO, ЗапросОбъект, Опции, ЗапросТекст, ПараметрыВызова, ТипыПараметров, ЕррорИнфо, выхРезультатПакета, ПредыдущийТекстПолногоЗапроса);
			КонецЕсли; 
		Исключение
			ИнфоОшибки = ЛокОписаниеОшибки(ОписаниеОшибки());
		КонецПопытки;
	КонецЕсли;
	Если ПустаяСтрока(ЕррорИнфо) Тогда
		Возврат РезультатRecordSet;
	КонецЕсли;
	
~ВызыватьИсключение:
	Если ВыводитьСообщения Тогда
		ЕррорТекстС = "" + ЕррорИнфо;
		ирОбщий.СообщитьСУчетомМодальностиЛкс(ЕррорТекстС, МодальныйРежим, СтатусСообщения.Внимание);
	КонецЕсли; 
	
КонецФункции

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

// заполняет структуру с опциями ADO запроса значениями по умолчанию
Функция ОпцииЗапросаADOПоУмолчанию()
	
	СтруктураОпций = Новый Структура;
	СтруктураОпций.Вставить("RecordsetUse",Ложь);		// ч/з объект 'ADODB.Command'
	СтруктураОпций.Вставить("CommandTimeout",120);		// 120 сек.
	СтруктураОпций.Вставить("CommandType",8);			// adCmdUnknown
	СтруктураОпций.Вставить("NamedParameters",Истина);	// именованная передача параметров
	СтруктураОпций.Вставить("Prepared",Ложь);			// не использовать предподготовленный параметризованный запрос
	СтруктураОпций.Вставить("ExecuteOption",Неопределено); // не указано
	СтруктураОпций.Вставить("Options",Неопределено);	// не использовать аргумент Options в методах Command.Execute и Recordset.Open
	СтруктураОпций.Вставить("CursorType",0);			// adOpenForwardOnly
	СтруктураОпций.Вставить("CursorLocation",2);		// adUseServer
	СтруктураОпций.Вставить("LockType",-1);				// adLockUnspecified
	СтруктураОпций.Вставить("MarshalOptions",0);		// adMarshalAll
	СтруктураОпций.Вставить("CacheSize",1);				// размер кэша записей курсора по умолчанию	
	СтруктураОпций.Вставить("PageSize",10);				// размер страницы набора записей курсора по умолчанию
	СтруктураОпций.Вставить("MaxRecords",0);			// максимальное число возвращаемых строк результата
	
	СтруктураОпций.Вставить("Типизировать1С", Ложь);    // не типизировать
	СтруктураОпций.Вставить("БинарныеВСтроку", Ложь);		// не преобразовывать Binary(N) в строку-HEX (оставлять значение COMSafeArray)
	СтруктураОпций.Вставить("РезультатADOВРезультатЗапросаGWF", Ложь); // не преобразовывать результат запроса ADO в результат запроса 1С
	//СтруктураОпций.Вставить("ВыгрузкаРезультатаADOЧерезGWF", Ложь); // не использовать ВК GameWithFire.dll для выгрузки результата запроса ADO	
	//СтруктураОпций.Вставить("СмещениеГодаADO", Неопределено); // смещение дат для запроса
	Возврат СтруктураОпций;
	
КонецФункции

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

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

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

// Параметры - ПолучитьИсточникДанныхADO()
Процедура DisconnectADO(ИсточникДанных, выхСоединениеADO, стОпции=Неопределено, Еррорс=Неопределено) Экспорт
	Еррорс = Новый Массив;
	//Если НЕ ПустаяСтрока(Параметры.Disconnect) Тогда
		// заполним структуру параметров для подключению к источнику данных (тщательно все проверив):
		 
		// дополнительные параметры для соединения к источнику данных
		Если ТипЗнч(стОпции) <> Тип("Структура") Тогда
			стОпции = Новый Структура;
		КонецЕсли;
		
		//Доп_Путь = Неопределено;
		//Если стОпции.Свойство("Путь",Доп_Путь) Тогда
		//	// передали другой непустой путь - используем его
		//	Если ЗначениеЗаполнено(Доп_Путь) Тогда
		//		Параметры.Путь=Доп_Путь;
		//	КонецЕсли; 
		//КонецЕсли;
		//		
		//Если Истина
		//	И ИсточникДанных.ТипИсточникаДанных = 0 
		//	И ирОбщий.СтрокиРавныЛкс(Лев(ИсточникДанных.Путь, 7), "<Пусто>")
		//Тогда
		//	// выбор пути для сохранения нового файла с данными
		//	#Если Клиент Тогда
		//		ДиалогФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
		//		ДиалогФайла.Заголовок = "Выбор пути к файлу для сохранения данных:";
		//		ДиалогФайла.МножественныйВыбор = Ложь;
		//		ДиалогФайла.Фильтр = Сред(Параметры.Путь,8);
		//		Если ПустаяСтрока(ДиалогФайла.Фильтр) Тогда
		//			ДиалогФайла.Фильтр = "Все файлы(*.*)|*.*";
		//		КонецЕсли; 
		//		Если ДиалогФайла.Выбрать() Тогда
		//			Параметры.Вставить("Путь", ДиалогФайла.ПолноеИмяФайла);
		//			стОпции.Вставить("Путь", ДиалогФайла.ПолноеИмяФайла);
		//			стОпции.Вставить("Отказ", Ложь);
		//		Иначе
		//			стОпции.Вставить("Путь", Неопределено);
		//			стОпции.Вставить("Отказ", Истина);
		//			Еррорс.Добавить("Выбор пути для сохранения данных нового файла с данными отменен пользователем");
		//		КонецЕсли;
		//	#Иначе 
		//		Еррорс.Добавить("Не задан путь к файлу для сохранения данных нового файла");
		//	#КонецЕсли	
		//КонецЕсли; 
		 
		Попытка
			выхСоединениеADO.Close();
		Исключение
			Еррорс.Добавить(
			"Ошибка выполнения модуля закрытия соединения:
			|"+ОписаниеОшибки()+"
			|");
		КонецПопытки;
	//КонецЕсли; 
	выхСоединениеADO = Неопределено;
	
КонецПроцедуры

// функция возвращает текста запроса, исключив из него строчные комментарии SQL и 1С
// формирует соответствие описаний итогов в батчах пакета запросов, заданых в комментариях
Функция ОбработатьКомментарииЗапросаADO(ТекстЗапроса0,соИтогиБатчей=Неопределено) Экспорт
	ПарситьИтоги = (типЗнч(соИтогиБатчей) = Тип("Соответствие"));
	ТекстЗапросаО="";
	ТекстЗапросаК="";
	
	ЧС = СтрЧислоСтрок(ТекстЗапроса0);
	ЧО = 0;
	ЧК = 0;
	Для О=1 По ЧС Цикл
		// вырезаем из текста запроса строчные комментарии SQL и 1C
		СтрО = СтрПолучитьСтроку(ТекстЗапроса0,О);
		СтрС = СокрЛП(СтрО);
		ПриЗ = Лев(СтрС,2);
		Если ПриЗ = "--" ИЛИ ПриЗ = "//" Тогда
			Если ПарситьИтоги Тогда
				// собираем строчные комментарии для обработки описаний итогов в батчах пакета запросов
				ТекстЗапросаК = ТекстЗапросаК + ?(ЧК = 0, "", " ") + СокрЛП(Сред(СтрС,3));
				ЧК = ЧК + 1;
			КонецЕсли; 
			Продолжить;
		КонецЕсли;
		ТекстЗапросаО = ТекстЗапросаО + ?(ЧО = 0, "", Символы.ПС) + СтрО;
		ЧО = ЧО + 1;
	КонецЦикла;
	
	Если ПарситьИтоги Тогда
		соИтогиБатчей.Очистить();
		
		ДС0 = СтрДлина(ТекстЗапросаК);
		Если ДС0 > 0 Тогда
			// нормализуем текст комментария, заменив спецсимволы пробелами 
			ТекстЗапросаК = СтрЗаменить(ТекстЗапросаК, Символы.ВК, " ");
			ТекстЗапросаК = СтрЗаменить(ТекстЗапросаК, Символы.ВТаб, " ");
			ТекстЗапросаК = СтрЗаменить(ТекстЗапросаК, Символы.НПП, " ");
			ТекстЗапросаК = СтрЗаменить(ТекстЗапросаК, Символы.ПФ, " ");
			ТекстЗапросаК = СтрЗаменить(ТекстЗапросаК, Символы.Таб, " ");
			ДС1 = 0;
			Пока ДС1 <> ДС0 Цикл
				// уберем повторяющие пробелы 
				ДС0 = СтрДлина(ТекстЗапросаК);
				ТекстЗапросаК = СтрЗаменить(ТекстЗапросаК, "  ", " ");
				ДС1 = СтрДлина(ТекстЗапросаК);
			КонецЦикла;
			//ViewValue(Символы.ПС+ТекстЗапросаК+Символы.ПС,"Нормализованный текст комментариев");
			
			мсИтогиБатчей = Новый Массив;
			Пока СтрДлина(ТекстЗапросаК) > 0 Цикл
				ТекПоз1 = Найти(ТекстЗапросаК,"{");
				ТекПоз2 = Найти(ТекстЗапросаК,"}");
				Если ТекПоз1 > 0 И ТекПоз2 > 0 Тогда
					Если ТекПоз2 > ТекПоз1 Тогда
						СтрокаИтогов0 = СокрЛП(Сред(ТекстЗапросаК, ТекПоз1 + 1, ТекПоз2 - ТекПоз1-1));
						СтрокаИтогов1 = "";
						Если СтрДлина(СтрокаИтогов0) > 0 Тогда
							Если (Лев(ВРег(СтрокаИтогов0),5) = "ИТОГИ") Тогда
								СтрокаИтогов1 = СокрЛП(Сред(СтрокаИтогов0,6));
							ИначеЕсли (Лев(ВРег(СтрокаИтогов0),6) = "TOTALS") Тогда
								СтрокаИтогов1 = СокрЛП(Сред(СтрокаИтогов0,7));
							КонецЕсли;
							Если НЕ ПустаяСтрока(СтрокаИтогов1) Тогда
								мсИтогиБатчей.Добавить(СтрокаИтогов1);
							КонецЕсли; 
						КонецЕсли; 
						ТекстЗапросаК = Сред(ТекстЗапросаК, ТекПоз2 + 1);
					Иначе
						// закрывающая скобка '}' оказалась перед открывающейся '{'
						ТекстЗапросаК = Сред(ТекстЗапросаК, ТекПоз1); // продолжим обработку с открывающей скобки
					КонецЕсли; 
				Иначе
					// нет одной из скобок - перываем обработку
					Прервать;
				КонецЕсли; 
			КонецЦикла;
			
			Если мсИтогиБатчей.Количество() > 0 Тогда
				// заполним соответствие описаний итогов в батчах пакета запросов     
				ИндексСтрокиИтогов = -1;
				Для каждого СтрокаИтогов0 Из мсИтогиБатчей Цикл
					СтрокаИтогов1 = "";
					ЧислоСкобка1 = СтрЧислоВхождений(СтрокаИтогов0,"[");
					ЧислоСкобка2 = СтрЧислоВхождений(СтрокаИтогов0,"]");
					Если ЧислоСкобка1 = 0 И ЧислоСкобка2 = 0 Тогда
						ИндексСтрокиИтогов = ИндексСтрокиИтогов + 1;
						ИндексБатча = -1;
						СтрокаИтогов1 = СтрокаИтогов0;
					ИначеЕсли ЧислоСкобка1 = 1 И ЧислоСкобка2 = 1 Тогда
						ИндексСтрокиИтогов = ИндексСтрокиИтогов + 1;
						СтрокаИтогов0 = СтрЗаменить(СтрокаИтогов0,"[",Символы.ПС);
						СтрокаИтогов0 = СтрЗаменить(СтрокаИтогов0,"]",Символы.ПС);
						Попытка
							ИндексБатча = Цел(СокрЛП(СтрПолучитьСтроку(СтрокаИтогов0,2)));
						Исключение
							ИндексБатча = -1;
						КонецПопытки;
						СтрокаИтогов1 = СокрЛП(СтрПолучитьСтроку(СтрокаИтогов0,3));
					КонецЕсли; 
					Если НЕ ПустаяСтрока(СтрокаИтогов1) Тогда
						Если ИндексБатча < 0 Тогда
							соИтогиБатчей[ИндексСтрокиИтогов] = СтрокаИтогов1;
						Иначе
							соИтогиБатчей[ИндексБатча] = СтрокаИтогов1;
						КонецЕсли; 
					КонецЕсли; 
				КонецЦикла;
			КонецЕсли;
			
		КонецЕсли; 
		
	КонецЕсли; 
	
	Возврат ТекстЗапросаО;
КонецФункции 

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

Функция ПараметрыПлатформыADO_УстановитьПоУмолчанию(ИсточникДанных, ПлатформаЗначение) Экспорт
	
	Если ИсточникДанных.Платформа <> ПлатформаЗначение Тогда
		ИсточникДанных.Платформа = ПлатформаЗначение;
	КонецЕсли;
    ПлатформаПар = ПараметрыПлатформыADO_Получить(ПлатформаЗначение);
	ИсточникДанных.СтрокаСоединения = ПлатформаПар.СтрокаСоединения;
	ИсточникДанных.ТипИсточникаДанных = ПлатформаПар.ТипИсточникаДанных;
	Если ТипИДADO = 0 Тогда
		// источник - файл с данными
		Если ЗначениеЗаполнено(ПлатформаПар.МаскаФайлов) Тогда
			// установим маску файлов, если указана
			ИсточникДанных.Путь = ПлатформаПар.МаскаФайлов;
		КонецЕсли; 
	КонецЕсли;
	Возврат ПлатформаПар;
КонецФункции

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

Функция ПолучитьИсточникДанныхADO()
	
	ИсточникДанныхADO = ПолучитьСтруктуруИсточникаДанныхADO();
	ИсточникДанныхADO.Платформа = ПлатформаADO;
	ИсточникДанныхADO.Путь = ПутьКИсточникуДанныхADO;
	ИсточникДанныхADO.БазаСервер = БазаСерверADO;
	ИсточникДанныхADO.БазаИмя = БазаИмяADO;
	ИсточникДанныхADO.Пользователь = ПользовательADO;
	ИсточникДанныхADO.Пароль = ПарольADO;
	ИсточникДанныхADO.АутентификацияОС = АутентификацияОС;
	ИсточникДанныхADO.СтрокаСоединения = СтрокаСоединенияADO;
	ПараметрыПлатформыADO = ПараметрыПлатформыADO_Получить(ПлатформаADO);
	ИсточникДанныхADO.ТипИсточникаДанных = ПараметрыПлатформыADO.ТипИсточникаДанных;
	Возврат ИсточникДанныхADO;
	 
КонецФункции

// Форма ADO

Процедура УстановитьИсточникДанныхADO(ПараметрыADO, УстановитьМодифицированность = Истина)

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

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

Функция ОбновитьДоступностьКнопкиОтключиться()

	ЭлементыФормы.Отключиться.Доступность = Истина
		И мСоединениеADO <> Неопределено
		И мСоединениеADO.State = 1;

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

Процедура СтрокаСоединенияADOНачалоВыбора(Элемент, СтандартнаяОбработка)
	
	ирКлиент.ПолеВводаСтрокиСоединенияADODBНачалоВыбораЛкс(Элемент, СтандартнаяОбработка);
	
КонецПроцедуры

Процедура УстановитьЭлементыФормыADO()
	
	//СписокВыбора = ЭлементыФормы.CommandType.СписокВыбора;
	//СписокВыбора.Очистить();
	//СписокВыбора.Добавить(Неопределено,"<< Неопределено >>");
	//СписокВыбора.Добавить(-1,strCommandTypeADOЛкс(-1));
	//СписокВыбора.Добавить(+1,strCommandTypeADOЛкс(+1));
	//СписокВыбора.Добавить(+2,strCommandTypeADOЛкс(+2));
	//СписокВыбора.Добавить(+4,strCommandTypeADOЛкс(+4));
	//СписокВыбора.Добавить(+8,strCommandTypeADOЛкс(+8));
	//СписокВыбора.Добавить(+256,strCommandTypeADOЛкс(+256));
	//СписокВыбора.Добавить(+512,strCommandTypeADOЛкс(+512));
	//
	//СписокВыбора = ЭлементыФормы.ExecuteOption.СписокВыбора;
	//СписокВыбора.Очистить();
	//СписокВыбора.Добавить(Неопределено,"<< Неопределено >>");
	//СписокВыбора.Добавить(-1,strExecuteOptionЛкс(-1));
	//СписокВыбора.Добавить(+16,strExecuteOptionЛкс(+16));
	//СписокВыбора.Добавить(+32,strExecuteOptionЛкс(+32));
	//СписокВыбора.Добавить(+64,strExecuteOptionЛкс(+64));
	//СписокВыбора.Добавить(+128,strExecuteOptionЛкс(+128));
	//СписокВыбора.Добавить(+256,strExecuteOptionЛкс(+256));
	//СписокВыбора.Добавить(+512,strExecuteOptionЛкс(+512));
	//
	//СписокВыбора = ЭлементыФормы.CursorType.СписокВыбора;
	//СписокВыбора.Очистить();
	//СписокВыбора.Добавить(Неопределено,"<< Неопределено >>");
	//СписокВыбора.Добавить(-1,strCursorTypeЛкс(-1));
	//СписокВыбора.Добавить(+0,strCursorTypeЛкс(+0));
	//СписокВыбора.Добавить(+1,strCursorTypeЛкс(+1));
	//СписокВыбора.Добавить(+2,strCursorTypeЛкс(+2));
	//СписокВыбора.Добавить(+3,strCursorTypeЛкс(+3));
	//
	//СписокВыбора = ЭлементыФормы.CursorLocation.СписокВыбора;
	//СписокВыбора.Очистить();
	//СписокВыбора.Добавить(Неопределено,"<< Неопределено >>");
	//СписокВыбора.Добавить(+1,strCursorLocationЛкс(1));
	//СписокВыбора.Добавить(+2,strCursorLocationЛкс(2));
	//СписокВыбора.Добавить(+3,strCursorLocationЛкс(3));
	//
	//СписокВыбора = ЭлементыФормы.LockType.СписокВыбора;
	//СписокВыбора.Очистить();
	//СписокВыбора.Добавить(Неопределено,"<< Неопределено >>");
	//СписокВыбора.Добавить(-1,strLockTypeЛкс(-1));
	//СписокВыбора.Добавить(+1,strLockTypeЛкс(+1));
	//СписокВыбора.Добавить(+2,strLockTypeЛкс(+2));
	//СписокВыбора.Добавить(+3,strLockTypeЛкс(+3));
	//СписокВыбора.Добавить(+4,strLockTypeЛкс(+4));
	//
	//СписокВыбора = ЭлементыФормы.MarshalOptions.СписокВыбора;
	//СписокВыбора.Очистить();
	//СписокВыбора.Добавить(Неопределено,"<< Неопределено >>");
	//СписокВыбора.Добавить(+0,strMarshalOptionsЛкс(+0));
	//СписокВыбора.Добавить(+1,strMarshalOptionsЛкс(+1));
	//
	//СписокВыбора = ЭлементыФормы.GWFYearOffset.СписокВыбора;
	//СписокВыбора.Очистить();
	//СписокВыбора.Добавить(Неопределено,"<< Неопределено >>");
	//СписокВыбора.Добавить(+0000,"0");
	//СписокВыбора.Добавить(+2000,"2000");
	
	ADOUtils = ПолучитьADOUtils(Ложь);
	Элемент = ЭлементыФормы.РамкаGameWithFire;
	Элемент.Заголовок = "Настройки компоненты GameWithFire.dll";
	Если ADOUtils = Неопределено Тогда
		Элемент.ЦветРамки = WebЦвета.Коричневый;
		Элемент.Заголовок = Элемент.Заголовок + " (ВК - недоступна !)";
	Иначе
		Элемент.ЦветРамки = WebЦвета.Ультрамарин;
	КонецЕсли;
	
КонецПроцедуры

Процедура ПлатформаADOПриИзменении(Элемент =  Неопределено) 
	
	Элемент = ЭлементыФормы.ПлатформаADO;
	ИсточникДанныхADO = ПолучитьИсточникДанныхADO();
	
	// по значению платформы заполним настройки по умолчанию
	ПлатфПар = ПараметрыПлатформыADO_УстановитьПоУмолчанию(ИсточникДанныхADO, Элемент.Значение);
	
	//// переинициализируем контекстное меню для вставки ключевых слов строку соединений:
	//Если (Элемент.Значение>=0001)И(Элемент.Значение<0100) Тогда
	//	//платформа "Произвольный COM" или подключения ч/з ADO:
	//	ВидМеню=2; // доп.команды для ввода провайдеров OLEDB, драйверов ODBC и прочих параметров соединения
	//Иначе
	//	ВидМеню=1;
	//КонецЕсли; 
	//Действие=Новый Действие("СоединениеМенюВставитьМакроимя");
	//КонтекстноеМенюЗаполнить(ЭлементыФормы.СоединениеМеню.Кнопки.Подменю,ВидМеню,Действие);
	УстановитьИсточникДанныхADO(ИсточникДанныхADO);
	ФормаКонтроль_ПлатформаADO(ПлатфПар);
	ФормаКонтроль_ТипИДADO();

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

Процедура ФормаКонтроль_ТипИДADO()
	
	ЭтотОбъект.мСоединениеADO = Неопределено;
	ОбновитьДоступностьКнопкиОтключиться();
	ФайловыйИД = Истина;
	ПутьДоступен = Неопределено;
	ПутьМаскаФайлов = Неопределено;
	ДоступИнфо = "";
	Если ТипИДADO = 0 Тогда
		НадписьПутьЗаголовок = "Путь к файлу с данными (при подключении блокируется):";
		Если ПустаяСтрока(ПутьКИсточникуДанныхADO) Тогда
			ДоступИнфо = "выбирается перед подключением";
			ПутьДоступен = Истина;
		Иначе
			ПутьДоступен = ДоступностьПутиИсточникаДанных(ПутьКИсточникуДанныхADO, Ложь, ДоступИнфо, ПутьМаскаФайлов);
			Если ПутьМаскаФайлов = Истина И (Лев(Нрег(ПутьКИсточникуДанныхADO), 7) <> Нрег("<Пусто>")) Тогда
				ДоступИнфо = ДоступИнфо + " для выбора перед подключением";
			КонецЕсли; 
		КонецЕсли; 
	ИначеЕсли ТипИДADO = 1 Тогда
		НадписьПутьЗаголовок = "Путь к каталогу файловой базы данных:";
		ПутьДоступен = ДоступностьПутиИсточникаДанных(ПутьКИсточникуДанныхADO, Истина, ДоступИнфо, ПутьМаскаФайлов);
		Если ПутьМаскаФайлов = Истина Тогда
			ДоступИнфо = ДоступИнфо + " !!!";
		КонецЕсли; 
	ИначеЕсли ТипИДADO = 2 Тогда
		НадписьПутьЗаголовок = "Путь к источнику данных:";
		ФайловыйИД = Ложь;
	ИначеЕсли ТипИДADO = 3 Тогда
		//НадписьПутьЗаголовок="Путь (URL) к ресурсу интернета:";
		НадписьПутьЗаголовок = "Путь к источнику данных:";
	КонецЕсли; 
	ЭлементыФормы.НадписьПутьКИсточникуДанныхADO.Заголовок = НадписьПутьЗаголовок + ?(ПустаяСтрока(ДоступИнфо), "", " ") + ДоступИнфо;
	//Шрифт=ЭлементыФормы.НадписьТипИД.Шрифт;
	//Если ПутьДоступен=Неопределено ИЛИ ПутьДоступен=Истина Тогда
	//	Если ПутьДоступен=Истина И НЕ ПустаяСтрока(ДоступИнфо) Тогда
	//		ЦветТекста=Новый Цвет(0, 0, 255);	// голубой
	//	Иначе
	//		ЦветТекста=Новый Цвет(0, 0, 128);	// темно-синий
	//	КонецЕсли;
	//Иначе
	//	Если НРег(ПутьКИсточникуДанныхADO)=Нрег("<Пусто>") Тогда
	//		ЦветТекста=Новый Цвет(128, 0, 128);		// лиловым жырным
	//	Иначе
	//		ЦветТекста=Новый Цвет(255, 0, 0);		// красный жырным
	//	КонецЕсли; 
	//	Шрифт=Новый Шрифт(Шрифт,,,Истина);
	//КонецЕсли;
	//ЭлементыФормы.НадписьПуть.ЦветТекста=ЦветТекста;
	//ЭлементыФормы.НадписьПуть.Шрифт=Шрифт;
	Если ФайловыйИД Тогда
		ЭлементыФормы.ПанельПутьИД.ТекущаяСтраница = ЭлементыФормы.ПанельПутьИД.Страницы.ФайловыйИД;
	Иначе
		ЭлементыФормы.ПанельПутьИД.ТекущаяСтраница = ЭлементыФормы.ПанельПутьИД.Страницы.СерверныйИД;
	КонецЕсли; 

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

Процедура ФормаКонтроль_ПлатформаADO(ПлатфПар = Неопределено)
	
	Если ПлатфПар = Неопределено Тогда
	    ПлатфПар = ПараметрыПлатформыADO_Получить(ПлатформаADO);
	КонецЕсли;
	ЭлементыФормы.ТипИД0.Доступность=ПлатфПар.ТипИсточникаДанных = 0;
	ЭлементыФормы.ТипИД1.Доступность=ПлатфПар.ТипИсточникаДанных = 1;
	ЭлементыФормы.ТипИД2.Доступность=ПлатфПар.ТипИсточникаДанных = 2;
	ЭлементыФормы.ТипИД3.Доступность=ПлатфПар.ТипИсточникаДанных = 3;
	
КонецПроцедуры 

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

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

Процедура ПутьКИсточникуДанныхADOНачалоВыбора(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ВыборФайла = Ложь;
	Если ТипИДADO = 0 Тогда
		ВыборФайла = Истина;
		НадписьПутьЗаголовок = "Выбор пути к файлу с данными:";
	ИначеЕсли ТипИДADO = 1 Тогда
		НадписьПутьЗаголовок = "Выбор пути к каталогу файловой базы данных:";
	ИначеЕсли ТипИДADO = 2 Тогда
		НадписьПутьЗаголовок = "Выбор пути к источнику данных:";
		Возврат;
	ИначеЕсли ТипИДADO = 3 Тогда
		НадписьПутьЗаголовок = "Выбор пути (URL) к ресурсу интернета:";
		Возврат;
	КонецЕсли;
	ДиалогФайла = Новый ДиалогВыбораФайла(?(ВыборФайла = Ложь, РежимДиалогаВыбораФайла.ВыборКаталога, РежимДиалогаВыбораФайла.Открытие));
	ДиалогФайла.Заголовок = НадписьПутьЗаголовок;
	ДиалогФайла.МножественныйВыбор = Ложь;
	
	Если ВыборФайла=Ложь Тогда
		ДиалогФайла.Каталог=ПутьКИсточникуДанныхADO;
	Иначе
		ДопМаска="";
		Если (Найти(ПутьКИсточникуДанныхADO,"*")>0)ИЛИ(Найти(ПутьКИсточникуДанныхADO,"?")>0) Тогда
			Если (Лев(Нрег(ПутьКИсточникуДанныхADO),7)=Нрег("<Пусто>")) Тогда
				ДопМаска=СокрЛП(Сред(ПутьКИсточникуДанныхADO,8));
			Иначе
				ДопМаска=СокрЛП(ПутьКИсточникуДанныхADO);
			КонецЕсли;
			Если (СтрЧислоВхождений(ПутьКИсточникуДанныхADO,"|")=0) Тогда
				ДопМаска="Задано в форме узла("+ДопМаска+")|"+ДопМаска;
			КонецЕсли; 
		КонецЕсли;
		Если ДопМаска="" Тогда
			ДиалогФайла.ПолноеИмяФайла=ПутьКИсточникуДанныхADO;
			ФайлПуть=Новый Файл(ПутьКИсточникуДанныхADO);
			Если ФайлПуть.Существует() Тогда
				ДиалогФайла.Каталог=ФайлПуть.Путь;
			КонецЕсли;
			ДиалогФайла.Фильтр="Все файлы(*.*)|*.*";
		Иначе
			ДиалогФайла.Фильтр=ДопМаска+"|Все файлы(*.*)|*.*";
		КонецЕсли; 
	КонецЕсли; 
	
	Если ДиалогФайла.Выбрать() Тогда
		ЭтаФорма.Модифицированность = Истина;
		Если ВыборФайла=Ложь Тогда
			ЭтаФорма.ПутьКИсточникуДанныхADO = ДиалогФайла.Каталог;
			ЭтаФорма.ПутьКИсточникуДанныхADO = ПутьКИсточникуДанныхADO + ?(Прав(ПутьКИсточникуДанныхADO,1)="\","","\");
		Иначе
			ЭтаФорма.ПутьКИсточникуДанныхADO = СокрЛП(ДиалогФайла.ПолноеИмяФайла);
		КонецЕсли; 
		ПутьКИсточникуДанныхADOПриИзменении(Элемент)
	КонецЕсли; 

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

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

Процедура ПробноеПодключениеADOНажатие(Элемент)
	
	//СоединениеADO = ПолучитьСоединениеADO(Истина, Истина, Истина);
	СоединениеADO = ПолучитьСоединениеADO(Истина, Ложь, Истина);

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

Процедура ТипИДADOПриИзменении(Элемент)

	ИсточникДанныхADO = ПолучитьИсточникДанныхADO();
	ПлатфПар = ТипИДADO_УстановитьПоУмолчанию(ИсточникДанныхADO);
	УстановитьИсточникДанныхADO(ИсточникДанныхADO);
	ФормаКонтроль_ПлатформаADO(ПлатфПар);
	ФормаКонтроль_ТипИДADO();
	
КонецПроцедуры

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

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

Функция ЗаполнитьВыборкиИтоговИзЗапроса(СообщатьОбОшибке = Ложь)

	ВыборкиИтогов.Очистить();
	мРегВыражение = мПлатформа.мРегВыражение;
	мРегВыражение.Multiline = Ложь;
	мРегВыражение.Pattern = "(\s|{)(ИТОГИ|TOTALS)(\s|})";
	ТекстЗапроса = ПолучитьТекстЗапроса(мСтруктурноеРедактирование);
	Если мРегВыражение.Проверить(ТекстЗапроса) Тогда // грязно
		ПостроительЗапроса = ПолучитьПостроительЗапросовДляИтогов(СообщатьОбОшибке, ТекстЗапроса);
		Если ПостроительЗапроса = Неопределено Тогда
			Возврат Ложь;
		КонецЕсли; 
		ТекстБезКОмментариев = ПолеТекстаЗапроса.ЗалитьКомментарииИСтроковыеЛитералы(ПостроительЗапроса.Текст);
		мРегВыражение.Pattern = "(\s|,)(ОБЩИЕ|OVERALL)(\s|,|}|$)";
		//Если Найти(Нрег(ТекстБезКомментариев), НРег("ОБЩИЕ")) Тогда // Грязно
		Если мРегВыражение.Проверить(ТекстБезКОмментариев) Тогда // грязно
			НоваяСтрока = ВыборкиИтогов.Добавить();
			НоваяСтрока.Включена = Истина;
			НоваяСтрока.Группировки = "ОБЩИЕ";
			НоваяСтрока.Имя = "ОБЩИЕ";
			НоваяСтрока.ТипОбхода = ОбходРезультатаЗапроса.ПоГруппировкам;
		КонецЕсли; 
		СписокГруппировок = Новый СписокЗначений;
		Для каждого Измерение Из ПостроительЗапроса.Измерения Цикл
			НоваяСтрока = ВыборкиИтогов.Добавить();
			НоваяСтрока.Включена = Истина;
			НоваяСтрока.Группировки = Измерение.Имя;
			НоваяСтрока.Имя = Измерение.Имя;
			Если Измерение.ТипИзмерения = ТипИзмеренияПостроителяЗапроса.Элементы Тогда
				НоваяСтрока.ТипОбхода = ОбходРезультатаЗапроса.ПоГруппировкам;
			Иначе	
				НоваяСтрока.ТипОбхода = ОбходРезультатаЗапроса.ПоГруппировкамСИерархией;
			КонецЕсли; 
		КонецЦикла; 
	КонецЕсли;
	ДобавитьВыборкуИтоговДетальныеЗаписи();
	Возврат Истина;

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

Процедура ДобавитьВыборкуИтоговДетальныеЗаписи()
	
	Перем НоваяСтрока;
	
	НоваяСтрока = ВыборкиИтогов.Добавить();
	НоваяСтрока.Включена = Истина;
	НоваяСтрока.Группировки = "";
	НоваяСтрока.Имя = "ДетальныеЗаписи";
	НоваяСтрока.ТипОбхода = ОбходРезультатаЗапроса.ПоГруппировкам;

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

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

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

Процедура СоздатьКолонкиПриемникаРезультата()
	
	РезультатКоллекция.Колонки.Очистить();
	сч = 0;
	//Если СпособВыборки = 2 Тогда
		//Будем показывать и выборки
		НовКолонка = РезультатКоллекция.Колонки.Вставить(сч);
		НовКолонка.Имя = мИмяКолонкиВыборка;
		НовКолонка.Заголовок = "<Выборка>";
		сч = сч + 1;
	//КонецЕсли; 
	Если ДобавлятьСлужебныеКолонкиРезультата Тогда
		//добавим служебные колонки
		НовКолонка = РезультатКоллекция.Колонки.Вставить(сч);
		НовКолонка.Имя = мИмяКолонкиЗначениеГруппировки;
		НовКолонка.Заголовок = "<Группировка>";
		сч = сч + 1;
		НовКолонка = РезультатКоллекция.Колонки.Вставить(сч, Новый ОписаниеТипов("Число"));
		НовКолонка.Имя = мИмяКолонкиКоличествоПотомков;
		НовКолонка.Заголовок = "<Число потомков>";
		НовКолонка.Ширина = 10;
		сч = сч + 1;
		НовКолонка = РезультатКоллекция.Колонки.Вставить(сч);
		НовКолонка.Имя = мИмяКолонкиИмяГруппировки;
		НовКолонка.Заголовок = "<Имя группировки>";
		НовКолонка.Ширина = 20;
		сч = сч + 1;
		НовКолонка = РезультатКоллекция.Колонки.Вставить(сч);
		НовКолонка.Имя = мИмяКолонкиТипЗаписи;
		НовКолонка.Заголовок = "<Тип записи>";
		НовКолонка.Ширина = 15;
		сч = сч + 1;
		КЧ = Новый КвалификаторыЧисла(10,0);
		НовКолонка = РезультатКоллекция.Колонки.Вставить(сч, Новый ОписаниеТипов("Число"));
		НовКолонка.Имя = мИмяКолонкиУровень;
		НовКолонка.Заголовок = "<Уровень>";
		НовКолонка.Ширина = 7;
	КонецЕсли;
	Для каждого КолонкаРезультата Из мРезультатЗапроса.Колонки Цикл
		РезультатКоллекция.Колонки.Добавить(КолонкаРезультата.Имя, КолонкаРезультата.ТипЗначения,, КолонкаРезультата.Ширина);
	КонецЦикла; 
	//РезультатКоллекцияПослеДобавленияКолонок();
	
КонецПроцедуры

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

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

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

Процедура АвтогруппировкиПриИзменении(Элемент)
	
	ПанельЗапросаПриСменеСтраницы();

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

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

Процедура РезультатКоллекцияВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)

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

Процедура СпособВыгрузкиПриИзменении(Элемент)
	
	ирКлиент.УстановитьГотовностьДанныхСтраницыЛкс(ЭтаФорма, ЭлементыФормы.ПанельРезультата.Страницы.РезультатКоллекция, Ложь);
	ЗагрузитьРезультатЗапроса(,, Истина);
	
КонецПроцедуры

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

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

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

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

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

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

Процедура ПоместитьТаблицуЗначенийВоВременнуюТаблицу(Знач ИмяТаблицы, ТаблицаЗначений)
	
	мОбъектЗапроса.Текст = "УНИЧТОЖИТЬ " + ИмяТаблицы;
	Попытка
		мОбъектЗапроса.Выполнить();
	Исключение
	КонецПопытки;
	ИмяПараметраЗапроса = "ТЗ";
	мОбъектЗапроса.Текст = ирОбщий.ТекстЗапросаПоместитьИзПараметраЛкс(ИмяТаблицы, ИмяПараметраЗапроса);
	мОбъектЗапроса.Параметры.Вставить(ИмяПараметраЗапроса, ТаблицаЗначений);
	Попытка
		мОбъектЗапроса.Выполнить();
	Исключение
		ОписаниеОшибки = ОписаниеОшибки();
		ирОбщий.СообщитьСУчетомМодальностиЛкс("Ошибка помещения данных во временную таблицу 1С с именем запроса (""" + ИмяТаблицы + """): " + ОписаниеОшибки,
		МодальныйРежим, СтатусСообщения.Внимание);
		//Возврат;
	КонецПопытки; 
	ОбновитьСтатусВременойТаблицы(ИмяТаблицы);
	//мИзмененияМенеджераВременныхТаблиц.Вставить(НРег(ИмяТаблицы), ИмяТаблицы);
	ирОбщий.СообщитьСУчетомМодальностиЛкс(XMLСтрока(ТаблицаЗначений.Количество()) 
	+ " строк были помещены во временную таблицу 1С """ + ИмяТаблицы + """", МодальныйРежим, СтатусСообщения.Информация);

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

Процедура ОтключитьсяНажатие(Элемент)

	ОтключитьИсточникДанныхADO();
	
КонецПроцедуры

Процедура ОтключитьИсточникДанныхADO()
	
	УдалитьВременныеТаблицыADO();
	Если мКомандаADO <> Неопределено Тогда
		мСоединениеADO = мКомандаADO.ActiveConnection;
	КонецЕсли; 
	Если мСоединениеADO <> Неопределено Тогда
		ИсточникДанных = ПолучитьИсточникДанныхADO();
		DisconnectADO(ИсточникДанных, мСоединениеADO);
	КонецЕсли; 
	ОбновитьДоступностьКнопкиОтключиться();

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

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

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

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

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

Процедура ОбновитьТабличноеПолеВременныхТаблиц()

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

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

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

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

Процедура ВременныеТаблицыПередУдалением(Элемент, Отказ)
	
	УдалитьВременнуюТаблицу(Элемент.ТекущиеДанные.Имя);
	
КонецПроцедуры

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

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

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

Процедура КоманднаяПанельКоллекцияВставитьВТекстЗапроса(Кнопка)

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

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

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

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

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

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

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

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

Процедура КоманднаяПанельОбработкаСтрокиРезультатаЗаписьНаСервере(Кнопка)

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

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

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

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

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

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

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

Процедура КоманднаяПанельПараметрыРедакторОбъектаБД(Кнопка)
	
	ирКлиент.ОткрытьСсылкуЯчейкиВРедактореОбъектаБДЛкс(ЭлементыФормы.Параметры, "Значение");
	
КонецПроцедуры

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

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

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

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

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

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

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

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

Процедура ЭтаБДНажатие(Элемент)
	
	ИсточникДанныхADO = ПолучитьИсточникДанныхADO();
	ЗаполнитьПараметрыADOДляЭтойБД(ИсточникДанныхADO);
	ТипИДADO_УстановитьПоУмолчанию(ИсточникДанныхADO);
	ЗаполнитьЗначенияСвойств(ЭтаФорма, ИсточникДанныхADO);
	УстановитьИсточникДанныхADO(ИсточникДанныхADO);
	ФормаКонтроль_ПлатформаADO();
	ФормаКонтроль_ТипИДADO();
	
КонецПроцедуры

Процедура КП_СвойстваСтрокиРезультатаСравнить(Кнопка)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура АвтовключениеВыбранныхНастроекКомпоновки(Кнопка)
	
	Кнопка.Пометка = Не Кнопка.Пометка;
	
КонецПроцедуры

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

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

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

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

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

Процедура ЗаменитьЛитераломОбращенияКПараметру(Знач СтрокаПараметра)
	
	#Если Сервер И Не Сервер Тогда
		ПолеТекстаЗапроса = Обработки.ирКлсПолеТекстаПрограммы.Создать();
	#КонецЕсли
	ТекстЗамены = "";
	ЗначениеПараметра = СтрокаПараметра.Значение;
	ТипЗначенияПараметра = ТипЗнч(ЗначениеПараметра);
	Если Ложь
		Или ТипЗначенияПараметра = Тип("СписокЗначений") 
		Или ТипЗначенияПараметра = Тип("Массив")
	Тогда
		Если ТипЗначенияПараметра = Тип("СписокЗначений") Тогда
			Массив = ЗначениеПараметра.ВыгрузитьЗначения();
		Иначе
			Массив = ЗначениеПараметра;
		КонецЕсли; 
		ТекстЗамены = "";
		Для Каждого ЭлементМассива Из Массив Цикл
			Если ТекстЗамены <> "" Тогда
				ТекстЗамены = ТекстЗамены + ", ";
			КонецЕсли; 
			ТекстЗаменыЭлемента = ПолеТекстаЗапроса.ПредставлениеЗначенияВЯзыкеЗапросов(ЭлементМассива, Истина);
			Если Не ЗначениеЗаполнено(ТекстЗаменыЭлемента) Тогда
				Возврат;
			КонецЕсли;
			ТекстЗамены = ТекстЗамены + ТекстЗаменыЭлемента;
		КонецЦикла;
		КоличествоЗначений = Массив.Количество();
	Иначе
		КоличествоЗначений = 1;
		ТекстЗамены = ПолеТекстаЗапроса.ПредставлениеЗначенияВЯзыкеЗапросов(ЗначениеПараметра, Истина);
		Если Не ЗначениеЗаполнено(ТекстЗамены) Тогда
			Возврат;
		КонецЕсли;
	КонецЕсли; 
	Если ЗначениеЗаполнено(ТекстЗамены) Тогда
		ИскомаяСтрока = "&" + СтрокаПараметра.ИмяПараметра;
		СловоЦеликом = Истина;
		Если КоличествоЗначений > 1 Тогда
			// http://www.hostedredmine.com/issues/836903
			// http://devtool1c.ucoz.ru/forum/2-1163-1
			ИскомаяСтрока = "(" + ИскомаяСтрока + ")";
			ТекстЗамены = "(" + ТекстЗамены + ")";
			СловоЦеликом = Ложь;
		КонецЕсли; 
		Пока ПолеТекстаЗапроса.НайтиПоказатьСловоВТексте(ИскомаяСтрока, СловоЦеликом,,, Истина) Цикл
			ПолеТекстаЗапроса.ПолеТекста.ВыделенныйТекст(ТекстЗамены);
		КонецЦикла; 
		Если мСтруктурноеРедактирование Тогда
			ирОбщий.СообщитьЛкс("Обращения к параметру " + ИскомаяСтрока + " заменены на " + ТекстЗамены + " в тексте текущего подзапроса.");
		Иначе
			Если ПолеТекстаЗапроса.НайтиПоказатьСловоВТексте("&" + СтрокаПараметра.ИмяПараметра,,,, Истина) Тогда
				ирОбщий.СообщитьЛкс("Обращения к параметру в виде " + ИскомаяСтрока + " заменены на " + ТекстЗамены + ", но остались другие незаменяемые обращения.");
			Иначе
				ирОбщий.СообщитьЛкс("Все обращения к параметру " + ИскомаяСтрока + " заменены на " + ТекстЗамены + ", а сам параметр удален.");
				Параметры.Удалить(СтрокаПараметра);
			КонецЕсли; 
		КонецЕсли; 
	КонецЕсли;

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

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

Процедура КП_СвойстваСтрокиРезультатаРедакторОбъектаБД(Кнопка)
	
	ирКлиент.ОткрытьСсылкуЯчейкиВРедактореОбъектаБДЛкс(ЭлементыФормы.СвойстваСтрокиРезультата, "Значение");
	
КонецПроцедуры

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

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

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

Процедура КоманднаяПанельЗапросаРезультатаСтатистикаMSSQLПоПоследнимЗапросам(Кнопка)
	
	ирКлиент.ОткрытьСтатистикаMSSQLПоПоследнимЗапросамЛкс(мАнализТехножурнала.НачалоПериодаСервера, мАнализТехножурнала.КонецПериодаСервера);
	
КонецПроцедуры

Процедура КоманднаяПанельОбработкаСтрокиРезультатаВыполнятьНаСервере(Кнопка)
	
	УстановитьРежимВыполненияКодаНаСервере(Не ЭтотОбъект.НаСервере);

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

Процедура КоманднаяПанельОбработкиРезультатаВыполнятьНаСервере(Кнопка)
	
	УстановитьРежимВыполненияКодаНаСервере(Не ЭтотОбъект.НаСервере);
	
КонецПроцедуры

Процедура КоманднаяПанельПараметрыВыполнятьНаСервере(Кнопка)
	
	УстановитьРежимВыполненияКодаНаСервере(Не ЭтотОбъект.НаСервере);

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

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

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

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

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

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

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

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

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

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

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

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

Процедура КоманднаяПанельКоллекцияРасшифроватьСтроку(Кнопка = Неопределено)
	
	ЭлементыФормы.ПочемуНетНужнойСтроки.Видимость = Ложь;
	Если Не ЛиПарсерЗапросаДоступен(Истина) Тогда
		Возврат;
	КонецЕсли;
	Если мОписаниеРезультата = Неопределено Тогда
		ирОбщий.СообщитьЛкс("Сначала нужно выполнить запрос");
		Возврат;
	КонецЕсли;
	//ТекстЗапроса = ПолучитьТекстЗапроса(мСтруктурноеРедактирование);
	ТекстЗапроса = ирОбщий.ПервыйФрагментЛкс(мОписаниеРезультата.ТекстЗапроса, КомментарийСлужебнойВыборки());
	КомпонентаТекстаЗапроса = ПолеТекстаЗапроса;
	#Если Сервер И Не Сервер Тогда
	    КомпонентаТекстаЗапроса = Обработки.ирКлсПолеТекстаПрограммы.Создать();
	#КонецЕсли
	Если ЭлементыФормы.РезультатКоллекция.ТекущаяСтрока = Неопределено Тогда
		//Если Кнопка = Неопределено Тогда
			Ответ = КодВозвратаДиалога.ОК;
		//Иначе
		//	Ответ = Вопрос("Выполнить запрос без отбора?", РежимДиалогаВопрос.ОКОтмена);
		//КонецЕсли;
	Иначе
		Ответ = Вопрос("Да - использовать текущую строку. Нет - выполнить запрос без отбора.", РежимДиалогаВопрос.ДаНетОтмена);
	КонецЕсли; 
	Если Ответ = КодВозвратаДиалога.Нет Или Ответ = КодВозвратаДиалога.ОК Тогда
		КонструкторЗапроса = КомпонентаТекстаЗапроса.ПолучитьФорму("КонструкторЗапроса");
		КонструкторЗапроса.ВосстановитьНастройкиФормы();
		Если КонструкторЗапроса.ЗагрузитьТекстВКонструктор(ТекстЗапроса, КонструкторЗапроса) Тогда 
			КонструкторЗапроса.ЗагрузитьПоследнийЗапрос();
			КонструкторЗапроса.ТипЗапроса = 0;
			Если Не КонструкторЗапроса.ОпцияПервые Тогда
				КонструкторЗапроса.ОпцияПервые = 1;
				КонструкторЗапроса.ПервыеКоличество = 100000;
			КонецЕсли; 
			КонструкторЗапроса.ВыбратьВсеПоляИспользованныеВВыражениях(Ложь);
			ТаблицыЗапроса = Новый СписокЗначений;
			ТаблицыВнутреннихСоединений = КонструкторЗапроса.ОтключитьОтборыЗапроса(ТаблицыЗапроса);
			#Если Сервер И Не Сервер Тогда
				ТаблицыВнутреннихСоединений = Новый СписокЗначений;
			#КонецЕсли
			МаксРазмерРезультата = 1;
			Для Каждого ОписаниеТаблицы Из ТаблицыЗапроса Цикл
				Если Лев(ОписаниеТаблицы.Представление, 1) = "(" Тогда
					// Вложенный запрос
					ИмяОсновнойТаблицы = ОписаниеТаблицы.Представление;
				Иначе
					ИмяОсновнойТаблицы = ирОбщий.ПервыйФрагментЛкс(ОписаниеТаблицы.Представление, "(");
					Если ирОбщий.ТипТаблицыБДЛкс(ИмяОсновнойТаблицы) = "ВиртуальнаяТаблица" Тогда
						ИмяОсновнойТаблицы = ирОбщий.СтрокаБезПоследнегоФрагментаЛкс(ИмяОсновнойТаблицы);
					КонецЕсли;
				КонецЕсли;
				РезультатПакета = ВыполнитьЗапросИсточникаДанных("SELECT Count(*) FROM " + ИмяОсновнойТаблицы);
				ОписаниеТаблицы.Представление = ОписаниеТаблицы.Значение;
				ОписаниеТаблицы.Значение = ТаблицаИзРезультатаЗапроса(РезультатПакета)[0][0];
				МаксРазмерРезультата = МаксРазмерРезультата * Макс(1, ОписаниеТаблицы.Значение);
			КонецЦикла;
			Если МаксРазмерРезультата > 1000000 Тогда
				Ответ = Вопрос("В запросе обнаружено соединение больших таблиц, которое без отбора может выполняться очень долго. Продолжить?", РежимДиалогаВопрос.ОКОтмена);
				Если Ответ = КодВозвратаДиалога.Отмена Тогда
					Возврат;
				КонецЕсли;
			КонецЕсли;
			ТекстЗапросаБезОтбора = КонструкторЗапроса.СобратьПолныйТекст(, Истина);
			ПолучитьЗапросСНастройкамиИНайтиВременныеТаблицы(ТекстЗапросаБезОтбора);
			мРезультатПакета = ВыполнитьЗапросИсточникаДанных(ТекстЗапросаБезОтбора);
			Если мРезультатПакета = Неопределено Тогда
				Возврат;
			КонецЕсли;
			мРезультатЗапроса = мРезультатПакета[ПолучитьИндексПоследнегоРезультатЗапросаИзРезультатаПакета()];
			ЗаполнитьОписаниеРезультата(ТекстЗапросаБезОтбора,,, Ложь);
			ЗагрузитьРезультатЗапроса(, Истина, Истина,, Истина);
			Если РазмерРезультатаЗапроса(мРезультатЗапроса) = 0 Тогда
				СписокПустыхТаблиц = Новый СписокЗначений;
				Для Каждого ОписаниеТаблицы Из ТаблицыВнутреннихСоединений Цикл
					Если Ложь
						Или Не ЗначениеЗаполнено(ОписаниеТаблицы.Представление)
						Или Найти(ОписаниеТаблицы.Представление, ".") > 0 
					Тогда
						Продолжить;
					КонецЕсли;
					Если Истина
						И ирОбщий.НайтиЭлементКоллекцииЛкс(ТаблицыЗапроса, "Представление", ОписаниеТаблицы.Значение).Значение = 0 
						И СписокПустыхТаблиц.НайтиПоЗначению(ОписаниеТаблицы.Значение) = Неопределено
					Тогда 
						ЗаполнитьЗначенияСвойств(СписокПустыхТаблиц.Добавить(), ОписаниеТаблицы);
					КонецЕсли;
				КонецЦикла;
				Если СписокПустыхТаблиц.Количество() > 0 Тогда
					ВыбранныйЭлемент = СписокПустыхТаблиц.ВыбратьЭлемент("Выберите пустую временную таблицу для анализа");
					Если ВыбранныйЭлемент <> Неопределено Тогда
						ПерейтиКОпределениюПоИмени(ВыбранныйЭлемент.Представление);
						ВыполнитьЗапрос(,,,,,, Истина);
						КоманднаяПанельКоллекцияРасшифроватьСтроку();
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		Возврат;
	ИначеЕсли Ответ = КодВозвратаДиалога.Отмена Тогда
		Возврат;
	ИначеЕсли ЭлементыФормы.РезультатКоллекция.ТекущаяСтрока = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	ТекущаяСтрокаРезультата = ЭлементыФормы.РезультатКоллекция.ТекущаяСтрока;
	КонструкторЗапроса = КомпонентаТекстаЗапроса.ПолучитьФорму("КонструкторЗапроса");
	КонструкторЗапроса.ВосстановитьНастройкиФормы();
	Если Не КонструкторЗапроса.ЗагрузитьТекстВКонструктор(ТекстЗапроса, КонструкторЗапроса) Тогда
		Возврат;
	КонецЕсли; 
	Пока КонструкторЗапроса.ЗапросыПакета.Количество() > 1 Цикл
		КонструкторЗапроса.ЗапросыПакета.Удалить(0);
	КонецЦикла; 
	КонструкторЗапроса.ЗагрузитьПоследнийЗапрос();
	Если КонструкторЗапроса.ЧастиОбъединения.Количество() > 1 Тогда
		ирОбщий.СообщитьЛкс("Расшифровка строки результата поддерживает только запросы без объединения");
		Возврат;
	КонецЕсли;
	СохранитьДанныеТекущейСтрокиДереваЗапросов();
	ПолноеИмяФормы = ЭтотОбъект.Метаданные().ПолноеИмя() + ".Форма";
	НоваяФорма = ирКлиент.ПолучитьФормуЛкс(ПолноеИмяФормы,,, "Расшифровки");
	#Если Сервер И Не Сервер Тогда
		НоваяФорма = ЭтаФорма;
	#КонецЕсли
	НоваяФорма.мРежимОтладки = Истина;
	НоваяФорма.мОбъектЗапроса.МенеджерВременныхТаблиц = мОбъектЗапроса.МенеджерВременныхТаблиц;   
	//Если Не НоваяФорма.Открыта() Тогда
	//	НоваяФорма.СоздатьФайл(Истина);
	//	//НоваяФорма.ДеревоЗапросов.Строки.Удалить(0); // Если тут вызвать то будет ошибка
	//КонецЕсли; 
	НоваяФорма.Открыть();
	СтрокаЗапросаНовойФормы = НоваяФорма.ДеревоЗапросов.Строки.Добавить();
	ирОбщий.СкопироватьСтрокиДереваЛкс(мТекущаяСтрокаДереваЗапросов, СтрокаЗапросаНовойФормы,, Ложь);
	Если мТекущаяСтрокаДереваЗапроса <> Неопределено Тогда
		ТекстПодзапроса = ПолучитьТекстЗапроса(Истина);
		ИмяПодзапроса = ЭлементыФормы.ДеревоЗапроса.ТекущаяСтрока.Имя;
		СтрокаЗапросаНовойФормы.ТекстЗапроса = ТекстПодзапроса;
		СтрокаЗапросаНовойФормы.Запрос = ИмяПодзапроса;
	КонецЕсли; 
	СтрокаЗапросаНовойФормы.Запрос = СтрокаЗапросаНовойФормы.Запрос + " Расшифровка";
	СтрокаЗапросаНовойФормы.Запрос = ирОбщий.АвтоУникальноеИмяВКоллекцииЛкс(НоваяФорма.ДеревоЗапросов.Строки, СтрокаЗапросаНовойФормы, "Запрос", Ложь);
	НоваяФорма.ЭлементыФормы.ДеревоЗапросов.ТекущаяСтрока = СтрокаЗапросаНовойФормы;
	КонструкторЗапроса.ТипЗапроса = 0;
	КонструкторЗапроса.ОпцияОбщиеИтоги = Ложь;
	КонструкторЗапроса.ПоляИндекса.Очистить();
	КонструкторЗапроса.ГруппирующиеПоляИтогов.Очистить();
	КонструкторЗапроса.ГруппируемыеПоляИтогов.Очистить();
	ЕстьГруппировка = Ложь;
	ИндексКолонкиКоличество = Неопределено;
	ВыбранныеПоляПослеГруппировки = КонструкторЗапроса.ВыбратьВсеПоляИспользованныеВВыражениях(Ложь, ЕстьГруппировка, ИндексКолонкиКоличество);
	Если ЕстьГруппировка Тогда
		КонструкторЗапроса.ДобавитьЗапрос(Истина, 0, "ДоГруппировки");
		КонструкторЗапроса.УдалитьДобавленныеВыбранныеПоляИПорядок(ВыбранныеПоляПослеГруппировки);
		ВыбранныеПоляДоГруппировки = КонструкторЗапроса.ВыбратьВсеПоляИспользованныеВВыражениях(Истина);
		НачальныйИндексДобавленныхОтборовДоГруппировки = КонструкторЗапроса.ДобавитьОтборыПоСтрокеРезультата(ТекущаяСтрокаРезультата, Истина,, ВыбранныеПоляПослеГруппировки);
		КонструкторЗапроса.ЗагрузитьПоследнийЗапрос();
	КонецЕсли; 
	НачальныйИндексДобавленныхОтборовПослеГруппировки = КонструкторЗапроса.ДобавитьОтборыПоСтрокеРезультата(ТекущаяСтрокаРезультата,,, ВыбранныеПоляПослеГруппировки);
	
	// Опасно, т.к. метод написан для компоненты, а не формы конструктора. Свою компоненту передавать нельзя, чтобы не засорять ее лишними параметрами.
	НоваяФорма.ЗагрузитьПараметрыИзКонструктораЗапроса(КонструкторЗапроса);
	
	НовыйТекстЗапроса = КонструкторЗапроса.СобратьПолныйТекст(, Ложь);
	НоваяФорма.ПолеТекстаЗапроса.УстановитьТекст(НовыйТекстЗапроса);
	НоваяФорма.СпособВыгрузки = 1;
	НоваяФорма.ЗагружатьЭлементов = 0; // Так отключаем асинхронность 
	Если Не НоваяФорма.ВыполнитьЗапрос() Тогда 
		Возврат;
	КонецЕсли; 
	Если НоваяФорма.РезультатКоллекция.Количество() = 0 Тогда
		Если Не ЕстьГруппировка Тогда 
			КонструкторЗапроса.ПереключитьЭлементыОтбораВЗапросе(, Ложь);
			КонструкторЗапроса.ПереключитьЭлементыОтбораВЗапросе(НачальныйИндексДобавленныхОтборовПослеГруппировки, Истина);
			НовыйТекстЗапроса = КонструкторЗапроса.СобратьПолныйТекст(, Ложь);
			НоваяФорма.ПолеТекстаЗапроса.УстановитьТекст(НовыйТекстЗапроса);
			КонструкторЗапроса.ЭлементыФормы.КомментарийОтбора.ДобавитьСтроку("Выведенные строки не удовлетворяют отбору");
			НоваяФорма.ВыполнитьЗапрос();
		Иначе
			// TODO Здесь надо отключить отборы с агрегатами
		КонецЕсли;
	КонецЕсли; 
	Если ЕстьГруппировка Тогда
		КонструкторЗапроса.ЗагрузитьЗапросПоИндексу(0);
		КонструкторЗапроса.СброситьПризнакЕстьАгрегатыУВыбранныхПолей();
		Если НоваяФорма.РезультатКоллекция.Количество() > 0 Тогда 
			Если ИндексКолонкиКоличество <> Неопределено Тогда
				ЧислоСтрок = НоваяФорма.РезультатКоллекция[0][ИндексКолонкиКоличество];
			Иначе
				// TODO похоже некорректная ситуация
				ЧислоСтрок = 0;
			КонецЕсли;
			Если ЧислоСтрок <= ЗагружатьЭлементов Тогда 
				НовыйТекстЗапроса = КонструкторЗапроса.СобратьПолныйТекст(, Ложь);
				РезультатДоГруппировки = НоваяФорма.ВыполнитьЗапросИсточникаДанных(НовыйТекстЗапроса)[0];
			Иначе
				ТекстЗапросаОшибки = "SELECT " + ПолеТекстаЗапроса.мПараметрыДиалектаSQL.Кавычка + "Слишком много строк - " + XMLСтрока(ЧислоСтрок) + ПолеТекстаЗапроса.мПараметрыДиалектаSQL.Кавычка;
				РезультатДоГруппировки = НоваяФорма.ВыполнитьЗапросИсточникаДанных(ТекстЗапросаОшибки)[0];
			КонецЕсли; 
		Иначе
			//РезультатДоГруппировки = НоваяФорма.ВыполнитьЗапросИсточникаДанных("ВЫБРАТЬ 1 ГДЕ ЛОЖЬ")[0];
			Если Не КонструкторЗапроса.ОпцияПервые Тогда
				КонструкторЗапроса.ОпцияПервые = 1;
				КонструкторЗапроса.ПервыеКоличество = 100000;
			КонецЕсли; 
			КонструкторЗапроса.ПереключитьЭлементыОтбораВЗапросе(НачальныйИндексДобавленныхОтборовДоГруппировки, Ложь, Ложь);
			Сообщение = "Выведенные строки не удовлетворяют отбору. Используй команду ""Отладить строку"" на них.";
			ирОбщий.СообщитьЛкс(Сообщение,,, Истина);
			КонструкторЗапроса.ЭлементыФормы.КомментарийОтбора.ДобавитьСтроку(Сообщение);
			НовыйТекстЗапроса = КонструкторЗапроса.СобратьПолныйТекст(, Ложь);
			РезультатДоГруппировки = НоваяФорма.ВыполнитьЗапросИсточникаДанных(НовыйТекстЗапроса)[0];
		КонецЕсли; 
		НоваяФорма.мРезультатПакета.Вставить(0, РезультатДоГруппировки);
		КонструкторЗапроса.ЗагрузитьПоследнийЗапрос();
	КонецЕсли; 
	КонструкторЗапроса.УдалитьДобавленныеВыбранныеПоляИПорядок(ВыбранныеПоляПослеГруппировки);
	КонструкторЗапроса.ПереключитьЭлементыОтбораВЗапросе(, Истина);
	КонструкторЗапроса.ПереключитьЭлементыОтбораВЗапросе(НачальныйИндексДобавленныхОтборовПослеГруппировки, Ложь);
	Если ЕстьГруппировка Тогда
		КонструкторЗапроса.ЗагрузитьЗапросПоИндексу(0);
		//КонструкторЗапроса.УдалитьВыбранныеПоляИПорядок(ВыбранныеПоляДоГруппировки);
		КонструкторЗапроса.ПереключитьЭлементыОтбораВЗапросе(, Истина);
		//КонструкторЗапроса.ПереключитьЭлементыОтбораВЗапросе(НачальныйИндексДобавленныхОтборовДоГруппировки, Ложь);
	КонецЕсли; 
	Если НоваяФорма.РезультатКоллекция.Количество() > 0 Тогда
		Для Каждого СтрокаДопПоля Из ВыбранныеПоляПослеГруппировки Цикл
			ЗначениеПоля = НоваяФорма.РезультатКоллекция[0][СтрокаДопПоля.Имя];
			СтрокаДопПоля.РасшифровкаЗначение = ЗначениеПоля;
		КонецЦикла;
	КонецЕсли;
	ПрефиксПараметра = ПолеТекстаЗапроса.ПрефиксПараметра();
	Для Каждого СтрокаПараметра Из НоваяФорма.Параметры Цикл
		РасшифровкаЗначения = КонструкторЗапроса.РасшифровкаЗначенияДляТекстаЗапроса(СтрокаПараметра.Значение, НоваяФорма);
		ОпределениеПараметра = ПрефиксПараметра + СтрокаПараметра.ИмяПараметра;
		Если ирОбщий.СтрокиРавныЛкс(РасшифровкаЗначения, ОпределениеПараметра) Тогда
			Продолжить;
		КонецЕсли; 
		СтрокаДопПоля = ВыбранныеПоляПослеГруппировки.Добавить();
		СтрокаДопПоля.Определение = ОпределениеПараметра;
		СтрокаДопПоля.Расшифровка = РасшифровкаЗначения;
		СтрокаДопПоля.РасшифровкаЗначение = СтрокаПараметра.Значение;
	КонецЦикла; 
	Для Каждого СтрокаДопПоля Из ВыбранныеПоляПослеГруппировки Цикл  
		Если Не ЗначениеЗаполнено(СтрокаДопПоля.Расшифровка) Тогда
			СтрокаДопПоля.Расшифровка = КонструкторЗапроса.РасшифровкаЗначенияДляТекстаЗапроса(СтрокаДопПоля.РасшифровкаЗначение, НоваяФорма);
		КонецЕсли;
		СтрокаДопПоля.ДлинаТекста = СтрДлина(СтрокаДопПоля.Определение);
	КонецЦикла;
	ВыбранныеПоляПослеГруппировки.Сортировать("ДлинаТекста Убыв");
	СтруктураПолей = КонструкторЗапроса.НоваяСтруктураОбработкиПолей("ДопискаЗначения");
	СтруктураПолей.Поля = ВыбранныеПоляПослеГруппировки;
	НовыйТекстЗапроса = КонструкторЗапроса.СобратьПолныйТекст(, Истина, СтруктураПолей);
	Если НоваяФорма.РезультатКоллекция.Количество() > 0 Тогда
		Для Каждого СтрокаДопПоля Из ВыбранныеПоляПослеГруппировки.НайтиСтроки(Новый Структура("ЕстьАгрегаты", Истина)) Цикл
			ЧтоЗаменять = СтрокаДопПоля.Определение;
			ТекстовыйДокумент = Новый ТекстовыйДокумент;
			ТекстовыйДокумент.УстановитьТекст(ЧтоЗаменять);
			КоличествоСтрок = ТекстовыйДокумент.КоличествоСтрок();
			Смещение = Символы.Таб;
			Для СчетчикСмещения = 1 По 10 Цикл
				НовыйТекстЗапроса = ирОбщий.СтрЗаменитьЛкс(НовыйТекстЗапроса, ЧтоЗаменять, СтрокаДопПоля.Определение + "{" + СтрокаДопПоля.Расшифровка + "}", Ложь, Ложь);
				Если КоличествоСтрок = 1 Тогда
					Прервать;
				КонецЕсли; 
				ЧтоЗаменять = "";
				Для СчетчикСтроки = 1 По КоличествоСтрок Цикл
					Если СчетчикСтроки > 1 Тогда
						ЧтоЗаменять = ЧтоЗаменять + Смещение;
					КонецЕсли; 
					ЧтоЗаменять = ЧтоЗаменять + ТекстовыйДокумент.ПолучитьСтроку(СчетчикСтроки);
					Если СчетчикСтроки < КоличествоСтрок Тогда
						ЧтоЗаменять = ЧтоЗаменять + Символы.ПС;
					КонецЕсли; 
				КонецЦикла;
				ТекстовыйДокумент.УстановитьТекст(ЧтоЗаменять);
			КонецЦикла;
		КонецЦикла;
	КонецЕсли; 
	Если НоваяФорма.мСтруктурноеРедактирование Тогда
		НоваяФорма.КоманднаяПанельФормыРежимДереваЗапроса();
	КонецЕсли; 
	НоваяФорма.ПолеТекстаЗапроса.УстановитьТекст(НовыйТекстЗапроса);
	НоваяФорма.КоманднаяПанельФормыРежимДереваЗапроса();
	Если ЕстьГруппировка Тогда
		НоваяФорма.ИзменитьСвернутостьРезультатПакета(ЕстьГруппировка);
		НоваяФорма.ЭлементыФормы.ДеревоЗапроса.ТекущаяСтрока = НоваяФорма.ДеревоЗапроса.Строки[0].Строки[1];
	КонецЕсли; 
	НоваяФорма.ЗагрузитьРезультатПакета();
	НоваяФорма.НайтиПоказатьВыбранноеПоле(ЭлементыФормы.РезультатКоллекция.ТекущаяКолонка.Данные);
	
КонецПроцедуры

Функция ИмяПараметраИзЗначения(Знач ЗначениеПоля)
	
	Перем ИмяПараметра;
	
	Если Не ЗначениеЗаполнено(ЗначениеПоля) Тогда
		ИмяПараметра = "_ПустаяСсылка";
	Иначе
		ИмяПараметра = "" + ЗначениеПоля;
	КонецЕсли;
	Возврат ИмяПараметра;

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

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

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

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

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

Процедура ЗагрузитьЗначениеПараметраИзФайла(Знач СтрокаПараметра, Знач Принудительно = Ложь)
	
	Если Истина
		И ТипЗнч(СтрокаПараметра.Значение) = Тип("ТаблицаЗначений") 
		И ЗначениеЗаполнено(СтрокаПараметра.ИмяФайла) 
		И (Ложь
			Или Принудительно
			//! СтрокаПараметра.Значение = 0 // ТаблицаЗначений
			Или СтрокаПараметра.Значение.Количество() = 0)
	Тогда
		Попытка
			ТаблицаИзФайла = ирОбщий.ЗагрузитьЗначениеИзФайлаЛкс(СтрокаПараметра.ИмяФайла, Истина);
		Исключение
			ирОбщий.СообщитьЛкс(ирОбщий.СтрШаблонЛкс("Ошибка загрузки параметра %1 из файла: ", СтрокаПараметра.ИмяПараметра) + ОписаниеОшибки());
			Возврат;
		КонецПопытки;
		СтрокаПараметра.Значение = ТаблицаИзФайла;
	КонецЕсли;

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

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

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

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

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

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

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

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

Процедура АвтозаполнениеДоступныхПолейПриИзменении(Элемент)
	
	УстановитьТипЗапроса();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

///////////////////////////
//  HTML редактор кода 

Функция РедакторВстроенный()
	
	Возврат ЭлементыФормы.ТекстЗапроса;

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

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

Функция РедакторHTML()
	Возврат ПолеТекстаЗапроса.ПолеТекста.РедакторHTML();
КонецФункции

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

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

// Мультиметка343281883
Функция ВводДоступенЛкс() Экспорт 
	Если ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.РедакторHTML Тогда
		РедакторHTML = РедакторHTML();
		Результат = Ложь
			Или РедакторHTML <> Неопределено И РедакторHTML.hasTextFocus()
			Или ВводДоступен();
	Иначе
		Результат = ВводДоступен();
	КонецЕсли; 
	Возврат Результат;
КонецФункции

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

Процедура РедакторHTMLonclick(Элемент, ДанныеСобытия)
	РедакторHTMLonclickДинамический(ДанныеСобытия);
КонецПроцедуры

// Для подключения через ДобавитьОбработчик внутри РедакторHTML_Инициировать
Процедура РедакторHTMLonclickДинамический(ДанныеСобытия) Экспорт
	#Если Сервер И Не Сервер Тогда
		ПолеТекстаЗапроса = Обработки.ирКлсПолеТекстаПрограммы.Создать();
	#КонецЕсли
	Событие = ДанныеСобытия.eventData1C;
	Если Событие <> Неопределено Тогда
		Если Событие.event = "EVENT_CONTENT_CHANGED" Тогда
			ЭтаФорма.Модифицированность = Истина;
			Если Истина
				И мСтруктурноеРедактирование
				И мРедактируемыйУзел = Неопределено
			Тогда
				КоманднаяПанельТекстЗапросаИзменитьИлиСохранитьУзелДерева(, Истина);
			КонецЕсли; 
		ИначеЕсли Событие.event = "EVENT_KEY_BINDING_2082" Тогда // CTRL+D
			СочетаниеКлавиш = Новый СочетаниеКлавиш(Клавиша.D,, Истина);
			Кнопка = ЭлементыФормы.КоманднаяПанельФормы.Кнопки.СверткаРезультаты;
			ВыполнитьКомандуКнопки(Кнопка, СочетаниеКлавиш);
		ИначеЕсли Событие.event = "EVENT_KEY_BINDING_2118" Тогда // CTRL+F12
			СочетаниеКлавиш = Новый СочетаниеКлавиш(Клавиша.F12,, Истина);
			Кнопка = ЭлементыФормы.МенюДереваЗапроса.Кнопки.ВернутьсяИзПерехода;
			ВыполнитьКомандуКнопки(Кнопка, СочетаниеКлавиш);
		ИначеЕсли Событие.event = "EVENT_ON_LINK_CLICK" Тогда
			#Если Сервер И Не Сервер Тогда
				ПерейтиКОпределениюВФорме();
				ВычислитьВыражениеЗапроса();
			#КонецЕсли
			ПолеТекстаЗапроса.РедакторHTML_ОбработатьКликНаГиперссылке(Событие, "ПерейтиКОпределениюВФорме", "ВычислитьВыражениеЗапроса");
		ИначеЕсли Событие.event = "EVENT_BEFORE_HOVER" Тогда
			#Если Сервер И Не Сервер Тогда
				ВычислитьВыражениеЗапроса();
			#КонецЕсли
			ПолеТекстаЗапроса.РедакторHTML_ПередПоказомПодсказкиУдержания(Событие, "ВычислитьВыражениеЗапроса");
		Иначе
			ПолеТекстаЗапроса.РедакторHTML_ОбработатьСобытие(Событие);
		КонецЕсли; 
	Иначе
		#Если Сервер И Не Сервер Тогда
			ОбновитьВедомуюСтруктуруЗапроса();
		#КонецЕсли
		ПодключитьОбработчикОжидания("ОбновитьВедомуюСтруктуруЗапроса", 0.2, Истина);   
	КонецЕсли;
	
КонецПроцедуры

/////////////////////////

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

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

Процедура КоманднаяПанельФормыОбучающееВидео(Кнопка)
	
	ЗапуститьПриложение("https://www.youtube.com/watch?v=-NJJP79TccI&t=200s");
	
КонецПроцедуры

Процедура КоманднаяПанельЗапросаРезультатаПараметрыСУБД(Кнопка)
	
	ирКлиент.ОткрытьФормуСоединенияСУБДЛкс();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Функция НайтиПланЗапросаВТрассе()
	
	#Если Сервер И Не Сервер Тогда
		мАнализТехножурнала = Обработки.ирАнализТехножурнала.Создать();
	#КонецЕсли
	мАнализТехножурнала.ТаблицаЖурнала.Сортировать("МоментВремени УБЫВ");
	ВыбраннаяСтрока = Неопределено; 
	ПропуститьЗапросов = 0;
	Если Найти(мОписаниеРезультата.ТекстЗапроса, КомментарийСлужебнойВыборки()) > 0 Тогда 
		ПропуститьЗапросов = 1;
	КонецЕсли;
	Для Каждого НайденныйЗапрос Из мАнализТехножурнала.ТаблицаЖурнала Цикл
		Если Истина
			И ирОбщий.СтрНайтиЛкс(НайденныйЗапрос.ТекстСУБД, "SELECT 1 WHERE OBJECT_ID(",,,, Ложь) = 0
			И ирОбщий.СтрНайтиЛкс(НайденныйЗапрос.ТекстСУБД, "CREATE TABLE ",,,, Ложь) = 0
			И ирОбщий.СтрНайтиЛкс(НайденныйЗапрос.ТекстСУБД, "TRUNCATE TABLE ",,,, Ложь) = 0
			И ирОбщий.СтрНайтиЛкс(НайденныйЗапрос.ТекстСУБД, "DROP TABLE ",,,, Ложь) = 0
			И ирОбщий.СтрНайтиЛкс(НайденныйЗапрос.ТекстСУБД, "CREATE CLUSTERED INDEX ",,,, Ложь) = 0
			И ирОбщий.СтрНайтиЛкс(НайденныйЗапрос.ТекстСУБД, "FROM dbo._ExtDataSrcPrms",,,, Ложь) = 0
			И ЗначениеЗаполнено(НайденныйЗапрос.ПланСУБД)
			И (Ложь
				Или НайденныйЗапрос.ЧислоИзменныхСтрок = РазмерРезультата
				Или НайденныйЗапрос.ЧислоСтрок = РазмерРезультата)
		Тогда
			Если ПропуститьЗапросов > 0 Тогда
				ПропуститьЗапросов = ПропуститьЗапросов - 1;
			Иначе
				ВыбраннаяСтрока = НайденныйЗапрос;
				Прервать;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	Возврат ВыбраннаяСтрока;

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

Процедура ПочемуНетНужнойСтрокиНажатие(Элемент)
	КоманднаяПанельКоллекцияРасшифроватьСтроку();
КонецПроцедуры

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

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

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

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

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

ирКлиент.ИнициироватьФормуЛкс(ЭтаФорма, "Обработка.ирКонсольЗапросов.Форма.Форма");
мИмяОткрытогоФайла = "";
ТекущийКлассWMI = "Win32_Process";
мПрефиксИмениКнопкиЗависимогоЗапроса = "_";
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
	мПлатформа = Обработки.ирПлатформа.Создать();
	ПолеТекстаЗапроса = Обработки.ирКлсПолеТекстаПрограммы.Создать();
#КонецЕсли
ЭтаФорма.ЗагружатьЭлементов = 100000;
МассивПолей = Новый Массив();
МассивПолей.Добавить(ЭлементыФормы.ЗагружатьЭлементов);
Для Каждого ПолеВвода Из МассивПолей Цикл
	ПолеВвода.СписокВыбора.Добавить(100);
	ПолеВвода.СписокВыбора.Добавить(1000);
	ПолеВвода.СписокВыбора.Добавить(10000);
	ПолеВвода.СписокВыбора.Добавить(100000);
	ПолеВвода.СписокВыбора.Добавить(500000);
	ПолеВвода.СписокВыбора.Добавить(1000000);
КонецЦикла;
мШиринаПустойКолонки = 5;
СлучайныйИД = "3809";
мИмяКолонкиВыборка = "Выборка" + СлучайныйИД;
мИмяКолонкиУровень = "Уровень" + СлучайныйИД;
мИмяКолонкиТипЗаписи = "ТипЗаписи" + СлучайныйИД;
мИмяКолонкиИмяГруппировки = "ИмяГруппировки" + СлучайныйИД;
мИмяКолонкиЗначениеГруппировки = "Группировка" + СлучайныйИД;
мИмяКолонкиКоличествоПотомков = "КоличествоПотомков" + СлучайныйИД;

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

// Антибаг платформы 8.2.15 http://partners.v8.1c.ru/forum/thread.jsp?id=1009788#1009788
ОписаниеТипов = ирОбщий.ОписаниеТиповВсеРедактируемыеТипыЛкс();
ДополнительныеТипы = Новый Массив();
// Типы взяты из типа ОписаниеИсточникаДанных 
ДополнительныеТипы.Добавить(Тип("РезультатЗапроса"));
ДополнительныеТипы.Добавить(Тип("Структура"));
ДополнительныеТипы.Добавить(Тип("Соответствие"));
ДополнительныеТипы.Добавить(Тип("ОбластьЯчеекТабличногоДокумента"));
ДополнительныеТипы.Добавить(Тип("ВидТочкиМаршрутаБизнесПроцесса")); // В ирОбщий.ПолучитьОписаниеТиповВсеРедактируемыеТипыЛкс нельзя добавить, т.к. для этого типа не поддерживается сериализация
ДополнительныеТипы.Добавить(Тип("ВидПериодаРегистраРасчета")); // В ирОбщий.ПолучитьОписаниеТиповВсеРедактируемыеТипыЛкс нельзя добавить, т.к. для этого типа не поддерживается сериализация
ОписаниеТипов = Новый ОписаниеТипов(ОписаниеТипов, ДополнительныеТипы);
Параметры.Колонки.Добавить("Значение", ОписаниеТипов);
//Параметры.Колонки.Добавить("Значение"); // Так можно хранить все типы, но не будет работать интерактивный поиск платформы https://github.com/tormozit/RDT1C/issues/43
Параметры.Колонки.Добавить("НИмяПараметра", Параметры.Колонки.ИмяПараметра.ТипЗначения);

ВременныеТаблицы.Колонки.Добавить("НИмя", Новый ОписаниеТипов("Строка"));
мТаблицаКоординат = Новый ТаблицаЗначений;
мТаблицаКоординат.Колонки.Добавить("Правило");
мТаблицаКоординат.Колонки.Добавить("НачальнаяСтрока");
мТаблицаКоординат.Колонки.Добавить("НачальнаяКолонка");
мТаблицаКоординат.Колонки.Добавить("КонечнаяСтрока");
мТаблицаКоординат.Колонки.Добавить("КонечнаяКолонка");
ДеревоЗапроса.Колонки.Добавить("СтрокаДанных");
ДеревоЗапроса.Колонки.Добавить("ТекущееВыделение");
ДеревоЗапроса.Колонки.Добавить("ИмяСРодителем");
ДеревоЗапроса.Колонки.Добавить("НИмяОсновнойТаблицы");
ДеревоЗапроса.Колонки.Добавить("АдресРезультата");
ДеревоЗапроса.Колонки.Добавить("РучноеИмя", Новый ОписаниеТипов("Булево"));
ДеревоЗапроса.Колонки.Добавить("ЭтоОбъединение", Новый ОписаниеТипов("Булево"));
ДеревоЗапроса.Колонки.Добавить("СложныйАнализВыполнен", Новый ОписаниеТипов("Булево"));
//! ДеревоЗапросов.Колонки.Добавить("ПараметрыЗапроса"); // см. Параметры
//! ДеревоЗапросов.Колонки.Добавить("ПараметрыWMI"); // см. ПараметрыWMI() 
//! ДеревоЗапросов.Колонки.Добавить("ПараметрыADO"); // см. ПараметрыADO()
//! ДеревоЗапросов.Колонки.Добавить("ВыборкиИтогов"); // см. ВыборкиИтогов
//! ДеревоЗапросов.Колонки.Добавить("СтрокаДанных"); // см. мТаблицаКоординат[0]
СвойстваСтрокиРезультата.Колонки.Добавить("Значение"); 

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

//ЭлементОтбораДействие = ЭлементыФормы.СобытияСУБД.ОтборСтрок.Действие;
//ЭлементОтбораДействие.Использование = Истина;
//ЭлементОтбораДействие.ВидСравнения = ВидСравнения.НеРавно;
//ЭлементОтбораДействие.Значение = "getExecSQLStatistics";

РезультатКоллекция = Новый ТаблицаЗначений;
мСтруктурноеРедактирование = Ложь;
мРежимСворачивания = Ложь;
мЗапросЗагруженВКонсоль = Ложь;
мСлужебноеПолеТекстовогоДокумента = мПлатформа.СлужебноеПолеТекста;

ДоступныеПараметрыОбработкиСтрокиРезультата = "СтрокаРезультата, Параметры, ЭтоПервыйЭлемент, ЭтоПоследнийЭлемент.";
ДоступныеПараметрыОбработкиРезультата = "мРезультатЗапроса, мРезультатПакета, мРезультатПоИменам, Параметры.";
ДоступныеПараметрыОбработкиПередВыполнением = "мОбъектЗапроса, Параметры (копия).";

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

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