Перем мОписаниеТиповКолонки;
Перем ТипИсточникаДанных;
Перем мПлатформа;
Перем ДлинаТекстаРассчитана;
Перем ВидимостьКолонокДляСоставногоТипа Экспорт;
Перем ТекущаяСтрокаИсточника;
Перем мСерверныеМетаданныеФормы;

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

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

Функция ОбновитьДанные(РежимОтладки = Ложь, ИзменятьФлагУчитыватьОтбор = Ложь)
	
	#Если Сервер И Не Сервер Тогда
		мПлатформа = Обработки.ирПлатформа.Создать();
	#КонецЕсли
	ОсновнойЭУ = ЭтаФорма.ЭлементыФормы.Значения;
	ПолноеИмяТаблицыБД = "";
	ЭтаФорма.Отбор = Неопределено;
	ЭтаФорма.ОтборПользовательский = Неопределено;
	ДлинаТекстаРассчитана = Ложь;
	ВыгрузкаРезультата = Неопределено;
	ИсточникДействий = ЭтаФорма.ВладелецФормы;
	Если ИсточникДействий = Неопределено Тогда
		ПолноеИмяТаблицыБД = ирОбщий.СтрокаБезПоследнегоФрагментаЛкс(ПараметрПолноеИмяКолонкиБД);
		ВыражениеПоляКолонки = ирОбщий.ПоследнийФрагментЛкс(ПараметрПолноеИмяКолонкиБД);
		ОписаниеПоляБД = ирОбщий.ПоляТаблицыБДЛкс(ПолноеИмяТаблицыБД).Найти(ВыражениеПоляКолонки, "Имя");
		мОписаниеТиповКолонки = ОписаниеПоляБД.ТипЗначения;
		ЭтаФорма.ПредставлениеКолонки = ОписаниеПоляБД.Заголовок;
	Иначе
		#Если Сервер И Не Сервер Тогда
			ИсточникДействий = Новый ТабличноеПоле;
		#КонецЕсли
		ПутьКДаннымКолонки = ирОбщий.ПутьКДаннымКолонкиТабличногоПоляЛкс(ИсточникДействий,, мСерверныеМетаданныеФормы);
		Если ТипЗнч(ИсточникДействий) = Тип("ТабличноеПоле") Тогда
			ЭтаФорма.ПредставлениеКолонки = ИсточникДействий.ТекущаяКолонка.ТекстШапки;
		Иначе
			ЭтаФорма.ПредставлениеКолонки = ИсточникДействий.ТекущийЭлемент.Заголовок;
		КонецЕсли; 
		Если Не ЗначениеЗаполнено(ПредставлениеКолонки) Тогда
			ЭтаФорма.ПредставлениеКолонки = ПутьКДаннымКолонки;
		КонецЕсли;
		ИмяКолонки = СтрЗаменить(ПутьКДаннымКолонки, ".", "_");
		ДанныеТабличногоПоля = Неопределено;
		ТипИсточникаДанных = ирОбщий.ОбщийТипДанныхТабличногоПоляЛкс(ИсточникДействий,,, ПолноеИмяТаблицыБД, ДанныеТабличногоПоля, мСерверныеМетаданныеФормы);
		Если ТипИсточникаДанных = "ТаблицаЗначений" Тогда 
			Если Истина
				И Форма <> Неопределено 
				И ТипЗнч(ИсточникДействий) = Тип("ТабличноеПоле")
			Тогда
				КомпоновкаТП = ирКлиент.КомпоновкаТабличногоПоляЛкс(Форма, ИсточникДействий);
				Если КомпоновкаТП <> Неопределено Тогда
					ВыгрузкаРезультата = КомпоновкаТП.ТаблицаЗначений.Скопировать();
					Если НастройкиСписка = Неопределено Тогда 
						НастройкиСписка = КомпоновкаТП.Компоновщик.Настройки;
						Если ИзменятьФлагУчитыватьОтбор Тогда
							УчитываяОтбор = КомпоновкаТП.ИспользоватьОтбор;
						КонецЕсли; 
					КонецЕсли; 
				КонецЕсли; 
			КонецЕсли; 
			Если НастройкиСписка <> Неопределено Тогда
				ЭтаФорма.Отбор = НастройкиСписка.Отбор;
				ЭтаФорма.ОтборПользовательский = ЭтаФорма.Отбор;
				Если Отбор.ДоступныеПоляОтбора.Элементы.Количество() = 0 Тогда
					ирКлиент.ТабличноеПолеСОтборомПросмотраОбновитьКомпоновщикЛкс(Форма, ИсточникДействий);
				КонецЕсли;
			КонецЕсли; 
		ИначеЕсли ТипИсточникаДанных = "ДеревоЗначений" Тогда 
			//
		Иначе
			Если ТипИсточникаДанных = "ТабличнаяЧасть" Тогда 
				ЭтаФорма.Отбор = ИсточникДействий.ОтборСтрок;
				ЭтаФорма.ОтборПользовательский = ЭтаФорма.Отбор;
				НастройкаОтбораТабличногоПоля = ИсточникДействий.НастройкаОтбораСтрок;
				Если ИмяКолонки = ирОбщий.ПеревестиСтроку("НомерСтроки") Тогда
					Возврат Ложь;
				КонецЕсли; 
				//Если ПодменыДанных <> Неопределено Тогда
				//	#Если Сервер И Не Сервер Тогда
				//		ПодменыДанных = Новый Структура;
				//	#КонецЕсли
				//	Если ПодменыДанных.Свойство(ИсточникДействий.Данные) Тогда
				//		ПодменыДанных[ИсточникДействий.Данные].Замена;
				//	КонецЕсли; 
				//КонецЕсли; 
			ИначеЕсли ТипИсточникаДанных = "НаборЗаписей" Тогда 
				ЭтаФорма.Отбор = ИсточникДействий.ОтборСтрок;
				ЭтаФорма.ОтборПользовательский = ЭтаФорма.Отбор;
				НастройкаОтбораТабличногоПоля = ИсточникДействий.НастройкаОтбораСтрок;
				Если ИмяКолонки = ирОбщий.ПеревестиСтроку("НомерСтроки") Тогда
					Возврат Ложь;
				КонецЕсли; 
			ИначеЕсли ТипИсточникаДанных = "Список" Тогда 
				Если Не ЗначениеЗаполнено(ПолноеИмяТаблицыБД) Тогда
					Возврат Ложь;
				КонецЕсли; 
				Если ТипЗнч(ИсточникДействий) = Тип("ТабличноеПоле") Тогда
					НастройкаОтбораТабличногоПоля = ИсточникДействий.НастройкаОтбора;
					Попытка
						НастройкаПорядкаТабличногоПоля = ИсточникДействий.НастройкаПорядка;
					Исключение
						// ПеречислениеСписок
						НастройкаПорядкаТабличногоПоля = Неопределено;
					КонецПопытки;
				КонецЕсли; 
				Если ДанныеТабличногоПоля <> Неопределено Тогда
					Если НастройкиСписка = Неопределено Тогда
						НастройкиСписка = ирОбщий.НастройкиДинамическогоСпискаЛкс(ДанныеТабличногоПоля);
					КонецЕсли; 
					НастройкиСпискаПользовательские = ирОбщий.НастройкиДинамическогоСпискаЛкс(ДанныеТабличногоПоля, "Пользовательские");
					ЭтаФорма.Отбор = НастройкиСписка.Отбор;
					ЭтаФорма.ОтборПользовательский = НастройкиСпискаПользовательские.Отбор;
				Иначе
					ВыгрузкаРезультата = ирКлиент.ДанныеСтрокДинамическогоСпискаЛкс(ИсточникДействий, ИсточникДействий.ВыделенныеСтроки, ИмяКолонки);
				КонецЕсли; 
			Иначе
				//Возврат Ложь;
			КонецЕсли;
		КонецЕсли;
		Если Истина
			И ТипЗнч(ИсточникДействий) = Тип("ТаблицаФормы") 
			И Отбор = Неопределено
		Тогда
			УчитываяОтбор = Ложь;
		КонецЕсли;
		Если ВыгрузкаРезультата = Неопределено Тогда
			СтруктураПолученияТекстовЯчеек = Новый Структура("Источник, Приемник", ИмяКолонки, ИмяКолонки + ирОбщий.СуффиксСлужебногоСвойстваЛкс());
			// Отбор здесь не учитываем, т.к. по текущей колонке мы его отключаем   
			ВыгрузкаРезультата = ирКлиент.ТаблицаИлиДеревоЗначенийИзТаблицыФормыСКоллекциейЛкс(ИсточникДействий,, УчитываяОтбор,, ?(УчитываяОформление, СтруктураПолученияТекстовЯчеек, Неопределено),,,,
				Истина,, ДанныеТабличногоПоля); 
			#Если Сервер И Не Сервер Тогда
				ВыгрузкаРезультата = Новый ТаблицаЗначений;
			#КонецЕсли
			Если УчитываяОформление И ВыгрузкаРезультата <> Неопределено Тогда
				ВыгрузкаРезультата.Колонки.Удалить(СтруктураПолученияТекстовЯчеек.Источник);
				ВыгрузкаРезультата.Колонки[СтруктураПолученияТекстовЯчеек.Приемник].Имя = СтруктураПолученияТекстовЯчеек.Источник;
			КонецЕсли; 
		КонецЕсли; 
		Если Отбор <> Неопределено Тогда
			Если ТипЗнч(Отбор) = Тип("Отбор") Тогда
				ЭлементОтбора = Отбор.Найти(ИмяКолонки);
				Если ЭлементОтбора = Неопределено Тогда
					// Такое возможно только в динамическом списке например для поля Родитель https://www.hostedredmine.com/issues/920674
					Построитель = Новый ПостроительЗапроса("ВЫБРАТЬ " + ИмяКолонки + " ИЗ " + ПолноеИмяТаблицыБД);
					Построитель.ЗаполнитьНастройки();
					Отбор = Построитель.Отбор;
					ЭлементОтбора = Отбор.Добавить(ИмяКолонки, ИмяКолонки);
				КонецЕсли; 
				ДоступноеПоле = ЭлементОтбора;
				//ВыражениеПоляКолонки = ЭлементОтбора.ПутьКДанным; // У ссылки списка перечисления обычной формы почему то всегда "Ref"
				ВыражениеПоляКолонки = ЭлементОтбора.Имя;
			Иначе
				#Если Сервер И Не Сервер Тогда
					Пустышка = Новый НастройкиКомпоновкиДанных;
					Отбор = Пустышка.Отбор;
				#КонецЕсли
				ЭлементОтбора = ирОбщий.НайтиДобавитьЭлементОтбораКомпоновкиЛкс(ОтборПользовательский, ПутьКДаннымКолонки,,,,, Ложь);
				ДоступноеПоле = ирОбщий.НайтиДоступноеПолеКомпоновкиПоИмениКолонкиЛкс(Отбор.ДоступныеПоляОтбора, ИмяКолонки);
				Если ДоступноеПоле = Неопределено Тогда
					ирОбщий.СообщитьЛкс(ирОбщий.СтрШаблонЛкс("Поле ""%1"" недоступно по функциональным опциям или праву ""Просмотр""", ИмяКолонки));
					Возврат Ложь;
				КонецЕсли; 
				ВыражениеПоляКолонки = "" + ДоступноеПоле.Поле;
			КонецЕсли; 
			мОписаниеТиповКолонки = ДоступноеПоле.ТипЗначения;
			Если ирОбщий.ТипТаблицыБДЛкс(ПолноеИмяТаблицыБД) = "Внешняя" Тогда
				мОписаниеТиповКолонки = Новый ОписаниеТипов(мОписаниеТиповКолонки, "NULL"); // Возвращаем тип NULL, т.к. компоновка его удаляет
			КонецЕсли; 
			ЭтаФорма.ВидСравненияТекущий = ЭлементОтбора.ВидСравнения;
			//СписокВыбора = ЭтаФорма.ЭлементыФормы.ВидСравненияНовый.СписокВыбора;
			//СписокВыбора.Очистить();
			//СписокВыбора.Добавить(ВидСравнения.ВСписке);
			//СписокВыбора.Добавить(ВидСравнения.ВСпискеПоИерархии);
			//СписокВыбора.Добавить(ВидСравнения.НеВСписке);
			//СписокВыбора.Добавить(ВидСравнения.НеВСпискеПоИерархии);
			////СтароеИспользование = ЭлементОтбора.Использование;
			////СтарыйВидСравнения = ЭлементОтбора.ВидСравнения;
			////ЭлементОтбора.Использование = Ложь;
			////Для Счетчик = 1 По СписокВыбора.Количество() Цикл
			////    Попытка
			////        ЭлементОтбора.ВидСравнения = ЭлементСписка.Значение;
			////    Исключение
			////        ЭлементСписка
			////    КонецПопытки;
			////КонецЦикла;
			////ЭлементОтбора.Использование = СтароеИспользование;
			////ЭлементОтбора.ВидСравнения = СтарыйВидСравнения;
		Иначе 
			ВыражениеПоляКолонки = ПутьКДаннымКолонки;
			мОписаниеТиповКолонки = ВыгрузкаРезультата.Колонки[ИмяКолонки].ТипЗначения;
		КонецЕсли; 
	КонецЕсли; 
	ЭлементыФормы.ВидСравненияНовый.Доступность = Отбор <> Неопределено;
	ЭлементыФормы.ОсновныеДействияФормы.Кнопки.ОК.Доступность = Отбор <> Неопределено;
	ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Применить.Доступность = Отбор <> Неопределено;
	ЭлементыФормы.ЗакрыватьПриВыборе.Доступность = Отбор <> Неопределено;
	ЭлементыФормы.Значения.Колонки.Пометка.ТолькоПросмотр = Ложь
		Или Отбор = Неопределено
		Или ЗапрещенМножественныйВыбор(); // Нельзя брать реквизит формы, т.к. он еще не готов
	ЭлементыФормы.Значения.Колонки.Пометка.Видимость = Отбор <> Неопределено;
	ЭлементыФормы.ДействияФормы.Кнопки.УстановитьФлажки.Доступность = Отбор <> Неопределено;
	ЭлементыФормы.ДействияФормы.Кнопки.СнятьФлажки.Доступность = Отбор <> Неопределено;
	ЭлементыФормы.УчитываяОтбор.Доступность = Отбор <> Неопределено;
	//ЭлементыФормы.НадписьВыбрано.Видимость = Не ЭлементыФормы.Значения.Колонки.Пометка.ТолькоПросмотр;
	//ЭлементыФормы.КоличествоВыбранных.Видимость = Не ЭлементыФормы.Значения.Колонки.Пометка.ТолькоПросмотр;
	//ЭлементыФормы.НадписьИз.Видимость = Не ЭлементыФормы.Значения.Колонки.Пометка.ТолькоПросмотр;
	//ЭлементыФормы.КоличествоВсего.Видимость = Не ЭлементыФормы.Значения.Колонки.Пометка.ТолькоПросмотр;
	ЭтоМоноТип = мОписаниеТиповКолонки.Типы().Количество() = 1;
	Если ЭтоМоноТип Тогда
		УстановитьМонотип(ирОбщий.ПредставлениеТипаЛкс(мОписаниеТиповКолонки.Типы()[0], мОписаниеТиповКолонки, Истина));
	КонецЕсли; 
	
	УстановитьТекущуюСтроку = Ложь;
	Если ОсновнойЭУ.ТекущаяСтрока <> Неопределено Тогда
		ТекущееЗначение = ОсновнойЭУ.ТекущаяСтрока.Значение;
		УстановитьТекущуюСтроку = Истина;
	КонецЕсли;
	МассивПомеченных = ОсновнойЭУ.Значение.Выгрузить(Новый Структура("Пометка", Истина)).ВыгрузитьКолонку("Значение");
	Если Истина
		И МассивПомеченных.Количество() = 0 
		И ЭлементОтбора <> Неопределено
		И ЭлементОтбора.Использование 
	Тогда
		Если Ложь
			Или ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке 
			Или ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии
		Тогда 
			МассивПомеченных = ЭлементОтбора.ПравоеЗначение.ВыгрузитьЗначения();
		ИначеЕсли ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно Тогда 
			МассивПомеченных.Добавить(ЭлементОтбора.ПравоеЗначение);
		ИначеЕсли Ложь
			Или ЭлементОтбора.ВидСравнения = ВидСравнения.ВСписке 
			Или ЭлементОтбора.ВидСравнения = ВидСравнения.ВСпискеПоИерархии
		Тогда 
			МассивПомеченных = ЭлементОтбора.Значение.ВыгрузитьЗначения();
		ИначеЕсли ЭлементОтбора.ВидСравнения = ВидСравнения.Равно Тогда 
			МассивПомеченных.Добавить(ЭлементОтбора.Значение);
		КонецЕсли; 
	КонецЕсли; 
	Если Не РежимОтладки Тогда
		ОсновнойЭУ.Значение.Очистить();
	КонецЕсли; 
	
	ЧисловойСуффикс = ирОбщий.СуффиксСлужебногоСвойстваЛкс();
	ИмяПоляГруппировки = "_Поле" + ЧисловойСуффикс;
	ИмяПоляКоличества = "_ИмяПоляКоличества"  + ЧисловойСуффикс;
	ИмяПоляЗначениеПредставление = "_ЗначениеПредставление" + ЧисловойСуффикс;
	ИмяПоляЗначениеТип = "_ЗначениеТип"  + ЧисловойСуффикс;
	ИмяПоляЗначениеЛиСсылка = "_ЗначениеЛиСсылка"  + ЧисловойСуффикс;
	КолонкиТЧ = ОсновнойЭУ.Значение.ВыгрузитьКолонки().Колонки;
	Если Ложь
		Или ВыгрузкаРезультата <> Неопределено
		//Или ТипИсточникаДанных = "НаборЗаписей"
		//Или ТипИсточникаДанных = "ТабличнаяЧасть"
		//Или ТипИсточникаДанных = "ТаблицаЗначений"
		//Или ТипИсточникаДанных = "ДеревоЗначений"
	Тогда
		НастройкаКомпоновки = Новый НастройкиКомпоновкиДанных;
		//ВыгрузкаРезультата.Индексы.Добавить(ИмяКолонки); // Судя по замерам не дает ускорения
		
		ВнешниеНаборыДанных = Новый Структура("Таблица", ВыгрузкаРезультата);
		СхемаКомпоновки = ирОбщий.СоздатьСхемуКомпоновкиПоТаблицамЗначенийЛкс(ВнешниеНаборыДанных,,,,, Истина);
		#Если Сервер И Не Сервер Тогда
			СхемаКомпоновки = Новый СхемаКомпоновкиДанных;
		#КонецЕсли
		
		ВычисляемоеПоле = СхемаКомпоновки.ВычисляемыеПоля.Добавить();
		ВычисляемоеПоле.Заголовок = "Количество";
		ВычисляемоеПоле.ПутьКДанным = ИмяПоляКоличества;
		ПолеИтога = СхемаКомпоновки.ПоляИтога.Добавить();
		ПолеИтога.ПутьКДанным = ИмяПоляКоличества;
		ПолеИтога.Выражение = "Сумма(1)";
		ирОбщий.НайтиДобавитьЭлементНастроекКомпоновкиПоПолюЛкс(НастройкаКомпоновки.Выбор, ИмяПоляКоличества);
		ирОбщий.НайтиДобавитьЭлементНастроекКомпоновкиПоПолюЛкс(НастройкаКомпоновки.Выбор, ИмяПоляКоличества + "." + ирОбщий.ПеревестиСтроку("ПроцентВГруппе"));
		
		Если ирКэш.НомерВерсииПлатформыЛкс() > 803000 Тогда
			ВычисляемоеПоле = СхемаКомпоновки.ВычисляемыеПоля.Добавить();
			ВычисляемоеПоле.Заголовок = "Тип значения";
			ВычисляемоеПоле.ПутьКДанным = ИмяПоляЗначениеТип;
			ПолеИтога = СхемаКомпоновки.ПоляИтога.Добавить();
			ПолеИтога.ПутьКДанным = ИмяПоляЗначениеТип;
			ПолеИтога.Выражение = "ТипЗначения(" + ИмяКолонки + ")";
			ирОбщий.НайтиДобавитьЭлементНастроекКомпоновкиПоПолюЛкс(НастройкаКомпоновки.Выбор, ИмяПоляЗначениеТип);
			ДобавитьТипЗначения = Ложь;
		Иначе
			ДобавитьТипЗначения = Истина;
		КонецЕсли; 
		
		Если Не ирКэш.ЛиПортативныйРежимЛкс() Тогда
			ВычисляемоеПоле = СхемаКомпоновки.ВычисляемыеПоля.Добавить();
			ВычисляемоеПоле.Заголовок = "Это ссылка БД";
			ВычисляемоеПоле.ПутьКДанным = ИмяПоляЗначениеЛиСсылка;
			ПолеИтога = СхемаКомпоновки.ПоляИтога.Добавить();
			ПолеИтога.ПутьКДанным = ИмяПоляЗначениеЛиСсылка;
			#Если Сервер И Не Сервер Тогда
				ирОбщий.ЛиСсылкаНаОбъектБДЛкс();
			#КонецЕсли
			ПолеИтога.Выражение = "ирОбщий.ЛиТипСсылкиБДЛкс(ТипЗначения(" + ИмяКолонки + "), Ложь)";
			ирОбщий.НайтиДобавитьЭлементНастроекКомпоновкиПоПолюЛкс(НастройкаКомпоновки.Выбор, ИмяПоляЗначениеЛиСсылка);
			ДобавитьЛиСсылка = Ложь;
		Иначе
			ДобавитьЛиСсылка = Истина;
		КонецЕсли; 

		//ВычисляемоеПоле = СхемаКомпоновки.ВычисляемыеПоля.Добавить();
		//ВычисляемоеПоле.Заголовок = "Значение представление";
		////ВычисляемоеПоле.Выражение = "Строка(" + ИмяКолонки + ")"; // Это будет одиночное событийное получение представления - ОЧЕНЬ МЕДЛЕННО
		//ВычисляемоеПоле.ПутьКДанным = ИмяПоляЗначениеПредставление;
		//ВычисляемоеПоле.ТипЗначения = Новый ОписаниеТипов("Строка");
		//ПолеИтога = СхемаКомпоновки.ПоляИтога.Добавить();
		//ПолеИтога.ПутьКДанным = ИмяПоляЗначениеПредставление;
		//ПолеИтога.Выражение = "Максимум(" + ИмяПоляЗначениеПредставление + ")";
		//ирОбщий.НайтиДобавитьЭлементНастроекКомпоновкиПоПолюЛкс(НастройкаКомпоновки.Выбор, ИмяПоляЗначениеПредставление);
		//Если ирОбщий.ЛиОписаниеТиповПростогоСсылочногоТипаЛкс(мОписаниеТиповКолонки) Тогда
		//	ирОбщий.НайтиДобавитьЭлементНастроекКомпоновкиПоПолюЛкс(НастройкаКомпоновки.Порядок, ИмяПоляЗначениеПредставление);
		////Иначе
		////	ирОбщий.НайтиДобавитьЭлементНастроекКомпоновкиПоПолюЛкс(НастройкаКомпоновки.Порядок, ДанныеКолонки); // Это сортировка по Тип+ИД ссылки
		//КонецЕсли; 
		
		ирОбщий.НайтиДобавитьЭлементСтруктурыГруппировкаКомпоновкиЛкс(НастройкаКомпоновки.Структура, ИмяКолонки);
		Если Отбор <> Неопределено Тогда
			ирОбщий.СкопироватьОтборЛюбойЛкс(НастройкаКомпоновки.Отбор, Отбор);
			ирОбщий.ОтключитьЭлементОтбораРавноЛкс(НастройкаКомпоновки.Отбор, ИмяКолонки);
			Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
			Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновки));
			Компоновщик.ЗагрузитьНастройки(НастройкаКомпоновки);
			Компоновщик.Восстановить();
			НастройкаКомпоновки = Компоновщик.Настройки;
		КонецЕсли; 
		ЭтаФорма.ОтборИсточникаБезТекущейКолонки = ирОбщий.ПредставлениеОтбораЛкс(НастройкаКомпоновки.Отбор);
		Если Не УчитываяОтбор Тогда
			НастройкаКомпоновки.Отбор.Элементы.Очистить();
		КонецЕсли;
		ирОбщий.СостояниеЛкс("Группировка таблицы");
		ТаблицаРезультата = ирОбщий.СкомпоноватьВКоллекциюЗначенийПоСхемеЛкс(СхемаКомпоновки, НастройкаКомпоновки,, ВнешниеНаборыДанных,,,,, РежимОтладки);
		#Если Сервер И Не Сервер Тогда
			ТаблицаРезультата = Новый ТаблицаЗначений;
		#КонецЕсли
		ирОбщий.СостояниеЛкс("");
		Если РежимОтладки Тогда
			Возврат Ложь;
		КонецЕсли; 
		ТаблицаРезультата.Колонки[ИмяКолонки].Имя = "Значение";
		ТаблицаРезультата.Колонки[ИмяПоляКоличества].Имя = "Количество";
		КолонкаВес = ТаблицаРезультата.Колонки[ИмяПоляКоличества + ирОбщий.ПеревестиСтроку("ПроцентВГруппе")];
		Если КолонкаВес <> Неопределено Тогда
			КолонкаВес.Имя = "Вес";
		Иначе
			// Антибаг платформы https://www.hostedredmine.com/issues/995783
		КонецЕсли;
		Если Не ДобавитьТипЗначения Тогда
			ТаблицаРезультата.Колонки[ИмяПоляЗначениеТип].Имя = "ТипЗначения";
		КонецЕсли; 
		Если Не ДобавитьЛиСсылка Тогда
			ТаблицаРезультата.Колонки[ИмяПоляЗначениеЛиСсылка].Имя = "ЛиСсылка";
		КонецЕсли; 
		Если Ложь
			Или ДобавитьЛиСсылка
			Или ДобавитьТипЗначения
		Тогда
			Если ДобавитьТипЗначения Тогда
				ТаблицаРезультата.Колонки.Добавить("ТипЗначения");
			КонецЕсли; 
			Если ДобавитьЛиСсылка Тогда
				ТаблицаРезультата.Колонки.Добавить("ЛиСсылка");
			КонецЕсли; 
			Для Каждого СтрокаРезультата Из ТаблицаРезультата Цикл
				СтрокаРезультата.ТипЗначения = ТипЗнч(СтрокаРезультата.Значение); 
				Если ДобавитьЛиСсылка Тогда
					СтрокаРезультата.ЛиСсылка = ирОбщий.ЛиТипСсылкиБДЛкс(СтрокаРезультата.ТипЗначения, Ложь); 
				КонецЕсли; 
			КонецЦикла;
		КонецЕсли; 
		ЭтоМоноТип = ЗаполнитьИменаТиповЗначений(ТаблицаРезультата);
		СтрокиСсылок = ТаблицаРезультата.НайтиСтроки(Новый Структура("ЛиСсылка", Истина));
		Если СтрокиСсылок.Количество() = 0 Тогда
			ТаблицаРезультата.Колонки.Добавить("ЗначениеПредставление");
			Для Каждого СтрокаРезультата Из ТаблицаРезультата Цикл
				СтрокаРезультата.ЗначениеПредставление = ирОбщий.РасширенноеПредставлениеЛкс(СтрокаРезультата.Значение,, Истина,, Ложь);
			КонецЦикла;
			ОсновнойЭУ.Значение.ЗагрузитьКолонку(ТаблицаРезультата.ВыгрузитьКолонку("ЗначениеПредставление"), "ЗначениеПредставление");
		Иначе
			// В самой компоновке не получилось быстро прочитать представления ссылок 
			СсылкиБД = ТаблицаРезультата.Скопировать(, "Значение, ЛиСсылка");
			СсылкиБД.Колонки.Добавить("Индекс", Новый ОписаниеТипов("Число"));
			Для Каждого СтрокаРезультата Из СсылкиБД.НайтиСтроки(Новый Структура("ЛиСсылка", Ложь)) Цикл
				СтрокаРезультата.Значение = ирОбщий.РасширенноеПредставлениеЛкс(СтрокаРезультата.Значение,, Истина,, Ложь);
			КонецЦикла;
			СсылкиБД = ирОбщий.СузитьТипыКолонокТаблицыБезПотериДанныхЛкс(СсылкиБД,,, Значения.ВыгрузитьКолонки().Колонки.ЗначениеПредставление.ТипЗначения.КвалификаторыСтроки.Длина);
			ирОбщий.НайтиДобавитьКолонкуНомераСтрокиЛкс(СсылкиБД, "НомерСтроки");
			Запрос = Новый Запрос;
			Запрос.Текст = "
			|ВЫБРАТЬ * ПОМЕСТИТЬ Т ИЗ &Т КАК Т;
			|ВЫБРАТЬ ПредставлениеСсылки(Значение) КАК ЗначениеПредставление 
			|ИЗ Т
			|УПОРЯДОЧИТЬ ПО НомерСтроки";
			Запрос.УстановитьПараметр("Т", СсылкиБД);
			ирОбщий.СостояниеЛкс("Получение представлений ссылок");
			// Выполняем на сервере для ускорения получения представлений с серверными обработчиками, которые платформа извлекает внутри метода Выгрузить() https://www.hostedredmine.com/issues/971259
			СсылкиБД = ирОбщий.ВыполнитьЗапросЛкс(Запрос.Текст, Запрос.Параметры,, ЭтаФорма,,, Ложь).ТаблицаРезультата;
			ОсновнойЭУ.Значение.ЗагрузитьКолонку(СсылкиБД.ВыгрузитьКолонку("ЗначениеПредставление"), "ЗначениеПредставление");
			ирОбщий.СостояниеЛкс("");
		КонецЕсли; 
		//Если КэшТипов.Количество() = 1 Тогда
		//	ЭтоМоноТип = Истина;
		//	УстановитьМонотип(ОсновнойЭУ.Значение[0].ИмяТипаЗначения);
		//КонецЕсли; 
		//КэшТипов = Неопределено;
		//Если Не ирОбщий.ЛиОписаниеТиповПростогоСсылочногоТипаЛкс(мОписаниеТиповКолонки) Тогда
		//	Если ирОбщий.ПредупреждениеПередСортировкойПоСсылочнымКолонкамЛкс("Значение", ОсновнойЭУ) Тогда 
		//		ОсновнойЭУ.Значение.Сортировать("Значение");
		//	КонецЕсли; 
		//КонецЕсли; 
		//ОсновнойЭУ.Значение.Сортировать("ИмяТипаЗначения, ЗначениеПредставление");
	Иначе
		КоличествоЗагружаем = 500000;
		// https://www.hostedredmine.com/issues/880651
		//Если ЗначениеЗаполнено(АдресСхемыКомпоновки) Тогда
		//	СхемаКомпоновкиСписка = ПолучитьИзВременногоХранилища(АдресСхемыКомпоновки);
		//	#Если Сервер И Не Сервер Тогда
		//		СхемаКомпоновкиСписка = Новый СхемаКомпоновкиДанных;
		//	#КонецЕсли
		//КонецЕсли; 
		ТекстГДЕ = "";
		ПолноеИмяПоляКолонки = ВыражениеПоляКолонки;
		КорневоеПолеКолонки = ирОбщий.ПервыйФрагментЛкс(ВыражениеПоляКолонки);
		СуффиксПоляТипЗначения = "_ТипЗначения_";
		ТипЗначенияГруппировки = Неопределено;
		ПутьКТаблице = " Т.";  // Начальный пробел используется для дальнейшей замены
		Если Истина
			И ирОбщий.СтрКончаетсяНаЛкс(ВыражениеПоляКолонки, СуффиксПоляТипЗначения)
			И ДоступноеПоле.ТипЗначения.СодержитТип(Тип("Тип"))
		Тогда
			КорневоеПолеКолонки = ирОбщий.СтрокаБезПоследнегоФрагментаЛкс(ВыражениеПоляКолонки, СуффиксПоляТипЗначения);
			ВыражениеПоляКолонки = "ТипЗначения(" + ПутьКТаблице + КорневоеПолеКолонки + ")";
			ТипЗначенияГруппировки = Новый ОписаниеТипов("Тип");
			ТекстГДЕ = ТекстГДЕ + ВыражениеПоляКолонки + " КАК " + ИмяКолонки;
		Иначе
			Если Истина
				И мОписаниеТиповКолонки.СодержитТип(Тип("Строка"))
				И мОписаниеТиповКолонки.КвалификаторыСтроки.Длина = 0
			Тогда
				ВыражениеПоляКолонки = "ВЫРАЗИТЬ(" + ПутьКТаблице + ВыражениеПоляКолонки + " КАК СТРОКА(100))";    
			Иначе
				ВыражениеПоляКолонки = ПутьКТаблице + ВыражениеПоляКолонки;
			КонецЕсли; 
			ТекстГДЕ = ТекстГДЕ + ВыражениеПоляКолонки + ".*";
		КонецЕсли;
		Если ЭтоМоноТип Тогда
			ТекстДопПолей = "";
			ТекстДопГруппировок = "";
		Иначе
			ТекстДопПолей = ", ТипЗначения(" + ВыражениеПоляКолонки + ") КАК ТипЗначения";
			ТекстДопГруппировок = ", ТипЗначения(" + ВыражениеПоляКолонки + ")";
		КонецЕсли;
		Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
		Запрос = ирКлиент.ЗапросДинамическогоСпискаЛкс(ИсточникДействий, ПолноеИмяТаблицыБД, УчитываяОтбор, КорневоеПолеКолонки, Компоновщик);
		Если Запрос = Неопределено Тогда
			// Например ИдентификаторСсылкиЛкс или поле из присоединенной таблицы
			Возврат Ложь;
		КонецЕсли;
		#Если Сервер И Не Сервер Тогда
			Запрос = Новый Запрос;
		#КонецЕсли
		Если Не ЗначениеЗаполнено(Запрос.Текст) Тогда
			ТекстИсточникаДанных = ПолноеИмяТаблицыБД;
			СтруктураПолей = Новый Структура;
			Если ирОбщий.ТипТаблицыБДЛкс(ПолноеИмяТаблицыБД) = "ДвиженияССубконто" Тогда
				Для Каждого ДоступноеПоле Из ирКэш.КомпоновщикТаблицыМетаданныхЛкс(ПолноеИмяТаблицыБД).Настройки.Отбор.ДоступныеПоляОтбора.Элементы Цикл 
					Если ДоступноеПоле.Папка Тогда
						Продолжить;
					КонецЕсли;
					СтруктураПолей.Вставить("" + ДоступноеПоле.Поле, ДоступноеПоле.ТипЗначения);
				КонецЦикла;
			Иначе
				ПоляТаблицыБД = ирКэш.ПоляТаблицыБДЛкс(ПолноеИмяТаблицыБД);
				Для Каждого ПолеТаблицыБД Из ПоляТаблицыБД Цикл
					Если ПолеТаблицыБД.ТипЗначения.СодержитТип(Тип("ТаблицаЗначений")) Тогда
						Продолжить;
					КонецЕсли;
					СтруктураПолей.Вставить(ПолеТаблицыБД.Имя, ПолеТаблицыБД.ТипЗначения);
				КонецЦикла;
			КонецЕсли;
			Для Каждого КлючИЗначение Из СтруктураПолей Цикл
				ИмяПоля = КлючИЗначение.Ключ;
				Если ТекстГДЕ <> "" Тогда
					ТекстГДЕ = ТекстГДЕ + ", ";
				КонецЕсли;
				Если ирОбщий.СтрокиРавныЛкс(ИмяПоля, КорневоеПолеКолонки) Тогда
					ВыражениеГруппировки = ВыражениеПоляКолонки;
					Если ТипЗначенияГруппировки = Неопределено Тогда
						ТипЗначенияГруппировки = КлючИЗначение.Значение;
					КонецЕсли; 
				КонецЕсли; 
				ВыражениеПоля = ПутьКТаблице + ИмяПоля;
				//ТекстГДЕ = ТекстГДЕ + ВыражениеПоля + ".* КАК " + ИмяПоля; // запрещенные имена например "Соединение" так вызывают ошибку
				ТекстГДЕ = ТекстГДЕ + ВыражениеПоля + ".*";
				Если КлючИЗначение.Значение.Типы().Количество() > 1 Тогда
					ТекстГДЕ = ТекстГДЕ + ", ТИПЗНАЧЕНИЯ( " + ПутьКТаблице + ИмяПоля + ") КАК " + ИмяПоля + СуффиксПоляТипЗначения;
				КонецЕсли; 
			КонецЦикла; 
			Если ТипЗначенияГруппировки = Неопределено Тогда
				// Например ВидДокумента в списке журнала документов табличного поля
				Возврат Ложь;
			КонецЕсли;
			Если ирОбщий.ТипТаблицыБДЛкс(ПолноеИмяТаблицыБД) = "ДвиженияССубконто" Тогда
				ТекстИсточникаДанных = ТекстИсточникаДанных + "(,, {" + СтрЗаменить(ТекстГДЕ, ПутьКТаблице, " ") + "})";
				ПолноеИмяТаблицыБД = ТекстИсточникаДанных;
				ТекстГДЕ = "1"; // Грязно. Лишний элемент отбора
			КонецЕсли;
		Иначе
			МассивТекстовЗапросов = ирОбщий.РазбитьГрубоТекстПакетногоЗапросаНаЗапросыЛкс(Запрос.Текст);
			ТекстПоследнегоЗапроса = МассивТекстовЗапросов[МассивТекстовЗапросов.ВГраница()];
			ТекстПоследнегоЗапроса = ирОбщий.СтрЗаменитьЛкс(ТекстПоследнегоЗапроса, "РАЗРЕШЕННЫЕ", "",, Ложь);
			ТекстПоследнегоЗапроса = "(" + ТекстПоследнегоЗапроса + ")"; 
			ТекстИсточникаДанных = ТекстПоследнегоЗапроса;
			ВыражениеГруппировки = ВыражениеПоляКолонки;
			ДоступноеПоле = Компоновщик.Настройки.ДоступныеПоляВыбора.НайтиПоле(Новый ПолеКомпоновкиДанных(ПолноеИмяПоляКолонки));
			ТипЗначенияГруппировки = ДоступноеПоле.Тип;
		КонецЕсли;
		ИмяСлужебногоПоляКоличество = "Количество62849";
		Если Не ЗначениеЗаполнено(ТекстДопПолей) Тогда
			ТекстДопПолей = ", 1 КАК ТипЗначения";
		КонецЕсли; 
		ТекстЗапроса = "
		|ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|    " + ВыражениеГруппировки + " КАК Значение,
		|    ПРЕДСТАВЛЕНИЕ(" + ВыражениеГруппировки + ") КАК ЗначениеПредставление,
		|    ВЫРАЗИТЬ(100*КОЛИЧЕСТВО(*)/&ОбщееКоличество КАК ЧИСЛО(5,2)) КАК Вес,
		|    КОЛИЧЕСТВО(*) КАК " + ИмяСлужебногоПоляКоличество + ТекстДопПолей + "
		|{ВЫБРАТЬ
		|    " + ИмяСлужебногоПоляКоличество + "}
		|ИЗ
		|    " + ТекстИсточникаДанных + " КАК Т
		|{ГДЕ " + ТекстГДЕ + "}
		|СГРУППИРОВАТЬ ПО
		|    " + ВыражениеГруппировки + ", ПРЕДСТАВЛЕНИЕ(" + ВыражениеГруппировки + ")" + ТекстДопГруппировок + "
		|УПОРЯДОЧИТЬ ПО
		|    Значение";
		Если ТипЗначенияГруппировки.СодержитТип(Тип("УникальныйИдентификатор")) Тогда
			// http://www.hostedredmine.com/issues/879270
			ТекстЗапроса = ирОбщий.СтрЗаменитьЛкс(ТекстЗапроса, "ПРЕДСТАВЛЕНИЕ(" + ВыражениеГруппировки + ")", ВыражениеГруппировки);
		КонецЕсли; 
		Если МассивТекстовЗапросов <> Неопределено Тогда
			МассивТекстовЗапросов[МассивТекстовЗапросов.ВГраница()] = ТекстЗапроса;
			ТекстЗапроса = ирОбщий.СтрСоединитьЛкс(МассивТекстовЗапросов, Символы.ПС + ";" + Символы.ПС);
		КонецЕсли;
		Запрос.Текст = ТекстЗапроса;
		СхемаКомпоновки = ирОбщий.СоздатьСхемуКомпоновкиПоЗапросуЛкс(Запрос,,, Ложь);
		КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
		КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновки));
		НастройкаКомпоновки = КомпоновщикНастроек.Настройки;
		Для Каждого ДоступноеПоле Из КомпоновщикНастроек.Настройки.ДоступныеПоляВыбора.Элементы Цикл
			Если Не ДоступноеПоле.Папка Тогда
				ирОбщий.НайтиДобавитьЭлементНастроекКомпоновкиПоПолюЛкс(НастройкаКомпоновки.Выбор, ДоступноеПоле.Поле);
			КонецЕсли; 
		КонецЦикла;
		Если Отбор <> Неопределено Тогда
			ирОбщий.СкопироватьОтборЛюбойЛкс(НастройкаКомпоновки.Отбор, Отбор);
		КонецЕсли;
		ирОбщий.ОтключитьЭлементОтбораРавноЛкс(НастройкаКомпоновки.Отбор, ПолноеИмяПоляКолонки);
		ЭтаФорма.ОтборИсточникаБезТекущейКолонки = ирОбщий.ПредставлениеОтбораЛкс(НастройкаКомпоновки.Отбор);
		Если Не УчитываяОтбор Тогда
			НастройкаКомпоновки.Отбор.Элементы.Очистить();
		КонецЕсли;
		Попытка
			ОбщееКоличество = ирОбщий.КоличествоСтрокВТаблицеБДЛкс(ПолноеИмяТаблицыБД, НастройкаКомпоновки.Отбор);
		Исключение
			// Отбор наложен на присоединенные поля
			ОбщееКоличество = 100000000000;
		КонецПопытки;
		Если ТекстИсточникаДанных <> ПолноеИмяТаблицыБД Тогда
			НастройкаКомпоновки.Отбор.Элементы.Очистить();
		КонецЕсли;
		НастройкаКомпоновки.ПараметрыДанных.УстановитьЗначениеПараметра("ОбщееКоличество", ОбщееКоличество);
		//Отладить(Запрос);
		Запрос = ирОбщий.ЗапросИзКомпоновкиЛкс(СхемаКомпоновки, НастройкаКомпоновки);
		#Если Сервер И Не Сервер Тогда
			Запрос = Новый Запрос;
		#КонецЕсли
		Запрос.Текст = Запрос.Текст + "
		|АВТОУПОРЯДОЧИВАНИЕ";
		Если РежимОтладки Тогда
			ирКлиент.ПредложитьЗакрытьМодальнуюФормуЛкс(ЭтаФорма);
			ирОбщий.ОтладитьЛкс(Запрос);
			Возврат Истина;
		КонецЕсли;
		// Выполняем на сервере для ускорения получения представлений с серверными обработчиками, которые платформа извлекает внутри метода Выгрузить() https://www.hostedredmine.com/issues/971259
		ВыгрузкаРезультата = ирОбщий.ВыполнитьЗапросЛкс(Запрос.Текст, Запрос.Параметры,, ЭтаФорма,,, ирКэш.ПараметрыЗаписиОбъектовЛкс().ОбъектыНаСервере,,, Истина).ТаблицаРезультата;
		КоличествоВсего = ВыгрузкаРезультата.Количество();
		Если КоличествоВсего > КоличествоЗагружаем Тогда
			ТекстИнтерфейса = "Количество различных значений составляет " + XMLСтрока(КоличествоВсего) + ", но отображены будут только " + XMLСтрока(КоличествоЗагружаем);
			Предупреждение(ТекстИнтерфейса);
			Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоличествоЗагружаем);
			Для Счетчик = 1 По КоличествоЗагружаем Цикл
				ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
				СтрокаРезультата = ВыгрузкаРезультата[Счетчик - 1];
				НоваяСтрока = ОсновнойЭУ.Значение.Добавить();
				ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаРезультата);
				НоваяСтрока.Количество = СтрокаРезультата[ИмяСлужебногоПоляКоличество];
				Счетчик = Счетчик + 1;
			КонецЦикла;
			ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
		Иначе
			ВыгрузкаРезультата.Колонки[ИмяСлужебногоПоляКоличество].Имя = "Количество";
			ЭтоМоноТип = ЗаполнитьИменаТиповЗначений(ВыгрузкаРезультата);
		КонецЕсли;
	КонецЕсли;
	ЭлементыФормы.НадписьТип.Видимость = ЭтоМоноТип;
	ЭлементыФормы.ПредставлениеТипаЗначения.Видимость = ЭтоМоноТип;    
	ОсновнойЭУ.Колонки.ТипЗначения.ИзменятьВидимость = Не ЭтоМоноТип;
	ОсновнойЭУ.Колонки.ИмяТипаЗначения.ИзменятьВидимость = Не ЭтоМоноТип;
	Если Не Открыта() Тогда
		ОсновнойЭУ.Колонки.ТипЗначения.Видимость = Не ЭтоМоноТип;
		ОсновнойЭУ.Колонки.ИмяТипаЗначения.Видимость = Не ЭтоМоноТип;
	КонецЕсли;
	ЭлементыФормы.ДействияФормы.Кнопки.РазличныеТипЗначений.Доступность = Не ЭтоМоноТип;
	ЭлементыФормы.ПредставлениеТипаЗначения.КнопкаОткрытия = Найти(ИмяТипаЗначения, ".") > 0;
	//УстановитьМонотип(ИмяТипаЗначения);
	ЭлементыФормы.ИскатьПоВсемПолямПоиска.Видимость = Найти(ИмяТипаЗначения, ".") > 0;
	Если Отбор <> Неопределено Тогда
		Если Ложь
			Или ЭлементОтбора.ВидСравнения = ВидСравнения.НеРавно 
			Или ЭлементОтбора.ВидСравнения = ВидСравнения.НеВСписке 
		Тогда
			Если ЭтоБулеваКолонка() Или ЭтоУИДКолонкаСписка() Тогда
				ЭтаФорма.ВидСравненияНовый = ВидСравнения.НеРавно;
			ИначеЕсли ЭтоНеограниченнаяСтроковаяКолонка() Тогда
				ЭтаФорма.ВидСравненияНовый = ВидСравнения.НеСодержит;
			Иначе
				ЭтаФорма.ВидСравненияНовый = ВидСравнения.НеВСписке;
			КонецЕсли; 
		ИначеЕсли Ложь
			Или ЭлементОтбора.ВидСравнения = ВидСравнения.Равно 
			Или ЭлементОтбора.ВидСравнения = ВидСравнения.ВСписке 
		Тогда
			Если ЭтоБулеваКолонка() Или ЭтоУИДКолонкаСписка() Тогда
				ЭтаФорма.ВидСравненияНовый = ВидСравнения.Равно;
			ИначеЕсли ЭтоНеограниченнаяСтроковаяКолонка() Тогда
				ЭтаФорма.ВидСравненияНовый = ВидСравнения.Содержит;
			Иначе
				ЭтаФорма.ВидСравненияНовый = ВидСравнения.ВСписке;
			КонецЕсли; 
		ИначеЕсли Ложь
			Или ЭлементОтбора.ВидСравнения = ВидСравнения.НеВИерархии 
			Или ЭлементОтбора.ВидСравнения = ВидСравнения.НеВСпискеПоИерархии 
		Тогда
			ЭтаФорма.ВидСравненияНовый = ВидСравнения.НеВСпискеПоИерархии;
		ИначеЕсли Ложь
			Или ЭлементОтбора.ВидСравнения = ВидСравнения.ВИерархии 
			Или ЭлементОтбора.ВидСравнения = ВидСравнения.ВСпискеПоИерархии 
		Тогда
			ЭтаФорма.ВидСравненияНовый = ВидСравнения.ВСпискеПоИерархии;
		Иначе
			Если ЭтоБулеваКолонка() Или ЭтоУИДКолонкаСписка() Тогда
				ЭтаФорма.ВидСравненияНовый = ВидСравнения.Равно;
			ИначеЕсли ЭтоНеограниченнаяСтроковаяКолонка() Тогда
				ЭтаФорма.ВидСравненияНовый = ВидСравнения.Содержит;
			Иначе
				ЭтаФорма.ВидСравненияНовый = ВидСравнения.ВСписке;
			КонецЕсли; 
		КонецЕсли;
		Если ТипЗнч(ЭлементОтбора) = Тип("ЭлементОтбора") Тогда
			ЗначениеОтбора = ЭлементОтбора.Значение;
		Иначе
			ЗначениеОтбора = ЭлементОтбора.ПравоеЗначение;
		КонецЕсли; 
		Если Истина
			И МассивПомеченных.Количество() = 0
			И ЭлементОтбора.Использование 
		Тогда
			МассивПомеченных = Новый Массив;
			Если Ложь
				Или ЭлементОтбора.ВидСравнения = ВидСравнения.НеРавно 
				Или ЭлементОтбора.ВидСравнения = ВидСравнения.НеВИерархии 
				Тогда
				МассивПомеченных.Добавить(ЗначениеОтбора);
			ИначеЕсли Ложь
				Или ЭлементОтбора.ВидСравнения = ВидСравнения.Равно 
				Или ЭлементОтбора.ВидСравнения = ВидСравнения.ВИерархии 
			Тогда
				МассивПомеченных.Добавить(ЗначениеОтбора);
			ИначеЕсли Ложь
				Или ЭлементОтбора.ВидСравнения = ВидСравнения.НеВСписке 
				Или ЭлементОтбора.ВидСравнения = ВидСравнения.НеВСпискеПоИерархии 
			Тогда
				Для Каждого ЭлементСписка Из ЗначениеОтбора Цикл
					МассивПомеченных.Добавить(ЭлементСписка.Значение);
				КонецЦикла;
			ИначеЕсли Ложь
				Или ЭлементОтбора.ВидСравнения = ВидСравнения.ВСписке 
				Или ЭлементОтбора.ВидСравнения = ВидСравнения.ВСпискеПоИерархии 
			Тогда
				Для Каждого ЭлементСписка Из ЗначениеОтбора Цикл
					МассивПомеченных.Добавить(ЭлементСписка.Значение);
				КонецЦикла;
			КонецЕсли;
		КонецЕсли;
		// Дополняем список несуществующими в нем, но существующими в отборе значениями
		Для Каждого Значение Из МассивПомеченных Цикл
			СтрокаЗначения = ОсновнойЭУ.Значение.Найти(Значение, "Значение");
			Если СтрокаЗначения = Неопределено Тогда
				СтрокаЗначения = ОсновнойЭУ.Значение.Добавить();
				СтрокаЗначения.Значение = Значение;
				СтрокаЗначения.ЗначениеПредставление = "" + Значение;
				СтрокаРасшЗначения = ЗначенияРасширенные.Добавить();
				СтрокаРасшЗначения.Значение = Значение;
			КонецЕсли;
			СтрокаЗначения.Пометка = Истина;
		КонецЦикла;
	КонецЕсли;
	ИмяОбщегоМоноТипа = ирОбщий.ПервыйФрагментЛкс(ИмяТипаЗначения, "(");
	ЭлементыФормы.Значения.Колонки.ДлинаТекста.ИзменятьВидимость = Истина
		И ИмяОбщегоМоноТипа <> "Число"
		И ИмяОбщегоМоноТипа <> "Дата"
		И ИмяОбщегоМоноТипа <> "Булево";
	Если ИсточникДействий <> Неопределено Тогда
		Если УстановитьТекущуюСтроку Тогда
			УстановитьТекущуюСтроку = Не АктивироватьЗначение(ИсточникДействий, КолонкиТЧ, ОсновнойЭУ, ТекущееЗначение, ЭтоМоноТип);
		Иначе
			УстановитьТекущуюСтроку = Истина;
		КонецЕсли; 
		Если УстановитьТекущуюСтроку Тогда 
			Если ИсточникДействий.ТекущаяСтрока <> Неопределено Тогда
				Если УчитываяОформление Тогда
					ТекущееЗначение = ИсточникДействий.ОформлениеСтроки(ИсточникДействий.ТекущаяСтрока).Ячейки[ИмяКолонки].Текст;
				Иначе
					Попытка
						ТекущееЗначение = ИсточникДействий.ТекущиеДанные[ИмяКолонки];
						УстановитьТекущуюСтроку = Истина;
					Исключение
						// Например ДатаИзменения в форме списка архива. Не смог понять, почему ее нет 
						ТекущееЗначение = Неопределено;
					КонецПопытки;
				КонецЕсли; 
			КонецЕсли;
			АктивироватьЗначение(ИсточникДействий, КолонкиТЧ, ОсновнойЭУ, ТекущееЗначение, ЭтоМоноТип);
		КонецЕсли;
	КонецЕсли;
	Возврат Истина;
	
