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

Перем мИмяОткрытогоФайла;                        // имя файла
Перем мТекущаяСтрокаДереваЗапросов;              // текущая(прошлая) строка дерева запросов.
Перем мРежимФормы;                               // Не меняется после открытия формы

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

//Перем мТаблицаЗагружена;                // признак того, что рез-т запроса загружен в табличное поле
//Перем мСводнаяТаблицаЗагружена;         // признак того, что рез-т запроса загружен в сводную таблицу
Перем мКэшПустыхЗначений;

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

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

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

КонецФункции // ОбновитьКонтекстПодсказкиИПолучитьСтруктуруПараметров()

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

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

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

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

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

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

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

	Возврат ЭкземплярКомпоненты;

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

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


///////////////////////////////////////////////////////////////////////////////
// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ОбновитьРазмерДинамическойТаблицы() Экспорт

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

КонецПроцедуры // ОбновитьРазмерДинамическойТаблицы()

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

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

КонецФункции // ПолучитьРазмерРезультатаЗапроса()

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

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

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

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

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

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

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

///////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ КОМАНДНОЙ ПАНЕЛИ

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

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

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

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

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

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

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

// Обработчик нажатия кнопки командной панели "Настройки"
//
Процедура КнопкаНастройки()
	
	ФормаНастройки = ПолучитьФорму("ФормаНастройки");
	ФормаНастройки.ОткрытьМодально();
	
	вОбработкаАвтосохранения();
	//УстановитьЗаголовокФормы();
	
КонецПроцедуры // НастройкаАвтосохранения()

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

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

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

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

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

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

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

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

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

	Возврат СтруктураПараметров;

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

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

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

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

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

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

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

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

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

