Перем ИмяТаблицыДинамСписка;

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

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

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

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

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

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

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

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

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

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

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

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

Процедура БезОформленияПриИзменении(Элемент)
	
	НастроитьЭлементыФормы();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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