&НаКлиенте
Перем мСвязанныйРедакторОбъектаБД;

#Если Не ВебКлиент И Не ТонкийКлиент И Не МобильныйКлиент Тогда

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

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

Процедура ОбновитьБыстрыеОтборыНаСервере()

	Элементы.ДинамическийСписок.СоздатьЭлементыФормыПользовательскихНастроек(Элементы.ГруппаБыстрыеОтборы,, 1);
	Если ЗначениеЗаполнено(фОбъект.ПолноеИмяТаблицы) Тогда
		УстановитьВидимостьНастроек(Элементы.ГруппаБыстрыеОтборы);
		// Антибаг платформы 8.3.18 https://www.hostedredmine.com/issues/956376
		Элементы.ГруппаБыстрыеОтборы.ОтображатьЗаголовок = Элементы.ГруппаБыстрыеОтборы.ПодчиненныеЭлементы.Количество() = 1;
	КонецЕсли;

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

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

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

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

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

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

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

&НаКлиенте
Процедура ПолеБыстрогоОтбораАтрибутПриИзменении(Элемент)
	ПроверитьЗапомнитьОтбор();
КонецПроцедуры

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

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

Процедура ДобавитьСоединяемыйРегистрНакопления(Знач МетаРегистр, Знач СоединенныеРегистры)
	
	СтрокаРегистра = СоединяемыеРегистры.Добавить();
	СтрокаРегистра.Имя = МетаРегистр.Имя;
	СтрокаРегистра.ПолноеИмя = МетаРегистр.ПолноеИмя() + ".Остатки";
	СтрокаРегистра.Представление = МетаРегистр.Синоним + " (остатки)";
	СтрокаРегистра.Соединить = СоединенныеРегистры.Найти(СтрокаРегистра.ПолноеИмя) <> Неопределено;

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

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

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

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

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

// Начало СтандартныеПодсистемы.ПодключаемыеКоманды

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

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

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

// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

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

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

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

&НаКлиенте
Процедура ОбновитьПодменюПоследнихОтборов()
	
	#Если Сервер И Не Сервер Тогда
		ПоследниеОтборыНажатие();
	#КонецЕсли
	Если Элементы.ПоследниеОтборы.Видимость Тогда 
		ирКлиент.ПоследниеВыбранныеЗаполнитьПодменюЛкс(ЭтаФорма, Элементы.ПоследниеОтборы, фОбъект.ПолноеИмяТаблицы, , "Отборы");
	КонецЕсли;
	//ОбновитьБыстрыеОтборыНаСервере();
	УстановитьТекущуюКолонку(); // Антибаг платформы 8.3.23 https://www.hostedredmine.com/issues/956731

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

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

//.
// Параметры:
//    ЭтаФорма - ФормаКлиентскогоПриложения - 
&НаКлиентеНаСервереБезКонтекста
Процедура ЗаполнитьНастройкиКолонок(ЭтаФорма) Экспорт
	ЗаполнитьНастройкиКолонокГруппы(ЭтаФорма, ЭтаФорма.Элементы.ДинамическийСписок);
КонецПроцедуры

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

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

// Реальная директива здесь - &НаКлиентеНаСервереБезКонтекста, остальные директивы нужны для контекстной подсказки по параметру ЭтаФорма
#Если Сервер И Не Сервер Тогда
	&НаСервере
#Иначе
	&НаКлиентеНаСервереБезКонтекста
#КонецЕсли
Функция ИмяКолонкиБезРодителя(Знач ЭтаФорма, Знач Колонка = Неопределено)
	
	Если Колонка = Неопределено Тогда
		Колонка = ЭтаФорма.Элементы.ДинамическийСписок.ТекущийЭлемент;
	КонецЕсли;
	Возврат Сред(Колонка.Имя, СтрДлина(ЭтаФорма.Элементы.ДинамическийСписок.Имя) + 1);
	
КонецФункции