///////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ

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

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

	ЭлементыФормы.МенюДереваЗапросов.Кнопки.СохранитьВЭлементСправочникаЗапросы.Доступность = ирКэш.Получить().Это2iS;
	
	ЭтотОбъект.ВыполнятьВТранзакции = ирОбщий.ВосстановитьЗначениеЛкс("ирКонсольЗапросов_ВыполнятьВТранзакции") = Истина;
	ЭлементыФормы.КоманднаяПанельФормы.Кнопки.РежимТранзакции.Пометка = ВыполнятьВТранзакции;
	ЭтаФорма.ПоказыватьИтогиТаблицы = ирОбщий.ВосстановитьЗначениеЛкс("ирКонсольЗапросов_ПоказыватьИтогиТаблицы") = Истина;
	ЭлементыФормы.КоманднаяПанельКоллекция.Кнопки.ПоказыватьИтоги.Пометка = ПоказыватьИтогиТаблицы;
	НастроитьКолонкиРезультата();
	ЭтаФорма.ВключатьДеревоЗапросаПриОтладке = ирОбщий.ВосстановитьЗначениеЛкс("ирКонсольЗапросов_ВключатьДеревоЗапросаПриОтладке");
	ЭтаФорма.ПоказыватьСвойства = ирОбщий.ВосстановитьЗначениеЛкс("ирКонсольЗапросов_ПоказыватьСвойства") = Истина;
	ЭтаФорма.ПоказыватьРезультатПакета = ирОбщий.ВосстановитьЗначениеЛкс("ирКонсольЗапросов_ПоказыватьРезультатПакета") = Истина;
	НовоеЗагружатьЭлементов = ирОбщий.ВосстановитьЗначениеЛкс("ирКонсольЗапросов_ЗагружатьЭлементов");
	Если НовоеЗагружатьЭлементов <> Неопределено Тогда
		ЭтаФорма.ЗагружатьЭлементов = НовоеЗагружатьЭлементов;
	КонецЕсли; 
	Если Не ПоказыватьСвойства Тогда
		ИзменитьСвернутостьПанельСвойства(ПоказыватьСвойства);
	КонецЕсли; 
	Если Не ПоказыватьРезультатПакета Тогда
		ИзменитьСвернутостьРезультатПакета(ПоказыватьРезультатПакета);
	КонецЕсли; 
	//ЭлементыФормы.КоманднаяПанельФормы.Кнопки.ВключитьТехножурнал.Пометка = ВключитьТехножурнал;
	
	Если Истина
		И мТекущаяСтрокаДереваЗапросов = Неопределено
		И ЭлементыФормы.ДеревоЗапросов.ТекущаяСтрока <> Неопределено 
	Тогда
		ДеревоЗапросовПриАктивизацииСтроки();
	КонецЕсли; 
	Если мРежимРедактораЗапроса Тогда
		мРежимФормы = "Редактирование";
		Если ВладелецФормы <> Неопределено Тогда
			ВладелецФормы.Панель.Доступность = Ложь;
		КонецЕсли; 
	ИначеЕсли мКоллекцияДляЗаполнения <> Неопределено Тогда
		мРежимФормы = "Заполнение коллекции";
		Если ТипЗнч(мКоллекцияДляЗаполнения) = Тип("ТаблицаЗначений") Тогда
			СпособВыгрузки = 1;
		Иначе
			СпособВыгрузки = 2;
		КонецЕсли; 
		ЭлементыФормы.СпособВыгрузки.ТолькоПросмотр = Истина;
		СоздатьКоллекциюРезультата();
		Если мКоллекцияДляЗаполнения.Колонки.Количество() > 0 Тогда
			ЭлементыФормы.РезультатКоллекция.Значение = мКоллекцияДляЗаполнения.СкопироватьКолонки();
			НастроитьКолонкиРезультата();
		КонецЕсли; 
	КонецЕсли;
	//УстановитьЗаголовокФормы();
	
	Если Ложь
		Или мРежимРедактораЗапроса
		//Или мКоллекцияДляЗаполнения <> Неопределено
	Тогда
		//Для Каждого лКнопка Из ЭлементыФормы.КоманднаяПанельФормы.Кнопки.ТипЗапроса.Кнопки Цикл
		//	лКнопка.Доступность = Ложь;
		//КонецЦикла;
		ЭлементыФормы.МенюДереваЗапроса.Кнопки.СкопироватьВНовыйЗапрос.Доступность = Ложь;
		ЭлементыФормы.ДеревоЗапросов.ТолькоПросмотр = Истина;
		
		Кнопки = ЭлементыФормы.КоманднаяПанельФормы.Кнопки;
		Кнопки.НовыйФайл.Доступность = Ложь;
		Кнопки.ОткрытьФайл.Доступность = Ложь;
		Кнопки.Сохранить.Доступность = Ложь;
		Кнопки.Настройки.Доступность = Ложь;
		//Кнопки.ПеренестиСтрокуДерева.Доступность = Ложь;
		
		Кнопки = ЭлементыФормы.КоманднаяПанельФормы.Кнопки.Файл.Кнопки;
		Кнопки.НовыйФайл.Доступность = Ложь;
		Кнопки.ОткрытьФайл.Доступность = Ложь;
		Кнопки.ОткрытьПоследние.Доступность = Ложь; // Не имеет эффекта, у подменю всегда Истина остается
		Кнопки.Удалить(Кнопки.ОткрытьПоследние);
		Кнопки.ОбъединитьФайл.Доступность = Ложь;
		Кнопки.Сохранить.Доступность = Ложь;
		Кнопки.Настройки.Доступность = Ложь;
	КонецЕсли; 
	
	Если мОбъектЗапроса.МенеджерВременныхТаблиц = Неопределено Тогда
		мОбъектЗапроса.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
	Иначе
		ОбновитьТабличноеПолеВременныхТаблиц();
	КонецЕсли;
	
	Если Не (Ложь
		Или мРежимОтладки // Было закомментировано
		//Или мРежимРедактораЗапроса
		Или ДеревоЗапросов.Строки.Количество() > 0)
	Тогда
	
		ИмяФайлаВосстановления = ирОбщий.ПроверитьВыбратьФайлВосстановленияКонсолиЛкс(мСтруктураВосстановления);
		Если ИмяФайлаВосстановления <> "" Тогда
			мИмяОткрытогоФайла = ИмяФайлаВосстановления;
		Иначе
			// Попытаемся загрузить последний открывавшийся файл
			мИмяОткрытогоФайла = ирОбщий.ВосстановитьЗначениеЛкс("ирКонсольЗапросов_ИмяФайла");
			Если мИмяОткрытогоФайла = НеОпределено Тогда
				мИмяОткрытогоФайла = "";
			КонецЕсли;
		КонецЕсли;
		Если ПустаяСтрока(мИмяОткрытогоФайла) Тогда
			СоздатьФайл();
		Иначе
			ЗагрузитьЗапросыИзФайла();
		КонецЕсли;
		Если ИмяФайлаВосстановления <> "" Тогда
			Модифицированность = Истина;
			УдалитьФайлы(ИмяФайлаВосстановления);
		КонецЕсли; 
		
		АвтосохранениеТекущегоФайла = ирОбщий.ВосстановитьЗначениеЛкс("ирКонсольЗапросов_ИспользоватьАвтосохранение");
		ИнтервалАвтосохранения = ирОбщий.ВосстановитьЗначениеЛкс("ирКонсольЗапросов_ИнтервалАвтосохранения");
		Если Ложь
			Или ИнтервалАвтосохранения < 2
			Или ИнтервалАвтосохранения = Неопределено
		Тогда
			ИнтервалАвтосохранения = 2;
		КонецЕсли;
		вОбработкаАвтосохранения();
	Иначе
		ПриИзмененииДереваЗапросов();
	КонецЕсли;
	
	мИсторияФайлов = ирОбщий.ВосстановитьЗначениеЛкс("ирКонсольЗапросов.мИсторияФайлов");
	Если мИсторияФайлов = Неопределено Тогда
		мИсторияФайлов = Новый СписокЗначений;
	КонецЕсли;
	ОбновитьПодменюИсторииФайлов();
	ОбновитьДоступностьКнопкиОтключиться();
	Если мРежимРедактораЗапроса Тогда
		ПолеТекстовогоДокументаСКонтекстнойПодсказкой.ТекстЗапроса.РежимКомпоновкиДанных = (мТекущаяСтрокаДереваЗапросов.ТипЗапроса = "Компоновка");
	КонецЕсли;
	Если мРежимОтладки Тогда
		ЭлементыФормы.КоманднаяПанельФормы.Кнопки.УдалитьВременныеТаблицы.Доступность = Ложь;
		
		Если Истина
			И ВключатьДеревоЗапросаПриОтладке
			И СтрДлина(ЭлементыФормы.ТекстЗапроса.ПолучитьТекст()) < 20000 
		Тогда
			КоманднаяПанельФормыРежимДереваЗапроса();
		КонецЕсли; 
		// Баг платформы https://partners.v8.1c.ru/forum/t/1356801/m/1356801
		//ПодключитьОбработчикОжидания("ВключитьРежимДереваЗапросаОтложенно", 0.1, Истина);
		
		//Если Истина
		//	И ирОбщий.СтрокиРавныЛкс(мТекущаяСтрокаДереваЗапросов.ТипЗапроса, "ADO")
		//	И ЗначениеЗаполнено(мТекущаяСтрокаДереваЗапросов.ПлатформаADO)
		//Тогда
		//	ПлатформаADOПриИзменении();
		//КонецЕсли;
		//Если мТекущаяСтрокаДереваЗапросов <> Неопределено Тогда
		Если мЗапросЗагруженВКонсоль Тогда
			ЭтаФорма.Параметры = мТекущаяСтрокаДереваЗапросов.ПараметрыЗапроса; // Это нужно для предотвращения наложения ограничения типов на значения параметров
		КонецЕсли; 
	Иначе
		ИзменитьСвернутостьПанельДеревоЗапроса(Ложь);
	КонецЕсли;
	мАнализТехножурнала = ирОбщий.ПолучитьОбъектПоПолномуИмениМетаданныхЛкс("Обработка.ирАнализТехножурнала");
	
