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

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

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

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

// Закрывает связанные формы выбора. 
//
// Параметры:
//  Нет.
//
Процедура ЗакрытьФормыВыбора()

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

КонецПроцедуры // ЗакрытьФормыВыбора()

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

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

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

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

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

Процедура УправлениеИерархиейТабличногоПоля()

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

КонецПроцедуры // УправлениеИерархиейТабличногоПоля()

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

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

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

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

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

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

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

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

Процедура КоманднаяПанельПорядокПрименить(Кнопка)
	
	Если Не УстановитьСвязь() Тогда 

		Возврат;

	КонецЕсли;

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

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

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

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

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

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

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

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

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

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

	Если Найти(Формула, "лПараметры." + Элемент.ТекущиеДанные.Имя) > 0 Тогда 

		Отказ = Истина;

		ирОбщий.СообщитьЛкс("Параметр используется в формуле. Удаление невозможно");

	КонецЕсли;


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

Процедура ПараметрыИмяПриИзменении(Элемент)
	
	//Если ПустаяСтрока(ЭлементыФормы.Параметры.ТекущиеДанные.Представление) Тогда 

	//	ЭлементыФормы.Параметры.ТекущиеДанные.Представление = ирОбщий.ПредставлениеИзИдентификатораЛкс(Элемент.Значение);

	//КонецЕсли;


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

Процедура ПараметрыПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)

	Если НоваяСтрока И ОтменаРедактирования Тогда
		Возврат;
	КонецЕсли;
	Попытка

		Пустышка = Новый Структура(Элемент.ТекущиеДанные.Имя);

	Исключение

		Пустышка = Новый Структура;

	КонецПопытки;

	НайденныеСтроки = Параметры.НайтиСтроки(Новый Структура("Имя", Элемент.ТекущиеДанные.Имя));

	Если Ложь

		ИЛИ Пустышка.Количество() = 0

		ИЛИ НайденныеСтроки.Количество() > 1

		ИЛИ (Истина

			И НайденныеСтроки.Количество() = 1

			И НайденныеСтроки[0] <> Элемент.ТекущаяСтрока)

	Тогда 

		Элемент.ТекущиеДанные.Имя = "Параметр" + Параметры.Индекс(Элемент.ТекущаяСтрока);

		Отказ = Истина;

	КонецЕсли;


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

Процедура ПолеВыбораКолонкиПриИзменении(Элемент = Неопределено)
	
	Если ПолеВыбораКолонки = Неопределено Тогда

		ЭлементыФормы.ЗначениеОбработки.ОграничениеТипа = Новый ОписаниеТипов;
		ЭлементыФормы.ЗначениеОбработки.Доступность = Ложь;

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

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

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

Процедура ПараметрыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	
	Элемент.Колонки.Имя.ЭлементУправления.ТолькоПросмотр = (Найти(Формула, "лПараметры." + Элемент.ТекущиеДанные.Имя) > 0);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ВставитьТекстВФормулу(Текст)
	ЭлементыФормы.Формула.ВыделенныйТекст = Текст;
	// Чтобы реквизит формы обновил свое значение
	ЭлементыФормы.Формула.Значение = ЭлементыФормы.Формула.Значение;
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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