Процедура ЗагрузитьНастройкиТаблицы()
	
	ЭтаФорма.ДинамическийСписок.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(Новый ПользовательскиеНастройкиКомпоновкиДанных);
	СтруктураНастроек = ирОбщий.ВосстановитьЗначениеЛкс("ДинамическийСписок." + фОбъект.ПолноеИмяТаблицы + "." + РежимВыбора);
	Если СтруктураНастроек = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Если ТипЗнч(СтруктураНастроек) = Тип("Структура") Тогда
		#Если Сервер И Не Сервер Тогда
			СтруктураНастроек = Новый Структура;
		#КонецЕсли
		ЗагрузитьНастройкиКолонок(ЭтаФорма, СтруктураНастроек.НастройкиКолонок);
		Если СтруктураНастроек.Свойство("ПользовательскиеНастройки") Тогда
			// Антибаг платформы 8.3. Отключим некорректные элементы отбора https://www.hostedredmine.com/issues/947618
			Для Каждого ЭлементНастроек Из СтруктураНастроек.ПользовательскиеНастройки.Элементы Цикл
				Если ТипЗнч(ЭлементНастроек) = Тип("ОтборКомпоновкиДанных") Тогда
					Для Каждого ЭлементОтбора Из ЭлементНастроек.Элементы Цикл
						Если ТипЗнч(ЭлементОтбора) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
							Если ЭтаФорма.ДинамическийСписок.КомпоновщикНастроек.Настройки.ДоступныеПоляОтбора.НайтиПоле(ЭлементОтбора.ЛевоеЗначение) = Неопределено Тогда
								ЭлементОтбора.Использование = Ложь; 
							КонецЕсли;
						КонецЕсли;
					КонецЦикла;
				КонецЕсли;
				Если ТипЗнч(ЭлементНастроек) = Тип("Порядок") Тогда
					Для Каждого ЭлементПорядка Из ЭлементНастроек.Элементы Цикл
						Если ТипЗнч(ЭлементПорядка) = Тип("ЭлементПорядкаКомпоновкиДанных") Тогда
							Если ЭтаФорма.ДинамическийСписок.КомпоновщикНастроек.Настройки.ДоступныеПоляПорядка.НайтиПоле(ЭлементПорядка.Поле) = Неопределено Тогда
								ЭлементПорядка.Использование = Ложь; 
							КонецЕсли;
						КонецЕсли;
					КонецЦикла;
				КонецЕсли;
			КонецЦикла;
			ЭтаФорма.ДинамическийСписок.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(СтруктураНастроек.ПользовательскиеНастройки);
		КонецЕсли; 
		Если СтруктураНастроек.Свойство("ТекущаяСтрока") Тогда
			ТипТаблицы = ирОбщий.ТипТаблицыБДЛкс(фОбъект.ПолноеИмяТаблицы);
			Если Истина
				И ирОбщий.ЛиКорневойТипСсылкиЛкс(ТипТаблицы)
				И Не ирОбщий.ЛиКорневойТипДокументаЛкс(ТипТаблицы)
				И Не ирОбщий.ЛиКорневойТипБизнесПроцессаЛкс(ТипТаблицы)
				И Не ТипТаблицы = "Задача"
				И (Ложь
					Или Не ирОбщий.ЛиМетаданныеИерархическогоОбъектаЛкс(ирОбщий.ОбъектМДПоПолномуИмениТаблицыБДЛкс(фОбъект.ПолноеИмяТаблицы))
					Или Не СтруктураНастроек.ИерархическийПросмотр)
			Тогда     
				Элементы.ДинамическийСписок.ТекущаяСтрока = СтруктураНастроек.ТекущаяСтрока;
			КонецЕсли;
		КонецЕсли; 
		Если СтруктураНастроек.Свойство("ИерархическийПросмотр") И СтруктураНастроек.ИерархическийПросмотр Тогда 
			Элементы.ДинамическийСписок.Отображение = ОтображениеТаблицы.ИерархическийСписок;
		Иначе
			Элементы.ДинамическийСписок.Отображение = ОтображениеТаблицы.Список;
		КонецЕсли;
	КонецЕсли; 
	ПрименитьНастройкиКолонокНаСервере();
	// Чтобы появилась команда ALT+F "Расширенный поиск"
	Элементы.ДинамическийСписок.Видимость = Ложь;
	Элементы.ДинамическийСписок.Видимость = Истина;
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура НайтиСсылкуВСписке(КлючСтроки, УстановитьОбъектМетаданных = Истина) Экспорт

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

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

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

&НаКлиенте
Функция ПараметрыВыбораОбъектаМетаданных()
	Возврат ирКлиент.ПараметрыВыбораОбъектаМетаданныхЛкс(Истина, Истина, Истина, Истина,, Истина, Истина, Истина,,, Истина,,, Истина,,,,,, Истина);
КонецФункции

&НаКлиенте
Процедура ОбъектОбъектМетаданныхНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	ирКлиент.ОбъектМетаданныхНачалоВыбораЛкс(Элемент, ПараметрыВыбораОбъектаМетаданных(), СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбъектМетаданныхОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)

	#Если ТолстыйКлиентОбычноеПриложение Тогда
	// Антибаг платформы. Выпадающий список перекрывает открытую модально форму выбора метаданных https://www.hostedredmine.com/issues/956563
	Если Элемент.СписокВыбора.Количество() > 0 Тогда
		ирКлиент.ОтправитьНажатияКлавишЛкс("{Esc}");
	КонецЕсли;
	#КонецЕсли
	ирКлиент.ОбъектМетаданныхОкончаниеВводаТекстаЛкс(Элемент, ПараметрыВыбораОбъектаМетаданных(), Текст, ДанныеВыбора, СтандартнаяОбработка);

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

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

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

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

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

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

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

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

&НаСервере
Функция ПоляСИсториейВыбора()
	
	Возврат Элементы.ПолноеИмяТаблицы;

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