КонецПроцедуры // ПриОткрытии()

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

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

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

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

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

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

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

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

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

КонецФункции // ВыполнитьОбработкуСтрокРезультата()

Процедура КнопкаВыполнитьОбработкуТаблицыРезультата(Элемент)
	
	Если мРезультатЗапроса = Неопределено Тогда
		Предупреждение("Сначала нужно выполнить запрос", 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.СтрочныйКомментарий);
	КонецЕсли; 
	Возврат Результат;
	
КонецФункции

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

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

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

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

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

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


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

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

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

КонецФункции // ВыполнитьЛокальноКодОбработкиРезультата()

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

	ЭлементыФормы.Параметры.Колонки.Выражение.Видимость = Параметры.Найти(Истина, "ЭтоВыражение") <> Неопределено ИЛИ Параметры.Найти("СКД", "ЭтоВыражение") <> Неопределено;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

КонецФункции // ПроверитьКорректностьТекстаЗапроса()

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

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

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

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

КонецПроцедуры // ОбновитьКомпоновщик()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


////////////////////////////////////////////////////////////////////////////////
// ПАРСЕР

Функция ЛиПарсерЗапросаДоступен()

	Парсер = ирКэш.Получить().мПолучитьПарсер("ГрамматикаЯзыкаЗапросов");
	Возврат Парсер <> Неопределено;

КонецФункции // ЛиПарсерЗапросаДоступен()

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

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

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

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

Процедура _СкорректироватьКонецПоследнегоБлокаКоординат()
	
	КоличествоБлоковКоординат = мТаблицаКоординат.Количество();
	Если мТаблицаКоординат[КоличествоБлоковКоординат - 2].КонечнаяСтрока <= мТаблицаКоординат[КоличествоБлоковКоординат - 1].НачальнаяСтрока Тогда
		мТаблицаКоординат[КоличествоБлоковКоординат - 2].КонечнаяСтрока = мТаблицаКоординат[КоличествоБлоковКоординат - 1].НачальнаяСтрока;
		мТаблицаКоординат[КоличествоБлоковКоординат - 2].КонечнаяКолонка = мТаблицаКоординат[КоличествоБлоковКоординат - 1].НачальнаяКолонка;
	КонецЕсли;

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

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

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

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

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

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

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

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

КонецПроцедуры // ОбработатьДеревоЗапроса()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

КонецФункции // УстановитьТипЗапроса()

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

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

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

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

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

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

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

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

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

КонецФункции // ПолучитьРезультирующийЗапрос()

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

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

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

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

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

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

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

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

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

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

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

Процедура ПриПолученииДанныхДоступныхПолей(Элемент, ОформленияСтрок)

	ирОбщий.ПриПолученииДанныхДоступныхПолейКомпоновкиЛкс(ОформленияСтрок);

КонецПроцедуры // ПриПолученииДанныхДоступныхПолей()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

