Каталог решений - Бодаемся с отображением отборов на управляемых формах

Бодаемся с отображением отборов на управляемых формах

Бодаемся с отображением отборов на управляемых формах

В наличии

Рассмотрим в статье, как настроить отображение пользовательских отборов на форме по своему желанию.

Категория:

Описание

Как известно многим, дьявол всегда кроется в мелочах. Одной из таких мелочей всплыло замечание пользователей о том, что при добавлении отборов при настройке списка не всегда отображается вид сравнения.

Используя главный инструмент разработчика — а именно метод научного тыка, я определил, что вид сравнения не отображается, если он соответствует виду "Равно". Исправление этой прекрасной находки специалистов по юзабилити из 1С, казалось бы, находится на расстоянии вытянутой руки: вот и заветная галочка, доступная из настроек формы:

 

Казалось бы, дело за малым, перехватить момент, когда отборы попадают на форму, да пройтись по всем элементам группы пользовательских настроек и проставить видимость. 

Итак, первым делом нужно усвоить, что те отборы, которые мы используем через стандартную команду настройки списка, имеют отношение не к самой форме, а к динамическому списку, расположенному на ней, и являются ни чем иным, как пользовательскими настройками. 

Если смотреть свойства динамического списка через палитру, можно найти две зацепки для решения нашей задачи:

1) Во-первых, это свойство "Группа пользовательских настроек". В данном свойстве указывается группа формы, которая выступит родителем для всех добавляемых элементов с отображением отборов.

 

 

2) Во-вторых, это событие списка "ПриОбновленииСоставаПользовательскихНастроекНаСервере".

 

 

Именно сюда вы попадёте если будете грешить после нажатия кнопки "Завершить редактирование" в форме настройки списка. При создании процедуры у неё есть лишь один параметр — использовать стандартную обработку или нет. При стандартной обработке будет вызван метод расширения формы динамического списка (т.е. элемента) СоздатьЭлементыФормыПользовательскихНастроек, который формирует все поля отборов на форме. На этом моменте у нас есть два выбора: или сформировать все поля через Элементы.Список.СоздатьЭлементыФормыПользовательскихНастроек(), а потом проставить видимость элементов, или взять дело целиком в свои руки и отрисовать поля самим. Я выбрал второй вариант, хотя, думаю, вы сможете реализовать и первый, зная, что откуда растёт. В любом случае не забудьте, что стандартная обработка должна быть выключена!

Рассмотрим программное создание полей на примере рабочего кода:

 

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

 

Как видите, алгоритм не очень сложен, дольше всего я провозился с путём к данным с настройками — первый массив, в который мы попадаем (который жёстко прописан в пути) содержит информацию по отборам, а последующие массивы уже информацию ко конкретным настройкам отбора. 

В итоге мы имеем стройный ряд настроек, который можно поменять в любой момент:

 

has been added to your cart:
Оформление заказа