&НаСервереБезКонтекста
Процедура ДинамическийСписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
	
	#Если Сервер И Не Сервер Тогда
	    Настройки = Новый НастройкиКомпоновкиДанных;
	#КонецЕсли 
	Если Не Настройки.ДополнительныеСвойства.Свойство("АдресПараметровВывода") Тогда
		Возврат;
	КонецЕсли;
	ПараметрыВывода = ПолучитьИзВременногоХранилища(Настройки.ДополнительныеСвойства.АдресПараметровВывода);
	ПолноеИмяТаблицы = ПараметрыВывода.ИмяТаблицы;
	Если Не ЗначениеЗаполнено(ПолноеИмяТаблицы) Тогда
		Возврат;
	КонецЕсли;
	ИмяПоляСсылка = ирОбщий.ПеревестиСтроку("Ссылка");
	РасширенноеПредставлениеХранилищЗначений = Ложь;
	РасширенныеКолонки = Неопределено;
	ИменаКолонокСПиктограммамиТипов = Неопределено;
	КолонкиТаблицы = Настройки.Выбор.Элементы;
	ВариантОтображенияИдентификаторов = ПараметрыВывода.ОтображениеИдентификаторов;
	СостоянияКнопки = ирОбщий.СостоянияКнопкиОтображатьПустыеИИдентификаторыЛкс();
	ЛиОтбражатьПустые = Ложь
		Или ВариантОтображенияИдентификаторов = СостоянияКнопки[1]
		Или ВариантОтображенияИдентификаторов = СостоянияКнопки[2];
	ОтображатьИдентификаторы = Ложь
			Или ВариантОтображенияИдентификаторов = СостоянияКнопки[2];
	ирПлатформа = ирКэш.Получить();
	#Если Сервер И Не Сервер Тогда
	    ирПлатформа = Обработки.ирПлатформа.Создать();
	#КонецЕсли
	Если ТипЗнч(ИменаКолонокСПиктограммамиТипов) = Тип("Строка") Тогда
		ИменаКолонокСПиктограммамиТипов = ирОбщий.СтрРазделитьЛкс(ИменаКолонокСПиктограммамиТипов, ",", Истина); 
	КонецЕсли; 
	ЗначениеНедоступногоПоля = ирСервер.ЗначениеНедоступногоПоляЛкс();
	ЦветФонаПустогоЗначения = ирОбщий.ЦветФонаПустогоЗначенияЛкс();
	ЦветТекстаПустогоЗначения = ирОбщий.ЦветТекстаПустогоЗначенияЛкс();
	ЦветФонаТекущегоЗначения = ирОбщий.ЦветФонаТекущегоЗначенияЛкс();
	ПрименятьРежимОтображения = Истина; 
	ФорматКолонки = "";
	ЗначенияНизкойВажности = Новый Массив;
	ЗначенияНизкойВажности.Добавить(0);
	ЗначенияНизкойВажности.Добавить(ЗначениеНедоступногоПоля);
	ЗначенияНизкойВажности.Добавить(Тип("Неопределено"));
	ЗначенияНизкойВажности.Добавить(Null);
	ЗначенияНизкойВажности.Добавить(Тип("Null"));
	КолонкиВРежимеПароля = ирОбщий.ИменаПолейТаблицыБДВРежимеПароляЛкс(ПолноеИмяТаблицы);
	Если ЛиОтбражатьПустые Тогда
		ТекущееЗначение = ПараметрыВывода.ТекущееЗначение;
	КонецЕсли; 
	СловаПоиска = "";
	ШаблонРазметкиВхождений = ирОбщий.ШаблонРазметкиВхожденийЛкс();
	РазрешитьОкраскуПоиска = Ложь;  
	ДлинаПредставленияСтрокиНеограниченной = ирОбщий.ДлинаПредставленияСтрокиНеограниченнойЛкс();
	_РежимОтладки = Ложь;
	КолонкиПоиска = ирОбщий.СловаПоискаПоКолонкамИзОтбораКомпоновкиЛкс(Настройки.Отбор);
	Если КолонкиПоиска.Количество() > 0 Тогда
		СтрокаПоиска = "Ё"; // любая непустая строка
		РегВыражениеПоиска = ирКэш.ВычислительРегВыраженийЛкс("ПоискСлов");
		Для Каждого КлючИЗначение Из КолонкиПоиска Цикл
			КлючИЗначение.Значение[0] = "(" + ирОбщий.ПодготовитьТекстДляРегВыраженияЛкс(КлючИЗначение.Значение[0]) + ")";
		КонецЦикла;
	КонецЕсли;
	РегВыражениеНачальныхПустыхСтрок = ирКэш.ВычислительРегВыраженийЛкс("НачальныеПустыеСтроки");
	#Если Сервер И Не Сервер Тогда
		РегВыражениеНачальныхПустыхСтрок = Обработки.ирОболочкаРегВыражение.Создать();
	#КонецЕсли
	РегВыражениеНачальныхПустыхСтрок.Pattern = "^\s*\n";
	ВсеТипыСсылокДокументов = Документы.ТипВсеСсылки();
	Для Каждого СтрокаСписка Из Строки Цикл
		СтрокаОформления = СтрокаСписка.Значение;
		ДанныеСтроки = СтрокаОформления.Данные;
		Ячейки = СтрокаОформления.Оформление;
		Если _РежимОтладки Тогда // Можно менять на Истина в точке останова, например условием ирОбщий.Пр(_РежимОтладки, 1, 1)
			// Пассивный оригинал расположенного ниже однострочного кода. Выполняйте изменения синхронно в обоих вариантах.
			Для Каждого Ячейка Из Ячейки Цикл
				//КолонкаОтображаетДанныеФлажка = Ложь; 
				ИмяКолонки = Ячейка.Ключ;
				ИмяКолонкиДанных = СтрЗаменить(Ячейка.Ключ, ".", "_");
				ЗначениеЯчейки = ДанныеСтроки[ИмяКолонки];
				
				// Антибаг платформы 8.3.18 теряются значения NULL https://www.hostedredmine.com/issues/925439
				ИмяКолонкиПризнакаNULL = "_ЭтоNULL_";
				Если Истина
					И ДанныеСтроки.Свойство(ИмяКолонки + ИмяКолонкиПризнакаNULL) 
					И ДанныеСтроки[ИмяКолонки + ИмяКолонкиПризнакаNULL] = Истина
				Тогда
					Если ТипЗнч(ЗначениеЯчейки) = Тип("Булево") Тогда
						Ячейка.Значение.УстановитьЗначениеПараметра("Отображать", ""); // В поле картинки нельзя отобразить текст
					Иначе
						Ячейка.Значение.УстановитьЗначениеПараметра("Текст", "");
					КонецЕсли;
					ЗначениеЯчейки = NULL;
				КонецЕсли;
				//Если Истина
				//	И ТипЗнч(ЗначениеЯчейки) = Тип("Строка") 
				//	И СтрДлина(ЗначениеЯчейки) = ДлинаПредставленияСтрокиНеограниченной 
				//Тогда
				//	ЗначениеЯчейки = ЗначениеЯчейки + "…"; // Платформа короче раньше обрезает строку
				//КонецЕсли;
				
				ПредставлениеЗначения = "";
				НовыйЦветФона = Неопределено;
				НовыйЦветТекста = Неопределено;
				Если КолонкиПоиска.Свойство(ИмяКолонкиДанных) Или ТипЗнч(ЗначениеЯчейки) = Тип("Строка") Тогда
					ТекстЯчейки = "" + ЗначениеЯчейки; // Может быть обращение к БД для получения представления ссылки
				КонецЕсли;
				ТипЗначенияЯчейкиXML = XMLТипЗнч(ЗначениеЯчейки);
				ТипЗначенияЯчейки = ТипЗнч(ЗначениеЯчейки);
				
				// Мультиметка62441127
				Если РегВыражениеНачальныхПустыхСтрок <> Неопределено Тогда
					ПозицияПС = Найти(ТекстЯчейки, Символы.ПС);
					Если ПозицияПС > 0 И ПустаяСтрока(Лев(ТекстЯчейки, ПозицияПС)) Тогда
						Вхождения = РегВыражениеНачальныхПустыхСтрок.НайтиВхождения(ТекстЯчейки);
						Если Вхождения.Количество() > 0 Тогда
							ПредставлениеЗначения = "¶" + Сред(ТекстЯчейки, Вхождения[0].Length + 1);
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;
				Если ЛиОтбражатьПустые И ПрименятьРежимОтображения Тогда
					Если ТипЗначенияЯчейки = Тип("Строка") Тогда
						Если Не ЗначениеЗаполнено(ЗначениеЯчейки) Тогда
							ПредставлениеЗначения = ирПлатформа.ПредставлениеПустогоЗначенияЛкс(ЗначениеЯчейки);
							НовыйЦветФона = ЦветФонаПустогоЗначения;
						ИначеЕсли ОтображатьИдентификаторы Тогда
							ПредставлениеЗначения = """" + ЗначениеЯчейки + """";
						КонецЕсли; 
					ИначеЕсли Не ирОбщий.ЛиКоллекцияЛкс(ЗначениеЯчейки) Тогда 
						Попытка
							ЗначениеНепустое = ЗначениеЗаполнено(ЗначениеЯчейки) И ЗначениеЯчейки <> Ложь;
						Исключение
							ЗначениеНепустое = Истина;
						КонецПопытки;
						Если Не ЗначениеНепустое Тогда
							ПредставлениеЗначения = ирПлатформа.ПредставлениеПустогоЗначенияЛкс(ЗначениеЯчейки);
							НовыйЦветФона = ЦветФонаПустогоЗначения;
						КонецЕсли;
					КонецЕсли; 
					Если Истина
						И ТекущееЗначение = ЗначениеЯчейки 
						И ТипЗнч(ТекущееЗначение) = ТипЗначенияЯчейки // защита от слияния Истина=1
					Тогда 
						НовыйЦветФона = ЦветФонаТекущегоЗначения;
					КонецЕсли; 
				Иначе
					Если Истина
						И ЗначенияНизкойВажности.Найти(ЗначениеЯчейки) <> Неопределено 
						И ФорматКолонки = "" 
						И ИмяКолонки <> "ИдентификаторСсылкиЛкс" 
					Тогда 
						Если ТипЗначенияЯчейки = Тип("Число") Тогда
							ПредставлениеЗначения = "0";
						Иначе
							ПредставлениеЗначения = "" + ЗначениеЯчейки; // Ложь
						КонецЕсли;
						НовыйЦветТекста = ЦветТекстаПустогоЗначения;
					КонецЕсли;
					// Результаты поиска слов
					Если Истина
						И ЗначениеЗаполнено(СтрокаПоиска) 
						И ЗначениеЗаполнено(ИмяКолонкиДанных)
						И (Ложь
							Или КолонкиПоиска = Неопределено
							Или КолонкиПоиска.Свойство(ИмяКолонкиДанных))
						И ТипЗначенияЯчейкиXML <> Неопределено
						И (Ложь
							Или ТипЗначенияЯчейки = Тип("Строка")
							Или (Истина
								И Найти(ТипЗначенияЯчейкиXML.ИмяТипа, "Ref.") > 0
								И Не ВсеТипыСсылокДокументов.СодержитТип(ТипЗначенияЯчейки)))
					Тогда
						Если КолонкиПоиска <> Неопределено Тогда
							КолонкаПоиска = КолонкиПоиска[ИмяКолонкиДанных];
							Если КолонкаПоиска <> Неопределено Тогда
								// Это отбор и значение ему точно удовлетворяет
								РегВыражениеПоиска.Pattern = КолонкаПоиска[0];
							КонецЕсли;
						Иначе
							КолонкаПоиска = Неопределено;
						КонецЕсли;
						Если Ложь
							Или КолонкаПоиска <> Неопределено
							Или ирОбщий.ЛиСтрокаСодержитВсеПодстрокиЛкс(ТекстЯчейки, СловаПоиска) 
						Тогда
							Если Не ЗначениеЗаполнено(ПредставлениеЗначения) Тогда
								ПредставлениеЗначения = ТекстЯчейки;
							КонецЕсли;
							ПредставлениеЗначения = РегВыражениеПоиска.Заменить(ПредставлениеЗначения, ШаблонРазметкиВхождений);
							Если РазрешитьОкраскуПоиска Тогда
								НовыйЦветФона = ЦветФонаТекущегоЗначения;
							КонецЕсли;
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;
				
				Если НовыйЦветФона <> Неопределено Тогда
					Ячейка.Значение.УстановитьЗначениеПараметра("ЦветФона", НовыйЦветФона);
				КонецЕсли;
				Если НовыйЦветТекста <> Неопределено Тогда
					Ячейка.Значение.УстановитьЗначениеПараметра("ЦветТекста", НовыйЦветТекста);
				КонецЕсли;
				Если Истина
					И ОтображатьИдентификаторы 
					И ПрименятьРежимОтображения 
					И ТипЗначенияЯчейки <> Тип("Строка") 
					И ЗначениеЯчейки <> Неопределено
					И ЗначениеЯчейки <> Null
				Тогда
					ИдентификаторСсылки = ирОбщий.СтроковыйИдентификаторСсылкиЛкс(ЗначениеЯчейки, Истина);
					Если ИдентификаторСсылки <> Неопределено Тогда
						ПредставлениеЗначения = ИдентификаторСсылки;
					КонецЕсли; 
				КонецЕсли; 
				Если Истина
					И Не ЛиОтбражатьПустые
					И КолонкиВРежимеПароля.Найти(ИмяКолонки) <> Неопределено 
				Тогда
					ПредставлениеЗначения = "*****";
				КонецЕсли; 
				Если ПредставлениеЗначения <> "" Тогда
					Ячейка.Значение.УстановитьЗначениеПараметра("Текст", ПредставлениеЗначения);
				КонецЕсли; 
			КонецЦикла;  
		Иначе
			// Однострочный код использован для ускорения при разрешенной отладке. Выше расположен оригинал. Выполняйте изменения синхронно в обоих вариантах. Преобразовано консолью кода из подсистемы "Инструменты разработчика"
			Для Каждого Ячейка Из Ячейки Цикл    				ИмяКолонки = Ячейка.Ключ;  				ИмяКолонкиДанных = СтрЗаменить(Ячейка.Ключ, ".", "_");  				ЗначениеЯчейки = ДанныеСтроки[ИмяКолонки];      				ИмяКолонкиПризнакаNULL = "_ЭтоNULL_";  				Если Истина  					И ДанныеСтроки.Свойство(ИмяКолонки + ИмяКолонкиПризнакаNULL)  					И ДанныеСтроки[ИмяКолонки + ИмяКолонкиПризнакаNULL] = Истина  				Тогда  					Если ТипЗнч(ЗначениеЯчейки) = Тип("Булево") Тогда  						Ячейка.Значение.УстановитьЗначениеПараметра("Отображать", "");  					Иначе  						Ячейка.Значение.УстановитьЗначениеПараметра("Текст", "");  					КонецЕсли;  					ЗначениеЯчейки = NULL;  				КонецЕсли;                				ПредставлениеЗначения = "";  				НовыйЦветФона = Неопределено;  				НовыйЦветТекста = Неопределено;  				Если КолонкиПоиска.Свойство(ИмяКолонкиДанных) Или ТипЗнч(ЗначениеЯчейки) = Тип("Строка") Тогда  					ТекстЯчейки = "" + ЗначениеЯчейки;  				КонецЕсли;  				ТипЗначенияЯчейкиXML = XMLТипЗнч(ЗначениеЯчейки);  				ТипЗначенияЯчейки = ТипЗнч(ЗначениеЯчейки);      				Если РегВыражениеНачальныхПустыхСтрок <> Неопределено Тогда  					ПозицияПС = Найти(ТекстЯчейки, Символы.ПС);  					Если ПозицияПС > 0 И ПустаяСтрока(Лев(ТекстЯчейки, ПозицияПС)) Тогда  						Вхождения = РегВыражениеНачальныхПустыхСтрок.НайтиВхождения(ТекстЯчейки);  						Если Вхождения.Количество() > 0 Тогда  							ПредставлениеЗначения = "¶" + Сред(ТекстЯчейки, Вхождения[0].Length + 1);  						КонецЕсли;  					КонецЕсли;  				КонецЕсли;  				Если ЛиОтбражатьПустые И ПрименятьРежимОтображения Тогда  					Если ТипЗначенияЯчейки = Тип("Строка") Тогда  						Если Не ЗначениеЗаполнено(ЗначениеЯчейки) Тогда  							ПредставлениеЗначения = ирПлатформа.ПредставлениеПустогоЗначенияЛкс(ЗначениеЯчейки);  							НовыйЦветФона = ЦветФонаПустогоЗначения;  						ИначеЕсли ОтображатьИдентификаторы Тогда  							ПредставлениеЗначения = """" + ЗначениеЯчейки + """";  						КонецЕсли;  					ИначеЕсли Не ирОбщий.ЛиКоллекцияЛкс(ЗначениеЯчейки) Тогда  						Попытка  							ЗначениеНепустое = ЗначениеЗаполнено(ЗначениеЯчейки) И ЗначениеЯчейки <> Ложь;  						Исключение  							ЗначениеНепустое = Истина;  						КонецПопытки;  						Если Не ЗначениеНепустое Тогда  							ПредставлениеЗначения = ирПлатформа.ПредставлениеПустогоЗначенияЛкс(ЗначениеЯчейки);  							НовыйЦветФона = ЦветФонаПустогоЗначения;  						КонецЕсли;  					КонецЕсли;  					Если Истина  						И ТекущееЗначение = ЗначениеЯчейки  						И ТипЗнч(ТекущееЗначение) = ТипЗначенияЯчейки  					Тогда  						НовыйЦветФона = ЦветФонаТекущегоЗначения;  					КонецЕсли;  				Иначе  					Если Истина  						И ЗначенияНизкойВажности.Найти(ЗначениеЯчейки) <> Неопределено  						И ФорматКолонки = ""  						И ИмяКолонки <> "ИдентификаторСсылкиЛкс"  					Тогда  						Если ТипЗначенияЯчейки = Тип("Число") Тогда  							ПредставлениеЗначения = "0";  						Иначе  							ПредставлениеЗначения = "" + ЗначениеЯчейки;  						КонецЕсли;  						НовыйЦветТекста = ЦветТекстаПустогоЗначения;  					КонецЕсли;    					Если Истина  						И ЗначениеЗаполнено(СтрокаПоиска)  						И ЗначениеЗаполнено(ИмяКолонкиДанных)  						И (Ложь  							Или КолонкиПоиска = Неопределено  							Или КолонкиПоиска.Свойство(ИмяКолонкиДанных))  						И ТипЗначенияЯчейкиXML <> Неопределено  						И (Ложь  							Или ТипЗначенияЯчейки = Тип("Строка")  							Или (Истина  								И Найти(ТипЗначенияЯчейкиXML.ИмяТипа, "Ref.") > 0  								И Не ВсеТипыСсылокДокументов.СодержитТип(ТипЗначенияЯчейки)))  					Тогда  						Если КолонкиПоиска <> Неопределено Тогда  							КолонкаПоиска = КолонкиПоиска[ИмяКолонкиДанных];  							Если КолонкаПоиска <> Неопределено Тогда    								РегВыражениеПоиска.Pattern = КолонкаПоиска[0];  							КонецЕсли;  						Иначе  							КолонкаПоиска = Неопределено;  						КонецЕсли;  						Если Ложь  							Или КолонкаПоиска <> Неопределено  							Или ирОбщий.ЛиСтрокаСодержитВсеПодстрокиЛкс(ТекстЯчейки, СловаПоиска)  						Тогда  							Если Не ЗначениеЗаполнено(ПредставлениеЗначения) Тогда  								ПредставлениеЗначения = ТекстЯчейки;  							КонецЕсли;  							ПредставлениеЗначения = РегВыражениеПоиска.Заменить(ПредставлениеЗначения, ШаблонРазметкиВхождений);  							Если РазрешитьОкраскуПоиска Тогда  								НовыйЦветФона = ЦветФонаТекущегоЗначения;  							КонецЕсли;  						КонецЕсли;  					КонецЕсли;  				КонецЕсли;    				Если НовыйЦветФона <> Неопределено Тогда  					Ячейка.Значение.УстановитьЗначениеПараметра("ЦветФона", НовыйЦветФона);  				КонецЕсли;  				Если НовыйЦветТекста <> Неопределено Тогда  					Ячейка.Значение.УстановитьЗначениеПараметра("ЦветТекста", НовыйЦветТекста);  				КонецЕсли;  				Если Истина  					И ОтображатьИдентификаторы  					И ПрименятьРежимОтображения  					И ТипЗначенияЯчейки <> Тип("Строка")  					И ЗначениеЯчейки <> Неопределено  					И ЗначениеЯчейки <> Null  				Тогда  					ИдентификаторСсылки = ирОбщий.СтроковыйИдентификаторСсылкиЛкс(ЗначениеЯчейки, Истина);  					Если ИдентификаторСсылки <> Неопределено Тогда  						ПредставлениеЗначения = ИдентификаторСсылки;  					КонецЕсли;  				КонецЕсли;  				Если Истина  					И Не ЛиОтбражатьПустые  					И КолонкиВРежимеПароля.Найти(ИмяКолонки) <> Неопределено  				Тогда  					ПредставлениеЗначения = "*****";  				КонецЕсли;  				Если ПредставлениеЗначения <> "" Тогда  					Ячейка.Значение.УстановитьЗначениеПараметра("Текст", ПредставлениеЗначения);  				КонецЕсли;  			КонецЦикла;  
		КонецЕсли;
		Если Настройки.ДоступныеПоляВыбора.НайтиПоле(Новый ПолеКомпоновкиДанных("ИдентификаторСсылкиЛкс")) <> Неопределено Тогда
			Попытка
				ЯчейкаИдентификатора = Ячейки["ИдентификаторСсылкиЛкс"];
			Исключение
				// Скрыли колонку в таблице
			КонецПопытки;
			Если ЯчейкаИдентификатора <> Неопределено Тогда
				ИдентификаторСсылки = ирОбщий.СтроковыйИдентификаторСсылкиЛкс(ирОбщий.КлючСтрокиТаблицыБДИзСтрокиТаблицыЗначенийЛкс(ПолноеИмяТаблицы, ДанныеСтроки));
				ЯчейкаИдентификатора.УстановитьЗначениеПараметра("Текст", ИдентификаторСсылки);
			КонецЕсли; 
		КонецЕсли;
		// Платформа перекрывает оформление текущей строки на клиенте
		//Если СтрокаСписка.Ключ = ТекущаяСтрока Тогда
		//	СмещениеЦвета = -20;
		//	Для Каждого Ячейка Из Ячейки Цикл
		//		ТекущийЦветФона = Ячейка.Значение.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ЦветФона")).Значение;
		//		Ячейка.Значение.УстановитьЗначениеПараметра("ЦветФона", ирОбщий.СмещенныйЦветЛкс(ТекущийЦветФона, СмещениеЦвета,, СмещениеЦвета));
		//	КонецЦикла;
		//КонецЕсли; 
	КонецЦикла;
	