Функция РедактироватьСтандартныйПериод(СтандартныйПериод)
	
	#Если Сервер И Не Сервер Тогда
	    СтандартныйПериод = Новый СтандартныйПериод;
	#КонецЕсли
	КонецПериода = СтандартныйПериод.ДатаОкончания;
	НачалоПериода = СтандартныйПериод.ДатаНачала;
	НастройкаПериода = Новый НастройкаПериода;
	НастройкаПериода.УстановитьПериод(НачалоПериода, ?(КонецПериода='0001-01-01', КонецПериода, КонецДня(КонецПериода)));
	НастройкаПериода.ЗначениеПериода = НачалоПериода;
	НастройкаПериода.РедактироватьКакИнтервал = Истина;
	НастройкаПериода.РедактироватьКакПериод = Истина;
	НастройкаПериода.ВариантНастройки = ВариантНастройкиПериода.Период;
	Если Истина
		И НачалоГода(НачалоПериода) = НачалоПериода
		И КонецГода(НачалоПериода) = КонецПериода
	Тогда
		НастройкаПериода.ВариантПериода = ВариантПериода.Год;
	ИначеЕсли Истина
		И НачалоКвартала(НачалоПериода) = НачалоПериода
		И КонецКвартала(НачалоПериода) = КонецПериода
	Тогда
		НастройкаПериода.ВариантПериода = ВариантПериода.Квартал;
	ИначеЕсли Истина
		И НачалоМесяца(НачалоПериода) = НачалоПериода
		И КонецМесяца(НачалоПериода) = КонецПериода
	Тогда
		НастройкаПериода.ВариантПериода = ВариантПериода.Месяц;
	ИначеЕсли Истина
		И НачалоДня(НачалоПериода) = НачалоПериода
		И КонецДня(НачалоПериода) = КонецПериода
	Тогда
		НастройкаПериода.ВариантПериода = ВариантПериода.День;
	КонецЕсли; 
	Если НастройкаПериода.Редактировать() Тогда
		СтандартныйПериод.ДатаНачала = НастройкаПериода.ПолучитьДатуНачала();
		СтандартныйПериод.ДатаОкончания = НастройкаПериода.ПолучитьДатуОкончания();
		Возврат Истина;
	Иначе
		Возврат Ложь;
	КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// WMI

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

