// +++.КЛАСС.ПолеТабличногоДокументаСГруппировками

Перем ПолеТабличногоДокументаСГруппировками;

// ---.КЛАСС.ПолеТабличногоДокументаСГруппировками


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

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

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

Процедура ОчиститьЗначения()

	мТекущаяСтрока = Неопределено;
	ДеревоОтчетов.Строки.Очистить();

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

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

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

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

Процедура СохранитьИмяФайла()

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

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

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

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

Процедура ВосстановитьИмяФайла()

	мИмяОткрытогоФайла = ирОбщий.ВосстановитьЗначениеЛкс("КонсольКомпоновки_ИмяФайла");
	мИмяПути  = ирОбщий.ВосстановитьЗначениеЛкс("КонсольКомпоновки_ИмяПути");

	Если мИмяОткрытогоФайла = НеОпределено Тогда
		мИмяОткрытогоФайла = "";
	КонецЕсли;

	Если мИмяПути = НеОпределено Тогда
		мИмяПути = "";
	КонецЕсли;
	
КонецПроцедуры

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



	мИмяОткрытогоФайла = "";

	мИмяПути = "";

	Если Не Отладка Тогда 

		СохранитьИмяФайла();

	КонецЕсли;


	ОчиститьЗначения();
	//мУстановитьЗаголовокФормы();
	мТекущаяСтрока = НеОпределено;

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

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

		Таблица.Колонки.Добавить("СхемаКомпоновкиДанных");

	КонецЕсли;
	

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

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

Функция СохранитьКомпоновкиВФайл(ЗапрашиватьСохранение = Ложь, ЗапрашиватьИмяФайла = Ложь)

	Если мТекущаяСтрока <> Неопределено Тогда
		СохранитьТекущиеНастройкиВСтроку();
	КонецЕсли;

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

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

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

	ЭтаФорма.Модифицированность = Ложь;
	СохранитьИмяФайла();
	Обновить();
	Возврат Истина;

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

Процедура ОбработчикИзмененияДанных(ИмяДанных)

	ЭтаФорма.Модифицированность = Истина;

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

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

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

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

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

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

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


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

	Если Строка.Настройки <> Неопределено Тогда
		

		Если Строка.НастройкаДляЗагрузки <> Неопределено Тогда
			

			Для Каждого Тн ИЗ Строка.Настройки Цикл
				

				Если Тн.Имя = Строка.НастройкаДляЗагрузки Тогда

					
					ПоследняяОткрытаяНастройка = Строка.НастройкаДляЗагрузки;

					//НастройкиПостроителяЗагружены = Истина;

					ЗагрузитьНастройки(Тн);
					НастройкиЗагружены = Истина;

					Прервать;
					

				КонецЕсли;
				

			КонецЦикла;
			

		Иначе
			

			Если Строка.Настройки.Количество() > 0 Тогда
				

				ЗагрузитьНастройки(Строка.Настройки[0]);
				НастройкиЗагружены = Истина;
				

			КонецЕсли;
			

		КонецЕсли;
		

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

	
	//КомпоновщикНастроек.Восстановить(); // Закомментировано 06.03.2011

	

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

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

		ПозицияЛево  = Область.Лево;

		ПозицияВерх  = Область.Верх;

		ПозицияПраво = Область.Право;

		ПозицияНиз   = Область.Низ;

	КонецЕсли;

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

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

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

// <Описание функции>
//
// Параметры:
//  <Параметр1>  – <Тип.Вид> – <описание параметра>
//                 <продолжение описания параметра>;
//  <Параметр2>  – <Тип.Вид> – <описание параметра>
//                 <продолжение описания параметра>.
//
// Возвращаемое значение:
//               – <Тип.Вид> – <описание значения>
//                 <продолжение описания значения>;
//  <Значение2>  – <Тип.Вид> – <описание значения>
//                 <продолжение описания значения>.
//
Функция ПолучитьМакетКомпоновки(ИмяТипаГенератора = Неопределено)

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