КонецПроцедуры

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

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

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

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

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

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

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

&НаКлиенте
Процедура РедакторОбъектаБДЯчейки(Команда)
	
	ЭлементыФормы = Элементы;
	ирКлиент.ОткрытьСсылкуЯчейкиВРедактореОбъектаБДЛкс(ЭлементыФормы.ДинамическийСписок);
	
КонецПроцедуры

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

&НаКлиенте
Процедура ОбъектРежимИмяСинонимПриИзменении(Элемент)
	Если Не ЗначениеЗаполнено(фОбъект.ПолноеИмяТаблицы) Тогда
		Возврат;
	КонецЕсли; 
	ОбъектРежимИмяСинонимПриИзмененииНаСервере();
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура ОсновнаяФорма(Команда)
	
	ПерейтиВФормуСписка(Ложь);

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

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

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

&НаКлиенте
Процедура ОбычнаяФорма(Команда)
	ПерейтиВФормуСписка("Обычная");
КонецПроцедуры

&НаКлиенте
Процедура СброситьНастройкиСписка(Команда)
	
	СброситьНастройкиСпискаНаСервере(); 
	ОбновитьПоказательНевидимыхКолонок();
	ирОбщий.СообщитьЛкс("Если ширина колонок не сбросилась, выполни команду ""Установить стандартные настройки"" в окне ""Настроить форму""",,, Истина);
	// Так и не смог добиться удаления пользовательских настроек ширины колонок
	//Закрыть();
	//// http://forum.infostart.ru/forum9/topic221058/message2248297/#message2248297
	//ХранилищеСистемныхНастроек.Удалить(ИмяФормы + "/НастройкиОкна", "", ИмяПользователя());
	//ХранилищеСистемныхНастроек.Удалить(ИмяФормы + "/Такси/НастройкиОкна", "", ИмяПользователя());
	//ХранилищеСистемныхНастроек.Удалить(ИмяФормы + "/WindowSettings", "", ИмяПользователя());
	//ХранилищеСистемныхНастроек.Удалить(ИмяФормы + "/Такси/WindowSettings", "", ИмяПользователя());
	////ХранилищеСистемныхНастроек.Удалить(ИмяФормы + "/" + КлючНазначенияИспользования + "/НастройкиФормы", "", ИмяПользователя());
	//ФормаНового = ирКлиент.ФормаДинамическогоСпискаЛкс(Новый Структура("КлючСохраненияПоложенияОкна", ТекущаяДата()),, КлючУникальности);
	//ФормаНового.УстановитьОбъектМетаданных(фОбъект.ПолноеИмяТаблицы);
	//ФормаНового.Открыть();

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

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

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