Функция ПреобразоватьРезультатыWMIвТаблицуЗначений(выхТаблицаWMI = Неопределено, РезультатыWMI, Знач СобиратьСистемныеСвойства = Ложь, 
	Знач СобиратьМетоды = Ложь, Знач ПолучатьПуть = Ложь, Знач ПолучатьЗначениеWMI = Ложь, ЗагружатьЭлементов = 100000) Экспорт
		
	выхТаблицаWMI = Новый ТаблицаЗначений;
	Если ПолучатьЗначениеWMI Тогда 
		выхТаблицаWMI.Колонки.Добавить("Значение");
	КонецЕсли;
	Если ПолучатьПуть Тогда 
		выхТаблицаWMI.Колонки.Добавить("Path", Новый ОписаниеТипов("Строка")); // Типизация
	КонецЕсли;
	Если СобиратьМетоды Тогда
		выхТаблицаWMI.Колонки.Добавить("Methods");
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ЗагружатьЭлементов) Тогда
		КоличествоЭлементов = Мин(ЗагружатьЭлементов, РезультатыWMI.Count);
	Иначе
		КоличествоЭлементов = РезультатыWMI.Count;
	КонецЕсли; 
	Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоличествоЭлементов, "Загрузка результата");
	СчетчикЭлементов = 0;
	Для Каждого ЗначениеWMI Из РезультатыWMI Цикл
		Если Индикатор.Счетчик = КоличествоЭлементов Тогда
			Прервать;
		КонецЕсли; 
		ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
		СтрокаТаблицыWMI = выхТаблицаWMI.Добавить();
		Если ПолучатьЗначениеWMI Тогда 
			СтрокаТаблицыWMI.Значение = ЗначениеWMI;
		КонецЕсли;
		Свойства = ирОбщий.ПолучитьСтруктуруИзЗначенияWMIЛкс(ЗначениеWMI.Properties_);
		//ДобавитьСтруктуруВСтрокуТаблицаЗначений(СтрокаТаблицыWMI, Свойства);
		Если Индикатор.Счетчик = 1 Тогда
			//выхТаблицаWMI.Колонки.Добавить("_Object");
			ЗаполнитьКолонкиТаблицыИзСвойствWMI(выхТаблица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.НайтиСтроки(Новый Структура("ТочкаПодключения", ТочкаПодключения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, ОписаниеТипов, ПредставлениеСвойства);
	КонецЦикла;

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

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

Процедура СвойстваСтрокиРезультатаВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
	
	Если Ложь
		Или Колонка = ЭлементыФормы.СвойстваСтрокиРезультата.Колонки.Имя
	Тогда
		КП_СвойстваСтрокиРезультатаТекущаяСтрока();
	Иначе
		Если Колонка = ЭлементыФормы.СвойстваСтрокиРезультата.Колонки.ПредставлениеЗначения Тогда 
			ТекущаяСтрокаВладельца = ЭлементыФормы.РезультатКоллекция.ТекущаяСтрока;
			Если ТекущаяСтрокаВладельца <> Неопределено Тогда
				ОформлениеСтрокиВладельца = ЭлементыФормы.РезультатКоллекция.ОформлениеСтроки(ТекущаяСтрокаВладельца);
				ЗначениеЯчейки = ОформлениеСтрокиВладельца.Ячейки[ВыбраннаяСтрока.Имя].Значение;
			Иначе
				ЗначениеЯчейки = ВыбраннаяСтрока.ТипЗначения.ПривестиЗначение();
			КонецЕсли; 
		Иначе
			ЗначениеЯчейки = 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, при необходимости подключая ВК. 
// При неудаче возвращается Неопределено 
Функция Новый_GameWithFire_ADOUtils(Отладка = Ложь) Экспорт
	ADOUtils = Неопределено;
	Попытка
		ADOUtils = Новый("AddIn.ADOUtils");
	Исключение
		// пытаемся подключить ВК
		#Если Клиент Тогда
			Если Отладка = Истина Тогда
				Сообщить("Попытка подключения ВК 'GameWithFire.ADOUtils' ...", СтатусСообщения.Информация);
			КонецЕсли; 
			Попытка
				ПодключитьВнешнююКомпоненту("GameWithFire.ADOUtils");
			Исключение
				Если Отладка = Истина Тогда
					Сообщить("	ошибка подключения ВК: "+ОписаниеОшибки(), СтатусСообщения.Важное);
				КонецЕсли; 
				Возврат Неопределено;
			КонецПопытки;
			Если Отладка = Истина Тогда
				Сообщить("	ВК успешно подключена.",СтатусСообщения.БезСтатуса);
			КонецЕсли; 
			Попытка
				ADOUtils = Новый("AddIn.ADOUtils");
			Исключение
				Если Отладка = Истина Тогда
					Сообщить("	ошибка создания объекта 'AddIn.ADOUtils' из ВК: "+ОписаниеОшибки(), СтатусСообщения.Важное);
				КонецЕсли; 
			КонецПопытки;
		#Иначе
			ВызватьИсключение("Подключение ВК 'GameWithFire.ADOUtils' доступно только на клиенте !");
		#КонецЕсли
	КонецПопытки;
	Возврат ADOUtils;
КонецФункции // Новый_GameWithFire_ADOUtils()

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

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

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

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

// выполнение запроса через ADO на клиенте с выгрузкой результата 
Функция ВыполнитьЗапросADO(ИсточникДанных, СоединениеADO, ОбъектЗапрос, стОпции, ЗапросТекст, cтПараметры, стПарТип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 в результат запроса 1C!";
			Возврат Неопределено;
		КонецЕсли; 
	КонецЕсли;
		
	Если ТипЗнч(ИндексБатча) <> Тип("Число") Тогда
		ИндексБатча = Неопределено;
	Иначе
		ИндексБатча = Цел(ИндексБатча);
	КонецЕсли;
		
	//Если ПакетноеВыполнение = Истина Тогда
	//	тзРезультаты = тзРезультатыПакета_Инит(РежимВыгрузки,ВремяВыполнения);
	//	Если РежимВыгрузки <> Неопределено Тогда
	//		тзРезультаты.Колонки.Добавить("RecordsAffected");
	//	КонецЕсли;
	//	Если ИндексБатча = Неопределено Тогда
	//		ИндексБатча = -1; // по умолчанию - нет ограничения по индексу команы в пакете 
	//	КонецЕсли; 
	//Иначе
		Если ИндексБатча = Неопределено Тогда
			ИндексБатча = 0;  // по умолчанию - результат первой команды из multi-batch-statement 
		КонецЕсли; 
	//КонецЕсли;
		
	Переподключиться = Неопределено;
	НеВыполнять = Неопределено;
	НеОтключаться = Неопределено;
	
	стОпции.Свойство("Переподключиться", Переподключиться);
	стОпции.Свойство("НеВыполнять", НеВыполнять); // вернуть объект, выполняющий запрос
	стОпции.Свойство("НеОтключаться", НеОтключаться);
	
	Если СоединениеADO = Неопределено ИЛИ Переподключиться = Истина Тогда
		// подключаемся или переподключаемся
		Если НЕ ConnectADO(ИсточникДанных, СоединениеADO, стОпции, Еррорс) Тогда
			ЕррорИнфо = "Ошибки подключения к источнику данных ADO:";
			Счетчик = 0;
			Для каждого Ерр Из Еррорс Цикл
				Счетчик = Счетчик + 1;
				ЕррорИнфо = ЕррорИнфо + "
				|	" + Счетчик + ")" + Ерр;
			КонецЦикла; 
			Возврат Неопределено;
		КонецЕсли;
		Если ТипЗнч(ОбъектЗапрос) = Тип("COMОбъект") Тогда
			// если передан объект запроса - надо заново установить соединение
			ОбъектЗапрос.ActiveConnection = СоединениеADO;
		КонецЕсли; 
	КонецЕсли;
	
	// Передача параметров запроса
	cтПараметрыТип=ТипЗнч(cтПараметры);
	ПарТипADOТип=ТипЗнч(стПарТипADO);
	
	ПараметрыКоличество=0;
	Если Ложь
		Или cтПараметрыТип = ТипаМассив 
		ИЛИ cтПараметрыТип = ТипаСоответствие 
	Тогда
		Если Истина
			И стПарТипADO <> Неопределено 
			И ПарТипADOТип <> cтПараметрыТип 
		Тогда
			ЕррорИнфо = 
			"Тип значения списка типов параметров ADO ('"+ПарТипADOТип+"') не равен
			|типу значений списка параметров запроса ('"+cтПараметрыТип+"') !";
			Возврат Неопределено;
		КонецЕсли; 
		ПараметрыКоличество = 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(); // Добавлено 22.10.2014
	Если RecordsetUse = Истина Тогда
		// открываем выборку
		ОбъектЗапрос = Новый COMОбъект("ADODB.Recordset");
		ОбъектЗапрос.ActiveConnection = СоединениеADO;
		//ОбъектЗапрос.Source = ЗапросТекстИ;
		
		Если CursorType<>Неопределено Тогда
			ОбъектЗапрос.CursorType = CursorType;
		КонецЕсли; 
		Если CursorLocation<>Неопределено Тогда
			ОбъектЗапрос.CursorLocation = CursorLocation;
		КонецЕсли; 
		Если LockType<>Неопределено Тогда
			ОбъектЗапрос.LockType = LockType;
		КонецЕсли;
		
		Если MarshalOptions<>Неопределено Тогда
			ОбъектЗапрос.MarshalOptions = MarshalOptions;
		КонецЕсли; 
		Если MaxRecords<>Неопределено Тогда
			ОбъектЗапрос.MaxRecords = MaxRecords;
			// Полезно было бы еще после выполнения запроса вернуть в исходное состояние, чтобы если через От открыли, то потом не было мины при продолжении выполнения код
		КонецЕсли; 
		Если CacheSize<>Неопределено Тогда
			ОбъектЗапрос.CacheSize = CacheSize;
		КонецЕсли;
		Если PageSize<>Неопределено Тогда
			ОбъектЗапрос.PageSize = PageSize;
		КонецЕсли;
	Иначе
		// выполняем команду
		Если Инициализация <> Ложь ИЛИ Инициализация = Истина Тогда
			Если мКоманда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тПараметрыТип <> ТипаМассив
				Тогда
					ЕррорИнфо = // для НЕ-ИМЕНОВАННЫХ параметров важен порядок следования, задаваемый индексом массива
						"Тип значения списка НЕ-ИМЕНОВАННЫХ параметров запроса должен быть 'Массив' !";
					Возврат Неопределено;
				КонецЕсли;
				cп_Параметры = cтПараметры;
				сп_ПарТипADO = стПарТип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);
			КонецЦикла; 
			сзЕррорс = Новый СписокЗначений;
			Индекс = -1;
			Для каждого Параметр Из cп_Параметры Цикл
				Если cтПараметрыТип = ТипаМассив Тогда
					ПараметрИмя = Неопределено;
					ПараметрЗнч = Параметр;
				ИначеЕсли cтПараметрыТип = ТипаСоответствие Тогда
					ПараметрИмя = СокрЛП(Параметр.Ключ);
					ПараметрЗнч = Параметр.Значение;
				Иначе
					Продолжить;
				КонецЕсли; 
				Индекс = Индекс + 1;
				стТипADO=Неопределено;
				Если ПарТипADOТип=ТипаМассив Тогда
					Если Индекс<=сп_ПарТипADO.Количество()-1 Тогда
						стТипADO = сп_ПарТипADO.Получить(Индекс);
					КонецЕсли; 
				ИначеЕсли ПарТипADOТип = ТипаСоответствие Тогда
					стТипADO = сп_ПарТипADO.Получить(Параметр.Ключ);
				КонецЕсли; 
				ЕррИнфо="";
				Рез = ирОбщий.ADODBCommand_УстановитьПараметрПо1СЛкс(ОбъектЗапрос,Инициализация,Индекс,ПараметрИмя,стТипADO,ПараметрЗнч,ADOUtils,ЕррИнфо);
				Если НЕ Рез Тогда
					Если ПараметрИмя = Неопределено Тогда
						сзЕррорс.Добавить("Param["+Индекс+"]",ЕррИнфо);
					Иначе
						сзЕррорс.Добавить(Параметр.Ключ,ЕррИнфо);
					КонецЕсли; 
				КонецЕсли; 
			КонецЦикла;
			Если сзЕррорс.Количество() > 0 Тогда
				ЕррорИнфо = "Ошибки установки параметров запроса через объект 'ADODB.Command':";
				Счетчик = 0;
				Для каждого Ерр Из сзЕррорс Цикл
					Счетчик = Счетчик + 1;
					ЕррорИнфо = ЕррорИнфо + "
					|	" + Счетчик + ") Параметр '"+Ерр.Значение+"': "+Ерр.Представление;
				КонецЦикла; 
				Возврат Неопределено;
			КонецЕсли; 
		КонецЕсли;
	КонецЕсли; 
	
	Если НеВыполнять = Истина Тогда
		// просто вернем COM-объект, выполняющий запрос (через аргумент ОбъектЗапрос).
		Возврат Неопределено;
	КонецЕсли;
		
	RecordsAffected = 0;
	БатчаИндекс = 0; // индекс текущего выполняемого батча (команды)
	
	// чистим коллекцию ошибок и выполняем запрос
	СоединениеADO.Errors.Clear();
	Если ВыводСостояния = Истина Тогда
		СостояниеИнфо = "Запрос через ADO";
		Состояние(СостояниеИнфо + " ...");
	КонецЕсли; 
	Попытка
		Если RecordsetUse = Истина Тогда
			Если Options=Неопределено Тогда
				ОбъектЗапрос.Open(ЗапросТекстИ);
			Иначе
				ОбъектЗапрос.Open(ЗапросТекстИ, СоединениеADO, CursorType, LockType, Options);
			КонецЕсли;
			РезультатЗапросаADO = ОбъектЗапрос;
		Иначе
			Если Parameters = Неопределено И Options = Неопределено Тогда
				РезультатЗапросаADO = ОбъектЗапрос.Execute(RecordsAffected);
			ИначеЕсли Parameters = Неопределено И Options <> Неопределено Тогда
				РезультатЗапросаADO = ОбъектЗапрос.Execute(RecordsAffected,, Options);
			ИначеЕсли Parameters <> Неопределено И Options = Неопределено Тогда
				РезультатЗапросаADO = ОбъектЗапрос.Execute(RecordsAffected, Parameters);
			Иначе
				РезультатЗапросаADO = ОбъектЗапрос.Execute(RecordsAffected, Parameters, Options);
			КонецЕсли;
		КонецЕсли;
	Исключение
		// ошибки библиотеки ADO
		ЕррорИнфо=
		"Ошибка 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Выполнить(ЭтотЗапрос, Параметры = Неопределено, РезультатADOВРезультатЗапросаGWF = Ложь, ВыводитьСообщения = Истина, выхРезультатПакета = Неопределено) Экспорт 
	Перем СтандартнаяОбработка, Отказ;
	//Перем ЭтотЗапрос;
	Перем ЗапросОбъект;
	Перем СоединениеADO;
	Перем тзРезультаты;
	
	ЕррорИнфо = "";
	СтандартнаяОбработка = Истина;
	//СоединенияADO_Инит();
		
	// заполним список параметров текущего запроса ...
	Если НЕ спПараметры_СтруктураКорректна(ЭтотЗапрос.спПараметры)  Тогда
		ЭтотЗапрос.спПараметры = спПараметры_Инит();
	КонецЕсли;
	
	Если Параметры <> Неопределено Тогда
		Для каждого СтрокаПараметра Из Параметры Цикл
			СтрПар = ЭтотЗапрос.спПараметры.Найти(СтрокаПараметра.ИмяПараметра, "Имя");
			Если СтрПар = Неопределено Тогда
				СтрПар = ЭтотЗапрос.спПараметры.Добавить();
				СтрПар.Имя = СтрокаПараметра.ИмяПараметра;
				СтрПар.Значение = СтрокаПараметра.Значение;
			Иначе
				// установим индекс строки для задания прорядка в НЕ-ИМЕНОВАННЫХ списках параметров
				СтрПар.Индекс = Параметры.Индекс(СтрокаПараметра);
			КонецЕсли; 
		КонецЦикла; 
	КонецЕсли; 
			
	Если СтандартнаяОбработка = Истина Тогда
		ЗапросТекст = СокрЛП(ЭтотЗапрос.ТекстЗапроса);
		Если ПустаяСтрока(ЗапросТекст) Тогда
			ЕррорИнфо = "Не задан текст запроса !";
			Перейти ~ВызыватьИсключение;
		КонецЕсли;
		
		//ОпцииОчистить(ЭтотЗапрос);
		//ОпцияВставить(ЭтотЗапрос,"ВремяВыполнения",Истина); // Возвращать время выполнения и время выгрузки
		ИсточникДанных = ЭтотЗапрос.ИсточникДанных;
		ЕррорИнфо = "";
		Если Не ЗначениеЗаполнено(ИсточникДанных) Тогда
			ВызватьИсключение "Источник данных ADO не заполнен";
		КонецЕсли; 
		// запрос ADO
		ОпцияВставить(ЭтотЗапрос, "НеОтключаться",Истина);
		СоединениеADO = ПолучитьСоединениеADO();
		стОпции = ЭтотЗапрос.стОпции;
		спПараметры = ЭтотЗапрос.спПараметры;
		РезультатRecordSet = ВыполнитьЗапрос_ADO(ИсточникДанных, СоединениеADO, ЗапросОбъект, стОпции, ЗапросТекст, спПараметры, ЕррорИнфо,, выхРезультатПакета);
	КонецЕсли;
	Если ПустаяСтрока(ЕррорИнфо) Тогда
		Возврат РезультатRecordSet;
	КонецЕсли;
	