КонецФункции // ПолучитьМакетКомпоновки()

Функция ВыполнитьОтчет()
	
	МакетКомпоновкиДанных = ПолучитьМакетКомпоновки();

	Если МакетКомпоновкиДанных = Неопределено Тогда

		Возврат Ложь;

	КонецЕсли;

	

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

	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;

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

		ирОбщий.СообщитьСУчетомМодальностиЛкс("Формирование результата - " + Строка(ирКэш.Получить().ПолучитьТекущееВремяВМиллисекундах() - НачалоВывода)
			+ " мс", МодальныйРежим);

	КонецЕсли;
	
	Возврат Истина;

КонецФункции // ВыполнитьОтчет()

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

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

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

Процедура ЗагрузитьНастройкиОтчетаВМеню()
	
    Перем НомерНастройки;
	Перем Кнопки;

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

	//	НастройкиВКнопке[Строка(НомерНастройки)] = "";   

	//	ИмяКнопки = "К" + Строка(НомерНастройки);

	//	Действие = Новый Действие("ЗагрузитьНастройкиОтчета");

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

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

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

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

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

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

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



Процедура СкопироватьДеревоОтчетов(ИсходноеДерево, НовоеДерево, ОчиститьПередЗагрузкой = Истина)

	
	Если ОчиститьПередЗагрузкой Тогда
		НовоеДерево.Строки.Очистить();
	КонецЕсли;



	Если ИсходноеДерево.Строки.Количество() = 0 Тогда

		Возврат;

	КонецЕсли;



	Для Каждого СтрокаДерева из ИсходноеДерево.Строки Цикл

		НоваяСтрока = НовоеДерево.Строки.Добавить();

        СкопироватьПараметрыСтроки(СтрокаДерева, НоваяСтрока);

		СкопироватьДеревоОтчетов(СтрокаДерева, НоваяСтрока);

	КонецЦикла;



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


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

Процедура НовыйФайлОтчетов()

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

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

Процедура ОткрытьФайлОтчетов(ОчиститьПередЗагрузкой = Истина)

	Если СохранитьКомпоновкиВФайл(Истина) Тогда

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

	КонецЕсли;

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

Процедура Сохранить()

	СохранитьКомпоновкиВФайл();

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

Процедура СохранитьКак()

	СохранитьКомпоновкиВФайл(Ложь, Истина);

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

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

	ФормаВыбораСтрокиДереваОтчетов = ПолучитьФорму("ФормаВыбораСтрокиДереваОтчетов", ЭтаФорма);
	ФормаВыбораСтрокиДереваОтчетов.ЗакрыватьПриВыборе = Истина;

	ФормаВыбораСтрокиДереваОтчетов.ДеревоОтчетов = ДеревоОтчетов;
	ФормаВыбораСтрокиДереваОтчетов.ТекущаяСтрокаВладельца = ЭлементыФормы.ДеревоОтчетов.ТекущаяСтрока;
	ФормаВыбораСтрокиДереваОтчетов.ЭлементыФормы.ДеревоОтчетов.ТекущаяСтрока = ЭлементыФормы.ДеревоОтчетов.ТекущаяСтрока;

	ФормаВыбораСтрокиДереваОтчетов.ОткрытьМодально();

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

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

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

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

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

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

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

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

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

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

Процедура ЗагрузитьНастройкиОтчета(Кнопка)
	
	Перем Кнопки;

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

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

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

Процедура КонтМенюПереименовать(Кнопка)

	
	Если мТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Если Не ВвестиСтроку(мТекущаяСтрока.ИмяОтчета, НСтр("ru='Имя отчета'")) Тогда 

		Возврат;

	КонецЕсли;
	ЭтаФорма.Модифицированность = Истина;

	

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