&НаКлиенте
Процедура ВыделитьНужноеКоличество(Команда)
	
	Количество = 10;
	Если Не ВвестиЧисло(Количество, "Введите количество", 6, 0) Тогда
		Возврат;
	КонецЕсли; 
	Если Количество = 0 Тогда
		Возврат;
	КонецЕсли; 
	ВыделитьНужноеКоличествоНаСервере(Количество);

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

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

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

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

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

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

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

&НаКлиенте
Процедура НастройкаСпискаЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	ПроверитьЗапомнитьОтбор();

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

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

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

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

&НаКлиенте
Функция НастройкиРезультатаНаКлиенте(выхАдресСхемы = Неопределено)
	
	выхАдресСхемы = Неопределено;
    НастройкаКомпоновки = Неопределено;
    ИсполняемыеСхемаИНастройка(выхАдресСхемы, НастройкаКомпоновки);
	Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
	Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(выхАдресСхемы));
	Компоновщик.ЗагрузитьНастройки(НастройкаКомпоновки);
	Результат = Компоновщик.Настройки;
	Возврат Результат;
	
КонецФункции

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

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

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

&НаКлиенте
Функция ИсполняемыеСхемаИНастройки() Экспорт 
	Возврат ИсполняемыеСхемаИНастройкиНаСервере();