~ВызыватьИсключение:
	Если ВыводитьСообщения Тогда
		ЕррорТекстС = "" + ЕррорИнфо;
		ирОбщий.СообщитьСУчетомМодальностиЛкс(ЕррорТекстС, МодальныйРежим, СтатусСообщения.Внимание);
	КонецЕсли; 
	
КонецФункции // ЗапросADOВыполнить()

// инициирует таблицу списка параметров запроса
Функция спПараметры_Инит() Экспорт
	спПараметры = Новый ТаблицаЗначений;
	спПараметры.Колонки.Добавить("Имя");
	спПараметры.Колонки.Добавить("Значение");
	спПараметры.Колонки.Добавить("Тип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 = Неопределено Тогда // Добавлено 12.10.2014
		Если мКоманда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);
	Иначе
		ЭтаФорма.АутентификацияОС = Ложь;
	КонецЕсли; 
	ОбновитьПараметрыКонтекстнойПодсказкиТекстаЗапроса(Ложь); // Для обновления параметров диалекта SQL
	//ЭтаФорма.ИменованныеПараметрыADO = ПолеТекстовогоДокументаСКонтекстнойПодсказкой.ТекстЗапроса.мПараметрыДиалектаSQL.ИменованныеПараметры;
	ЭтаФорма.ИменованныеПараметрыADO = ПараметрыПлатформыADO.ИменованныеПараметры;
	ЭлементыФормы.ИменованныеПараметрыADO.Доступность = ПараметрыПлатформыADO.ИменованныеПараметры = Истина;
	ЭлементыФормы.Параметры.Колонки.Индекс.Видимость = Не ЭтаФорма.ИменованныеПараметрыADO;
	Если УстановитьМодифицированность Тогда
		ЭтаФорма.Модифицированность = Истина;
	КонецЕсли; 

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

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

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

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