КонецФункции  

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

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

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

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

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

Процедура УстановитьМонотип(ИмяМоноТипа)
	ЭтаФорма.ИмяТипаЗначения = ИмяМоноТипа;
	ЭтаФорма.ПредставлениеТипаЗначения =  СтрЗаменить(ИмяМоноТипа, "Ссылка" + ".", "."); // Здесь переводить фрагмент "Ссылка" не нужно;
КонецПроцедуры

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

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

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

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

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

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

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

Процедура ПрименитьФильтрТаблицыИсточникаОтложенно() Экспорт
	ИсточникДействий = ЭтаФорма.ВладелецФормы; // ТаблицаФормы
	ИсточникДействий.ТекущаяСтрока = ТекущаяСтрокаИсточника;
	ирКлиент.ОтправитьНажатияКлавишЛкс("%F");
	ирКлиент.ОтправитьНажатияКлавишЛкс("{ENTER}");
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

Функция ЗапрещенМножественныйВыбор()
	Возврат Ложь
		Или ЭтоБулеваКолонка()
		Или ЭтоНеограниченнаяСтроковаяКолонка()
		Или ЭтоУИДКолонкаСписка()
	;
КонецФункции

Функция ЭтоБулеваКолонка()
	
	#Если Сервер И Не Сервер Тогда
		мОписаниеТиповКолонки = Новый ОписаниеТипов;
	#КонецЕсли
	Возврат Истина
		И мОписаниеТиповКолонки.Типы().Количество() = 1
		И мОписаниеТиповКолонки.СодержитТип(Тип("Булево"));

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

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

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

Функция ЭтоУИДКолонкаСписка()
	
	Возврат ТипИсточникаДанных = "Список" И мОписаниеТиповКолонки.СодержитТип(Тип("УникальныйИдентификатор"));

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ФильтрПоПодстрокеОчистка(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	Элемент.Значение = ""; // Меняем Неопределено на пустую строку
	ПрименитьФильтрПоПодстрокеБезСохранения();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ДействияФормыПоУбываниюКоличества(Кнопка)
	
	НовыйПорядок = "Количество Убыв";
	Значения.Сортировать(НовыйПорядок);
	ЗначенияРасширенные.Сортировать(НовыйПорядок);
	ЭлементыФормы.Значения.ТекущаяСтрока = Значения[0];
	
КонецПроцедуры

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

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

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

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