КонецФункции

&НаСервере
Функция ИсполняемыеСхемаИНастройкиНаСервере() Экспорт 
	Результат = Новый Структура();
	Результат.Вставить("Схема", Элементы.ДинамическийСписок.ПолучитьИсполняемуюСхемуКомпоновкиДанных());
	Результат.Вставить("Настройки", Элементы.ДинамическийСписок.ПолучитьИсполняемыеНастройкиКомпоновкиДанных());
	Возврат Результат;
КонецФункции

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ОтображениеИдентификаторов(Команда)
	
	Кнопка = Элементы.ФормаОтображениеИдентификаторов;
	ирКлиент.КнопкаОтображатьПустыеИИдентификаторыНажатиеЛкс(Кнопка);
	ОбновитьПараметрыВывода(ЭтаФорма);
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура СтруктураФормы(Команда)
	
	// https://www.hostedredmine.com/issues/950113
	//ирКлиент.ОткрытьСтруктуруФормыЛкс(ЭтаФорма);
	ПараметрыВызова = Новый Структура("Форма", ЭтаФорма); 
	#Если Сервер И Не Сервер Тогда
		ОткрытьСтруктуруАктивнойФормыЛкс();
	#КонецЕсли
	ирКлиент.ПодключитьОбработчикОжиданияСПараметрамиЛкс("ОткрытьСтруктуруАктивнойФормыЛкс", ПараметрыВызова);

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

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

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)

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

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

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

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