Процедура СтрокаСоединенияADOНачалоВыбора(Элемент, СтандартнаяОбработка)
	
	СоединениеADO = Новый COMОбъект("ADODB.Connection");
	СоединениеADO.ConnectionString = Элемент.Значение;
	ДатаЛинк = Новый COMОбъект("DataLinks");
	Если ДатаЛинк.PromptEdit(СоединениеADO) Тогда
		ЭтаФорма.Модифицированность = Истина;
		Элемент.Значение = СоединениеADO.ConnectionString;
	КонецЕсли; 
	
КонецПроцедуры

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

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

Функция ЗаполнитьВыборкиИтоговИзЗапроса()

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

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

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

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

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

Процедура ТаблицаВыборокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
	
	Если ДанныеСтроки.Включена Тогда
		ОформлениеСтроки.ЦветТекста = 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 Тогда
		Возврат;
	КонецЕсли; 
	ТаблицаЗначений = ирОбщий.ПолучитьТаблицуСМинимальнымиТипамиКолонокЛкс(ТаблицаЗначений, Истина);
	ИмяТаблицы = СтрокаЗапроса.Запрос;
	Если Не ВвестиСтроку(ИмяТаблицы, "Введите имя создаваемой временной таблицы") Тогда
		Возврат;
	КонецЕсли; 
	Если Не ирОбщий.ЛиИмяПеременнойЛкс(ИмяТаблицы) Тогда
		//ИмяТаблицы = ирОбщий.ПолучитьАвтоУникальноеИмяВКоллекцииСтрокЛкс(ирОбщий.ПолучитьРодителяСтрокиДереваЛкс(СтрокаЗапроса).Строки,
		//	СтрокаЗапроса, "Запрос");
		//мТекущаяСтрокаДереваЗапросов.Запрос = ИмяТаблицы;
		ИмяТаблицы = мПлатформа.ПолучитьИдентификаторИзПредставления(ИмяТаблицы);
	КонецЕсли; 
	мОбъектЗапроса.Текст = "УНИЧТОЖИТЬ " + ИмяТаблицы;
	Попытка
		мОбъектЗапроса.Выполнить();
	Исключение
	КонецПопытки;
	мОбъектЗапроса.Текст = "ВЫБРАТЬ * ПОМЕСТИТЬ " + ИмяТаблицы + " ИЗ &Т КАК Т";
	мОбъектЗапроса.Параметры.Вставить("Т", ТаблицаЗначений);
	Попытка
		мОбъектЗапроса.Выполнить();
	Исключение
		ОписаниеОшибки = ОписаниеОшибки();
		ирОбщий.СообщитьСУчетомМодальностиЛкс("Ошибка помещения данных во временную таблицу 1С с именем запроса (""" + ИмяТаблицы + """): " + ОписаниеОшибки,
			МодальныйРежим, СтатусСообщения.Внимание);
		Возврат;
	КонецПопытки; 
	мВременныеТаблицыМенеджера1С.Вставить(НРег(ИмяТаблицы), ИмяТаблицы);
	ОбновитьТабличноеПолеВременныхТаблиц();
	ирОбщий.СообщитьСУчетомМодальностиЛкс(XMLСтрока(ТаблицаЗначений.Количество()) 
		+ " строк были помещены во временную таблицу 1С """ + ИмяТаблицы + """", МодальныйРежим, СтатусСообщения.Информация);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

КонецФункции // СтруктураХраненияБДСРазмерами()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

////////////////////////////////////////////////////////////////////////////////
// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ

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

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

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

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

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

ДеревоЗапросов.Колонки.Добавить("СтрокаДанных");
мРежимДереваЗапроса = Ложь;
мРежимСворачивания = Ложь;
мЗапросЗагруженВКонсоль = Ложь;
мСлужебноеПолеТекстовогоДокумента = ирКэш.Получить().СлужебноеПолеТекстовогоДокумента;

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

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

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

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