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

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

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

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

Процедура ЗагрузитьДоступныеОбработки(СтарыеВыбранныеОбработки = Неопределено)

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

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

Процедура НастроитьЭлементыФормы()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Функция ПолноеИмяПервойТаблицыБД()
	
	Возврат ?(МноготабличнаяВыборка, ОбластьПоиска[0].Значение, ОбластьПоиска);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	ирКлиент.Форма_ПриЗакрытииЛкс(ЭтаФорма);
	
КонецПроцедуры

Процедура ЗаполнитьСтрокиНажатие(Кнопка)
	
	ЗаполнитьСтроки();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Функция ПервыйОбъектМД()
	
	Если МноготабличнаяВыборка Тогда
		ПервыйОбъектМД = мИскомыйОбъект.МетаОбъект[0];
	Иначе
		ПервыйОбъектМД = мИскомыйОбъект.МетаОбъект;
	КонецЕсли;
	Возврат ПервыйОбъектМД;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