///////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ УПРАВЛЕНИЯ

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

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

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

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

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

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

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

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

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

		НоваяСтрока = Родитель.Строки.Добавить();

	Иначе

		НоваяСтрока = ДеревоОтчетов.Строки.Добавить();

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

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

	ЭтаФорма.Модифицированность = Истина;
	
КонецПроцедуры

Функция ПолучитьАвтоИмяОтчета(СтрокаДереваИлиДерево, Копирование = Ложь)

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

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

Функция ЗаполнитьСвойстваОтчетаПоУмолчанию(НоваяСтрока, НастройкаКомпоновки = Неопределено)

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

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

Процедура ДеревоОтчетовПослеУдаления(Элемент)
	
	ЗагрузитьОтчетыВМеню();
	
КонецПроцедуры

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

	

	СтандартнаяОбработка = Ложь;

	СхемаКомпоновкиДанныхКонсоли = ПолучитьСхемуКомпоновки();

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

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

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

		    ЗаписатьИсторию();

			ОбновитьКнопкиИстории();

		КонецЕсли;

		ОтработанаРасшифровка = Истина;

	КонецЕсли;

	

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

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

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

	Если мСхемаКомпоновкиДанных <> Неопределено Тогда

		// Режим отладки компоновки

		СоздатьФайлЗапросов(Истина);

		ГлавнаяСтрока = ДеревоОтчетов.Строки[0];
		ЗаполнитьСвойстваОтчетаПоУмолчанию(ГлавнаяСтрока, КомпоновщикНастроек.Настройки);
		ГлавнаяСтрока.СхемаКомпоновкиДанных = ирОбщий.ПолучитьКопиюОбъектаЛкс(мСхемаКомпоновкиДанных);
	Иначе

		// Попытаемся загрузить последний открывавшийся файл отчетов

		ВосстановитьИмяФайла();

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

	КонецЕсли;

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

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

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

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

			КонецЕсли;

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

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

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

// Заполняет строки дерева наборами данных запросами схемы компоновки данных.
// Содержит рекурсивный вызов.
//
// Параметры:
//  СтрокиДерева – КоллекцияСтрокДереваЗначений;
//  НаборыДанных - НаборыДанных.
//
Процедура ЗаполнитьСтрокиДереваНаборовДанныхЗапросовПоСхеме(СтрокиДерева, СхемаКомпоновки)

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

КонецПроцедуры // ЗаполнитьСтрокиДереваНаборовДанныхЗапросовПоСхеме()

// Заполняет строки дерева наборами данных запросами схемы компоновки данных.
// Содержит рекурсивный вызов.
//
// Параметры:
//  СтрокиДерева – КоллекцияСтрокДереваЗначений;
//  НаборыДанных - НаборыДанных.
//
Процедура ЗаполнитьСтрокиДереваНаборовДанныхЗапросов(СтрокиДерева, НаборыДанных)

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

КонецПроцедуры // ЗаполнитьСтрокиДереваНаборовДанныхЗапросов()

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

	

	Если Не ТипЗнч(ВыбраннаяСтрока.НаборДанных) = Тип("НаборДанныхЗапросСхемыКомпоновкиДанных") Тогда
		Возврат;
	КонецЕсли;

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



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


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

	

	Кнопка.Пометка = Не Кнопка.Пометка;

	ЛиОтладка = Кнопка.Пометка;

	

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


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

	ДеревоНаборовДанныхЗапросов.Строки.Очистить();

	РесурсыСхемы.Очистить();
	ВычисляемыеПоляСхемы.Очистить();
	ПараметрыСхемы.Очистить();
	ВнешниеНаборыДанных.Очистить();
	Если мТекущаяСтрока <> Неопределено Тогда

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

			КорневаяСтрока.Имя = "Запросы";

			ЗаполнитьСтрокиДереваНаборовДанныхЗапросовПоСхеме(КорневаяСтрока.Строки, лСхемаКомпоновкиДанных);

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

	КонецЕсли;
	ЭлементыФормы.ПанельНастройкиЭлемента.Страницы.ВнешниеНаборыДанных.Видимость = ВнешниеНаборыДанных.Количество() > 0;

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

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

	
	Если ДанныеСтроки.ТипНабораДанных = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	ТипНабораДанных = ДанныеСтроки.ТипНабораДанных;
	ОформлениеСтроки.Ячейки.Имя.ОтображатьКартинку = Истина;

	Если ТипНабораДанных = Тип("НаборДанныхЗапросСхемыКомпоновкиДанных") Тогда
		ОформлениеСтроки.Ячейки.Имя.ИндексКартинки = 0;
	ИначеЕсли ТипНабораДанных = Тип("НаборДанныхОбъединениеСхемыКомпоновкиДанных") Тогда

		ОформлениеСтроки.Ячейки.Имя.ИндексКартинки = 1;

	ИначеЕсли ТипНабораДанных = Тип("ВложеннаяСхемаКомпоновкиДанных") Тогда
		ОформлениеСтроки.Ячейки.Имя.ИндексКартинки = 3;
	КонецЕсли;

	

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



