новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума

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

  • Добавить свою публикацию
  • для этого требуется регистрация

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

Изображение

Изображение

 

Теперь распишем программную реализацию.

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

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

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

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

Здесь: 

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

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

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

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

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

 

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

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


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

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

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

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

 
0
≡ к списку статей