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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Функция СохранитьКомпоновкиВФайл(ЗапрашиватьСохранение = Ложь, ЗапрашиватьИмяФайла = Ложь, Знач ИмяФайла = Неопределено, СброситьМодифицированность = Неопределено, Знач ЭтоФайлВосстановления = Ложь)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура АктивизироватьТабличноеПолеНастроек(Знач ТабличноеПоле, ТекущаяСтрока = Неопределено)
	
	// Антибаг платформы 8.3.12+ Не выполняется установка текущим элемента обычной формы на неактивной странице https://partners.v8.1c.ru/forum/t/1757924/m/1757924
	ирОбщий.ПрисвоитьЕслиНеРавноЛкс(ЭтаФорма.ЭлементыФормы.ПанельНастройкиЭлемента.ТекущаяСтраница, ЭтаФорма.ЭлементыФормы.ПанельНастройкиЭлемента.Страницы[ТабличноеПоле.Имя]);
	ЭтаФорма.ТекущийЭлемент = ТабличноеПоле;
	Если ТекущаяСтрока <> Неопределено Тогда
		ТабличноеПоле.ТекущаяСтрока = ТекущаяСтрока;
	КонецЕсли; 

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

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

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

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

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

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

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

Процедура УстановитьМакетКомпоновкиДанных(Знач МакетКомпоновкиДанных = Неопределено)
	
	Если МакетКомпоновкиДанных <> Неопределено Тогда
		мМакетКомпоновкиДанных = МакетКомпоновкиДанных;
	КонецЕсли; 
	КопияМакета = ирОбщий.КопияОбъектаЛкс(мМакетКомпоновкиДанных, Истина);
	ЭлементыФормы.МакетаКомпоновкиПлоский.Очистить();
	ЭлементыФормы.МакетаКомпоновкиЯчейки.Очистить();
	Попытка
		ОбластьМакетаПолная = ПредставлениеМакетовИТелаМакетаКомпоновкиДанных(,, КопияМакета);
		#Если Сервер И Не Сервер Тогда
			ОбластьМакетаПолная = Новый ТабличныйДокумент;
		#КонецЕсли
		СтрокаРазреза = НайтиОбластьМакетаЯчеек("Макет1", ОбластьМакетаПолная);
		ОбластьМакетаСтруктура = ОбластьМакетаПолная.Область();
		Если СтрокаРазреза <> Неопределено Тогда
			ОбластьМакетаЯчейки = ОбластьМакетаПолная.Область(СтрокаРазреза.Верх,, ОбластьМакетаПолная.ВысотаТаблицы);
		Иначе
			ОбластьМакетаЯчейки = Неопределено;
		КонецЕсли;
	Исключение
		// http://devtool1c.ucoz.ru/forum/2-998-1
		ОбластьМакетаСтруктура = ОписаниеОшибки();
	КонецПопытки; 
	Если ТипЗнч(ОбластьМакетаСтруктура) = Тип("Строка") Тогда
		ЭлементыФормы.МакетаКомпоновкиПлоский.Область(1,1).Текст = ОбластьМакетаСтруктура;
	Иначе
		Если ОбластьМакетаЯчейки <> Неопределено Тогда
			ЭлементыФормы.МакетаКомпоновкиЯчейки.ВставитьОбласть(ОбластьМакетаЯчейки, ЭлементыФормы.МакетаКомпоновкиЯчейки.Область(1,1),, Ложь);
			ОбластьМакетаПолная.УдалитьОбласть(ОбластьМакетаЯчейки);
		КонецЕсли;
		ЭлементыФормы.МакетаКомпоновкиПлоский.ВставитьОбласть(ОбластьМакетаСтруктура,,, Ложь);
	КонецЕсли; 
	Попытка
		ТекстМакета = ирОбщий.ОбъектВСтрокуXMLЛкс(мМакетКомпоновкиДанных);
	Исключение
		ТекстМакета = ОписаниеОшибки();
	КонецПопытки; 
	ЭлементыФормы.МакетКомпоновкиXML.УстановитьТекст(ТекстМакета);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ОчиститьМенеджерВременныхТаблиц()
	мМенеджерВременныхТаблиц = Неопределено;
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура КП_ВнешниеНаборыДанныхСброситьВнешниеНаборыДанных(Кнопка)
	
	ВнешниеНаборыДанных.Очистить();
	ОбновитьТаблицыСхемы();
	
КонецПроцедуры

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

Процедура ВнешниеНаборыДанныхПередУдалением(Элемент, Отказ)
	
	Если Элемент.ТекущаяСтрока.Необходимый Тогда
		Отказ = Истина;
	КонецЕсли; 
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ЗаполнитьТаблицуДляПредпросмотра(Знач ТаблицаНабора)
	
	Для Счетчик = 1 По 2 Цикл
		НоваяСтрокаДанных = ТаблицаНабора.Добавить();
		Для Каждого КолонкаДанных Из ТаблицаНабора.Колонки Цикл
			Если КолонкаДанных.ТипЗначения.СодержитТип(Тип("Строка")) Тогда
				НоваяСтрокаДанных[КолонкаДанных.Имя] = КолонкаДанных.Имя + Счетчик;
			ИначеЕсли КолонкаДанных.ТипЗначения.СодержитТип(Тип("Булево")) Тогда
				НоваяСтрокаДанных[КолонкаДанных.Имя] = ?(Счетчик = 1, Истина, Ложь);
			ИначеЕсли КолонкаДанных.ТипЗначения.СодержитТип(Тип("Число")) Тогда
				НоваяСтрокаДанных[КолонкаДанных.Имя] = Счетчик;
			ИначеЕсли КолонкаДанных.ТипЗначения.СодержитТип(Тип("Дата")) Тогда
				НоваяСтрокаДанных[КолонкаДанных.Имя] = ТекущаяДата() - Счетчик * 24 * 60 * 60;
			КонецЕсли; 
		КонецЦикла;
	КонецЦикла;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// Предопределеный метод
Процедура ПроверкаЗавершенияФоновыхЗаданий() Экспорт 
	
	ирКлиент.ПроверитьЗавершениеФоновыхЗаданийФормыЛкс(ЭтаФорма);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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