Процедура КоманднаяПанельСтруктураСохранитьКакНастройкуПоУмолчанию(Кнопка)

	

	Если мТекущаяСтрока.СхемаКомпоновкиДанных = Неопределено Тогда

		Возврат;

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

	СхемаXDTO = СериализаторXDTO.ЗаписатьXDTO(мТекущаяСтрока.СхемаКомпоновкиДанных);

	//СхемаXDTO.defaultSettings = НастройкиXDTO; // Старый формат схемы
	Если ВыбранныйВариант.Значение = "<Новый>" Тогда
		settingsVariantElement = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data-composition-system/settings", "SettingsVariant"));
		ИмяВарианта = "";
		Если Не ВвестиСтроку(ИмяВарианта, "Введите наименование нового варанта") Тогда 
			Возврат;
		КонецЕсли; 
		settingsVariantElement.Name = ИмяВарианта;
		settingsVariantElement.presentation = ИмяВарианта;
		НастройкиДляСохранения = СхемаXDTO.settingsVariant.Добавить(settingsVariantElement);
	Иначе
		settingsVariantElement = СхемаXDTO.settingsVariant[ВыбранныйВариант.Значение];
	КонецЕсли; 
	settingsVariantElement.settings = НастройкиXDTO;
	мТекущаяСтрока.СхемаКомпоновкиДанных = СериализаторXDTO.ПрочитатьXDTO(СхемаXDTO);
	ЭтаФорма.Модифицированность = Истина;
	

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


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


Процедура КоманднаяПанельФормыИсполняемыеЗапросы(Кнопка)

	

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

	

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


Процедура КоманднаяПанельФормыНоваяКонсоль(Кнопка)

	

	ирОбщий.ОткрытьНовоеОкноОбработкиЛкс(ЭтотОбъект);
	

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


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


// @@@.КЛАСС.ПолеТабличногоДокументаСГруппировками

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

	

	ПолеТабличногоДокументаСГруппировками.Нажатие(Кнопка);

	

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



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



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



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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура КоманднаяПанельФормыНастройкаОсторожностиВыборкиДанных(Кнопка)
	
	ФормаНастройки = ирКэш.Получить().ПолучитьФорму("НастройкаОсторожностиВыборкиДанных");
	ФормаНастройки.ОткрытьМодально();
	Кнопка.Пометка = ирОбщий.ВосстановитьЗначениеЛкс("ир_ВыполнятьПредварительныйЗапрос") = Истина;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура КоманднаяПанельФормыВыполнитьАнализТрассы(Кнопка)
	
	Если мАнализТехножурнала <> Неопределено Тогда
		мАнализТехножурнала.ПоказатьТрассу(, "СтрокаМодуля",, 0);
	КонецЕсли; 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// +++.КЛАСС.ПолеТабличногоДокументаСГруппировками

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

// ---.КЛАСС.ПолеТабличногоДокументаСГруппировками


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