&НаКлиенте
Процедура ОбновитьПоказательНевидимыхКолонок()
	
	//ЧислоНевидимых = ирОбщий.ОтобратьКоллекциюЛкс(фОбъект.НастройкиКолонок, Новый Структура("Видимость", Ложь)).Количество();
	ЧислоНевидимых = ирОбщий.ОтобратьКоллекциюЛкс(фОбъект.НастройкиКолонок, "Не Э.Видимость ").Количество();

	Если ЗначениеЗаполнено(ЧислоНевидимых) Тогда
		ЧислоНевидимых = "-" + ЧислоНевидимых;
	Иначе
		ЧислоНевидимых = "*";
	КонецЕсли; 
	ирОбщий.ОбновитьТекстПослеМаркераЛкс(Элементы.ФормаНастроитьКолонки.Заголовок,, ЧислоНевидимых, ":");

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

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

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

&НаКлиенте
// В частности полезно звать после программного изменения ширины колонок, из-за чего происходит горизонтальная прокрутка влево https://www.hostedredmine.com/issues/956731
Процедура ПереустановитьТекущуюКолонку()

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
	
	Если ТипЗнч(ВыбранноеЗначение) = Тип("Структура") Тогда
		ОбработатьВыборНастроекКолонок(ВыбранноеЗначение);
	КонецЕсли; 
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ОткрытьОбъектМетаданных(Команда)
	
	ирКлиент.ОткрытьОбъектМетаданныхЛкс(фОбъект.ПолноеИмяТаблицы);

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

