gifts2017

Программное управление пользовательскими настройками динамического списка

Опубликовал Игорь Лисицкий (lisrws) в раздел Программирование - Практика программирования

Начнем с постановки задачи. Случай касался списка заказов покупателя, который по совместительству являлся еще и динамическим списком. В управляемых формах для динамических списков на их командной панели есть подменю "Все действия" и в нем есть 2 пункта: "Выбрать настройки" и "Установить стандартные настройки". Клиенту почему-то было влом туда лезть и он попросил, чтобы список настроек, которые живут в "Выбрать настройки", отображался на форме в виде подменю, пункты которого и будут соответствовать перечню этих настроек + пункт сброса текущих настроек("Установить стандартные настройки"). В инете ничего толкового на форумах не нашел, поэтому изложу результат своих поисков здесь, вдруг кому пригодится.

Визуально то, что было, и то, как хотел заказчик, можно увидеть из скриншотов. Теперь распишем программную реализацию.

Сперва рассмотрим заполнение этого подменю пунктами с названиями настроек. В этом нам поможет событие динамического списка "ПриОбновленииСоставаПользовательскихНастроекНаСервере":

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

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

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

Здесь: 

Лис_Настройки - группа-подменю, добавленная на командную панель списка, в моем случае имеет заголовок "Фильтры".

Лис_ИдентификаторыКомандНастроек - таблица значений в реквизитах формы. Имеет в колонки: 

1) Команда - тип "Строка". Содержит название команды.

2) Идентификатор - тип "Строка". Содержит идентификатор этой команды.

Если необходимо, чтобы состав настроек в нашем подменю обновлялся автоматически после сохранения новой настройки, то вызов "СписокПриОбновленииСоставаПользовательскихНастроекНаСервере" следует поместить в обработчик события этого списка "ПриСохраненииПользовательскихНастроекНаСервере".

 

Далее идет процедура программного наполнения подменю командами:

 

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

Теперь рассмотрим код на исполнение через эти команды:

 

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

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

ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбораДинамическогоСписка описана в типовых модулях УТ11, у меня установлен релиз Управление торговлей, редакция 11.2 (11.2.2.100).

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Андрей Акулов (DrAku1a) 05.05.16 02:17
Автору ресект (+) за разбор внутренностей динамического списка!
Вроде как выбирать настройку в отдельном окошке - удобнее. Кнопку выбора настроек можно было вынести отдельно - создав кнопку и добавив действие из стандартных.
Скриншот ниже - сделал в 8.3, аналогичной настройки в 8.2 - просто не нашёл...
Прикрепленные файлы:
2. Игорь Лисицкий (lisrws) 06.05.16 19:11
(1) DrAku1a, спасибо за дополнение. но заказчик именно такой бантик захотел)))
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа