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

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

// Управляет настройкой элеметов управления формы.
//
// Параметры: 
//  Нет.
//
Процедура вНастроитьЭУ()

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

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

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

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

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

// Выполняет запрос и выгружает результат в таблицу значений.
//
// Параметры: 
//  Нет.
//
Процедура вВыполнитьОтчет() Экспорт

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

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

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

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

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

КонецПроцедуры // вВыполнитьОтчет()

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

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

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

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

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

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

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

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

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

	Условие = "";
	
	ТекстЗапроса = "ВЫБРАТЬ ";
	Если ЗначениеЗаполнено(ПервыеNКаждойТаблицы) Тогда
		ТекстЗапроса = ТекстЗапроса + "ПЕРВЫЕ " + XMLСтрока(ПервыеNКаждойТаблицы) + " ";
	КонецЕсли; 
	ТекстРеквизитов = "";
	//ПолноеИмяМД = ИскомыйОбъект.МетаОбъект.ПолноеИмя();
	ПолноеИмяМД = ОбластьПоиска;
	ПоляТаблицыБД = ирОбщий.ПолучитьПоляТаблицыМДЛкс(ПолноеИмяМД);
	#Если Сервер И Не Сервер Тогда
		ПоляТаблицыБД = ПолучитьСтруктуруХраненияБазыДанных().Колонки;
	#КонецЕсли
	Для Каждого ПолеТаблицыБД Из ПоляТаблицыБД Цикл
		//Если ПолеТаблицыБД.ТипЗначения.СодержитТип(Тип("ТаблицаЗначений")) Тогда
		//	Продолжить;
		//КонецЕсли;
		//ТекстРеквизитов = ТекстРеквизитов + ", " + Символы.ПС + "Т." + ДоступноеПоле.Имя + " КАК " + ДоступноеПоле.Имя; // запрещенные имена например "Соединение" так вызывают ошибку
		ТекстРеквизитов = ТекстРеквизитов + ", " + Символы.ПС + "Т." + ПолеТаблицыБД.Имя;
	КонецЦикла; 
	Если ТекстРеквизитов = "" Тогда
		Возврат "";
	КонецЕсли; 
	ТекстЗапроса = ТекстЗапроса + Сред(ТекстРеквизитов, 2) + ", 0 КАК " + мИмяСлужебногоПоля;
	ПолноеИмяТаблицыБД = ирОбщий.ПолучитьИмяТаблицыИзМетаданныхЛкс(ПолноеИмяМД);
	ТекстЗапроса = ТекстЗапроса + Символы.ПС + "ИЗ" + Символы.ПС + ирОбщий.ПолучитьОпределениеТаблицыБДДляИЗЛкс(ПолноеИмяТаблицыБД) + " КАК Т" + Символы.ПС;
	Если Истина
		И ИспользоватьОтборПоУзлу 
		И ЗначениеЗаполнено(УзелОтбораОбъектов) 
	Тогда
		Если ирОбщий.ЕстьТаблицаИзмененийОбъектаМетаданных(мИскомыйОбъект.Метаобъект) Тогда
			ТекстУсловияСоединения = "_Изменения_.Узел = &Узел";
			СтруктураКлючаИзменений = ирОбщий.ПолучитьСтруктуруКлючаТаблицыБДЛкс(ПолноеИмяТаблицыБД + ".Изменения");
			Для Каждого КлючИЗначение Из СтруктураКлючаИзменений Цикл
				Если ирОбщий.СтрокиРавныЛкс(КлючИЗначение.Ключ, "Узел") Тогда
					Продолжить;
				КонецЕсли; 
				Если ТекстУсловияСоединения <> "" Тогда
					ТекстУсловияСоединения = ТекстУсловияСоединения + Символы.ПС + "	И";
				КонецЕсли;
				ТекстУсловияСоединения = ТекстУсловияСоединения + " _Изменения_." + КлючИЗначение.Ключ + " = Т." + КлючИЗначение.Ключ;
			КонецЦикла;
			ТекстЗапроса = ТекстЗапроса + Символы.ПС + " ВНУТРЕННЕЕ СОЕДИНЕНИЕ " + ПолноеИмяТаблицыБД + ".Изменения КАК _Изменения_
				|	ПО " + ТекстУсловияСоединения;
		Иначе
			//Сообщить("У таблицы нет таблицы изменений. Отбор по узлу игнорирован.");
		КонецЕсли; 
	КонецЕсли; 
	ТекстУсловияСоединения = "";
	Если ПодключатьПоляКоличестваДвижений Тогда
		Если ирОбщий.ЛиКорневойТипДокументаЛкс(мИскомыйОбъект.ТипТаблицы) Тогда
			ТекстОбщееКоличествоДвижений = "";
			Для Каждого МетаРегистр Из мИскомыйОбъект.Метаобъект.Движения Цикл
				ПолноеИмяРегистра = МетаРегистр.ПолноеИмя();
				КраткоеИмяРегистра = МетаРегистр.Имя;
				ТекстУсловияСоединения = ТекстУсловияСоединения + Символы.ПС + " { ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ _Регистр_.Регистратор, КОЛИЧЕСТВО(*) КАК КоличествоСтрок
					|	ИЗ " + ПолноеИмяРегистра + " КАК _Регистр_ СГРУППИРОВАТЬ ПО _Регистр_.Регистратор) КАК " + КраткоеИмяРегистра + "
					|	ПО " + КраткоеИмяРегистра + ".Регистратор = Т.Ссылка}";
				Если ТекстОбщееКоличествоДвижений <> "" Тогда
					ТекстОбщееКоличествоДвижений = ТекстОбщееКоличествоДвижений + " + ";
				КонецЕсли; 
				ВыражениеКоличества = "ЕСТЬNULL(" + КраткоеИмяРегистра + ".КоличествоСтрок, 0)";
				ТекстОбщееКоличествоДвижений = ТекстОбщееКоличествоДвижений + ВыражениеКоличества;
				ТекстОбщееКоличествоДвижений = ВыражениеКоличества + " КАК КоличествоСтрок" + КраткоеИмяРегистра + ", " + ТекстОбщееКоличествоДвижений;
			КонецЦикла;
			Если ЗначениеЗаполнено(ТекстОбщееКоличествоДвижений) Тогда
				ТекстУсловияСоединения = ТекстУсловияСоединения + "
				|{ГДЕ " + ТекстОбщееКоличествоДвижений + " КАК КоличествоСтрокВсеРегистры}";
			КонецЕсли; 
		КонецЕсли; 
	КонецЕсли; 
	Если ЗначениеЗаполнено(ТекстУсловияСоединения) Тогда
		ТекстЗапроса = ТекстЗапроса + ТекстУсловияСоединения;
	КонецЕсли; 
	Если Условие <> "" Тогда
		ТекстЗапроса = ТекстЗапроса + "
		|{ГДЕ " + Условие + "}";
	КонецЕсли;
	Возврат ТекстЗапроса;

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

// Выполняет настройку объекта ПостроительОтчетов.
//
// Параметры: 
//  Нет.
//
Процедура вНастроитьПостроитель(СохранятьТекущиеНастройки = Истина)

	Перем Настройки;

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

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

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

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

Процедура СохранитьНастройкиТекущейТаблицы()
	
	Если Найти(ТекущийОбъект, ",") > 0 Тогда
		// Не сохраняем настройки многотабличной выборки, чтобы не замусоривать настройки формы
		Возврат;
	КонецЕсли; 
	СохраняемыеНастройки = ПолучитьСтруктуруНастроекТекущейТаблицы();
	НастройкиКомпоновки[ТекущийОбъект] = СохраняемыеНастройки;

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

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

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

Функция вОбработкаДоступна(ПроверяемыйТипОбъекта = "", ИмяОбработки)

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

	//ТипыОбрабатываемыхОбъектов = ПолучитьФорму(ИмяОбработки).мТипыОбрабатываемыхОбъектов;

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

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

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)

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

КонецПроцедуры // ПередОткрытием()

Процедура ПриОткрытии()

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

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

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

Процедура ПриЗакрытии()

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

Процедура ПередСохранениемЗначений(Отказ)

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

КонецПроцедуры // ПередСохранениемЗначений()

Процедура ПослеВосстановленияЗначений()

	МноготабличнаяВыборка = ТипЗнч(ОбластьПоиска) = Тип("СписокЗначений");
	Попытка
		УстановитьОбластьПоиска();
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки; 
	АвтозаполнениеПорядкаПриИзменении();

КонецПроцедуры // ПослеВосстановленияЗначений()

////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ КОМАНДНОЙ ПАНЕЛИ ПостроительОтчета

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

	вВыполнитьОтчет();

КонецПроцедуры // ВыполнитьПоиск()

////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ КОМАНДНОЙ ПАНЕЛИ НайденныеОбъекты

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

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

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

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

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

////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЧНОГО ПОЛЯ ОбъектыДляОбработки

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

КонецПроцедуры // НайденныеОбъектыВыбор()

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

КонецПроцедуры // НайденныеОбъектыПередНачаломДобавления()

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

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

	СтандартнаяОбработка = Ложь;
	Если Не ОбработкаРазрешенаДляТаблицы(ВыбраннаяСтрока) Тогда
		Возврат;
	КонецЕсли; 

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

	Обработка.ТекущаяНастройка = ВыбраннаяСтрока;
	Обработка.Открыть();
	
КонецПроцедуры // ДоступныеОбработкиВыбор()

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

	Если Элемент.ТекущиеДанные = Неопределено Тогда
		Отказ = Истина;
	КонецЕсли;

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

			НоваяСтрока = Элемент.ТекущиеДанные.Родитель.Строки.Добавить();
			НоваяСтрока.Обработка = Элемент.ТекущиеДанные.Обработка;

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

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

Процедура ДоступныеОбработкиПередУдалением(Элемент, Отказ)

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

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

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

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

Процедура ДобавитьВВыбранныеНажатие(Элемент)

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

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

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

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

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

	Обработка.ТекущаяНастройка = ВыбраннаяСтрока.СтрокаДоступнойОбработки;
	Обработка.Открыть();

КонецПроцедуры // ВыбранныеОбработкиВыбор()

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

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

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

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

	Для каждого Строка из ВыбранныеОбработки Цикл
		Строка.Пометка = Истина;
	КонецЦикла;

КонецПроцедуры // КоманднаяПанельВыбранныеОбработкиУстановитьФлажки()

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

	Для каждого Строка из ВыбранныеОбработки Цикл
		Строка.Пометка = Ложь;
	КонецЦикла;
	
КонецПроцедуры // КоманднаяПанельВыбранныеОбработкиСнятьФлажки()

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

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

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

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

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

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

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

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

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

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

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

Процедура КоманднаяПанельДоступныеОбработкиЗагрузитьНастройку(Кнопка)

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

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

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

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

Процедура ГлавнаяКоманднаяПанельОчиститьНатройкиОбработок(Кнопка)

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

	ДоступныеОбработки.Строки.Очистить();
	ВыбранныеОбработки.Очистить();

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

Процедура ПредставлениеОбластиПоискаНачалоВыбора(Элемент, СтандартнаяОбработка)
	
	Форма = ирКэш.Получить().ПолучитьФорму("ВыборОбъектаМетаданных", Элемент, ЭтаФорма);

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

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

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

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

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

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

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

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

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

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

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

Процедура ОбновлениеОтображения()

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

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

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

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

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

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

Функция ПолучитьОписаниеТиповКлючейРезультатов()

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

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

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

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

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

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

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

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

Процедура ПредставлениеОбластиПоискаПриИзменении(Элемент)

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура РежимОбходаДанныхПриИзменении(Элемент)
	
	
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

Процедура МноготабличнаяВыборкаПриИзменении(Элемент)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура КоманднаяПанельПоляБитыхСсылокСнятьФлажки(Кнопка)
	
	ПоляБитыхСсылок.ЗаполнитьЗначения(Ложь, "Пометка");
	
КонецПроцедуры

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

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

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

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

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

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

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

Процедура ПодключатьПоляКоличестваДвиженийПриИзменении(Элемент)
	
	вНастроитьПостроитель();
	
КонецПроцедуры

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

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

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

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

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

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

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

мИмяСлужебногоПоля = "СлужебноеПоле8195";
ирОбщий.ПодключитьОбработчикиСобытийДоступныхПолейКомпоновкиЛкс(ЭлементыФормы.КомпоновщикДоступныеПоляОтбора);
ЭлементыФормы.КомпоновщикОтбор.Колонки.ПравоеЗначениеДляКраткогоОтображенияЭлемента.ЭлементУправления.УстановитьДействие("НачалоВыбора", Новый Действие("ОтборКомпоновкиЗначениеНачалоВыбора"));
ДоступныеОбработки.Колонки.Добавить("Картинка");
ЭлементыФормы.ПервыеNКаждойТаблицы.СписокВыбора.Добавить(1);
ЭлементыФормы.ПервыеNКаждойТаблицы.СписокВыбора.Добавить(10);
ЭлементыФормы.ПервыеNКаждойТаблицы.СписокВыбора.Добавить(100);
ЭлементыФормы.ПервыеNКаждойТаблицы.СписокВыбора.Добавить(1000);
ЭлементыФормы.ПервыеNКаждойТаблицы.СписокВыбора.Добавить(10000);
ЭлементыФормы.ПервыеNКаждойТаблицы.СписокВыбора.Добавить(100000);
ЭлементыФормы.ПервыеNКаждойТаблицы.СписокВыбора.Добавить(500000);
ЭлементыФормы.ПервыеNКаждойТаблицы.СписокВыбора.Добавить(1000000);