&НаКлиенте
Процедура СправкаМетаданного(Команда)
	
	ОткрытьСправку(ирКэш.ОбъектМДПоПолномуИмениЛкс(фОбъект.ПолноеИмяТаблицы));

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

&НаКлиенте
Процедура СоединяемыеРегистрыПриИзменении(Элемент)
	
	ОбновитьЗапросБД(Истина);    
	АктивироватьКолонкуСоединенногоРегистра();
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура СоединяемыеРегистрыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	АктивироватьКолонкуСоединенногоРегистра(Истина);
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
	
	ирКлиент.ОтменитьФоновоеЗаданиеЛкс(фОбъект.ИДФоновогоЗадания);
	Если ЗавершениеРаботы <> Истина Тогда
		СохранитьНастройкиТаблицы(ЭтаФорма);
	КонецЕсли; 
	ирКлиент.Форма_ПриЗакрытииЛкс(ЭтаФорма);

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

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

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

&НаКлиенте
Процедура СтруктураКоманднойПанели(Команда)

	// https://www.hostedredmine.com/issues/950113
	//ирКлиент.ОткрытьСтруктуруКоманднойПанелиЛкс(ЭтаФорма, Элементы.ФормаСтруктураКоманднойПанели);
	ПараметрыВызова = Новый Структура("Форма", ЭтаФорма);
	ПараметрыВызова.Вставить("КоманднаяПанель", Элементы.ФормаСтруктураКоманднойПанели);
	#Если Сервер И Не Сервер Тогда
		ОткрытьСтруктуруАктивнойФормыЛкс();
	#КонецЕсли
	ирКлиент.ПодключитьОбработчикОжиданияСПараметрамиЛкс("ОткрытьСтруктуруАктивнойФормыЛкс", ПараметрыВызова);

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

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

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

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

	ирКлиент.Форма_ВнешнееСобытиеЛкс(ЭтаФорма, Источник, Событие, Данные);
	Если ТекущийЭлемент = Элементы.ДинамическийСписок Тогда 
		Если Найти(Данные, ирКэш.КодыКлавишЛкс()["CTRL+A"]) = 1 Тогда
			ДинамическийСписокПриАктивизацииСтроки();
		КонецЕсли;
	КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура КомпоновщикНастроекПользовательскиеНастройкиЗначениеНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
	// Это событие оставлено для совместимости и по факту не вызывается. Поэтому работать оно не будет 
	// https://partners.v8.1c.ru/forum/topic/1150632
КонецПроцедуры

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

&НаКлиенте
Процедура КомпоновщикНастроекПользовательскиеНастройкиОтборПравоеЗначениеНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
	// Это событие оставлено для совместимости и по факту не вызывается. Поэтому работать оно не будет 
	// https://partners.v8.1c.ru/forum/topic/1150632
КонецПроцедуры

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

&НаКлиенте
Процедура ОбъектМетаданныхНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
	
	// Это событие оставлено для совместимости и по факту не вызывается. Поэтому работать оно не будет 
	// https://partners.v8.1c.ru/forum/topic/1150632
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура КомпоновщикНастроекПользовательскиеНастройкиОтборПриАктивизацииСтроки(Элемент)
	ВосстановитьВыделенныеСтрокиОтложенно();
КонецПроцедуры

&НаКлиенте
Процедура ВосстановитьВыделенныеСтрокиОтложенно()
	
	ПодключитьОбработчикОжидания("ВосстановитьВыделенныеСтроки", 0.1, Истина);

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

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

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

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

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

&НаКлиенте
Процедура ШиринаКолонок(Команда)
	
	//ирОбщий.РасширитьКолонкиТабличногоПоляЛкс(Элементы.ДинамическийСписок);
	ДобавитьСимволов = 5;
	Для Каждого Колонка Из Элементы.ДинамическийСписок.ПодчиненныеЭлементы Цикл
		Если Колонка.РастягиватьПоГоризонтали = Ложь Тогда
			Продолжить;
		КонецЕсли;
		Колонка.Ширина = Колонка.Ширина + ДобавитьСимволов;
	КонецЦикла;
	УстановитьТекущуюКолонку(); // Антибаг платформы 8.3.23 https://www.hostedredmine.com/issues/956731
	
КонецПроцедуры

&НаКлиенте
Процедура СжатьКолонки(Команда) 
	
	//ирОбщий.СжатьКолонкиТабличногоПоляЛкс(Элементы.ДинамическийСписок);
	Сжатие = 2;
	Для Каждого Колонка Из Элементы.ДинамическийСписок.ПодчиненныеЭлементы Цикл
		Если Колонка.РастягиватьПоГоризонтали = Ложь Тогда
			Продолжить;
		КонецЕсли;
		НоваяШирина = Колонка.Ширина / Сжатие;
		НоваяШирина = Макс(НоваяШирина, 1);
		Колонка.Ширина = НоваяШирина;
	КонецЦикла;
	УстановитьТекущуюКолонку(); // Антибаг платформы 8.3.23 https://www.hostedredmine.com/issues/956731
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура ПолноеИмяТаблицыАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
КонецПроцедуры

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура КолонкаБД(Команда)
	ирКлиент.ОткрытьКолонкуБДЛкс(фОбъект.ПолноеИмяТаблицы, ИмяКолонкиБезРодителя(ЭтаФорма));
КонецПроцедуры

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

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

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

#КонецЕсли
