Приветствую Вас ГостьСуббота, 18.05.2024, 13:29

Каталог статей


Отбор в форме с динамическим списком

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

Можно конечно использовать свойство элемента формы списка "Группа пользовательских настроек", но тогда, чтобы изменить состав настроек надо нажимать  "Ещё/Настроить список" и условие может отображаться коряво, особенно для текстовых реквизитов. Мы пойдем другим путем...

Для начала создадим реквизит формы "Список" и расположим его на форме. Так как все динамические списки построены на основе СКД, то у него есть табличная часть "Отбор". Раскрываем реквизит "Список", находим "Отбор" и перетаскиваем его на форму.

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

Чтобы добиться того, чтобы настройки сохранялись сделаем следующее:

1. Заполним свойства формы:

  • АвтоматическоеСохранениеДанныхВНастройках = Использовать
  • СохранениеДанныхВНастройках = Использовать список;

2. В событии ПриСохраненииДанныхВНастройкахНаСервере введем код:

&НаСервере
Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки)
    
    НастройкиФормы = Новый Структура;
    
    // группировки
    НастройкиСписка = Новый Структура;
    
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Список.Группировка);
    НастройкиСписка.Вставить("Группировка", ЗаписьXML.Закрыть());
    
    НастройкиФормы.Вставить("НастройкиСписка", НастройкиСписка);
    
    // Отборы
    НастройкиОтбора = Новый Структура;
    
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Список.Отбор);
    НастройкиОтбора.Вставить("Отбор", ЗаписьXML.Закрыть());
    
    НастройкиФормы.Вставить("НастройкиОтбора", НастройкиОтбора);
    
    Настройки.Вставить("Стандартные", НастройкиФормы);
    
КонецПроцедуры

Здесь мы используем сериализацию, чтобы преобразовать текущие настройки списка (группировка и отбор), после чего записываем все в параметр "Настройки" (тип Соответствие) с ключом "Стандартные".

2. В событии ПриЗагрузкеДанныхИзНастроекНаСерверевведем код:

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

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

 

Здесь мы читаем настройки и с помощью сериализатора загружаем полученные настройки группировки и отбора в настройки Списка. Не забываем очищать настройки отбора перед загрузкой прочитанных.

Но опять проблемка - события не срабатывают.

Чтобы события срабатывали, надо в процедуре ПриОткрытии() добавить строку СохраняемыеВНастройкахДанныеМодифицированы = Истина; (это работает только на клиенте)

Теперь события срабатывают и настройки восстанавливаются. В результате получаем примерно следующее:

Осталось немного помочь пользователям и вывести в отбор основные настройки отбора, которые загрузятся в первый раз. Для этого в процедуре ПриСозданииНаСервере() добавляем поля отбора с выключенным признаком Использование, чтобы пользователю осталось только заполнит нужное значение.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    //добавляем настройки отборадля первого запуска
    ДобавитьПолеПустогоОтбораПоИмени("Подразделение");
    ДобавитьПолеПустогоОтбораПоИмени("Автор");
    ДобавитьПолеПустогоОтбораПоИмени("Исполнитель");    
    ДобавитьПолеПустогоОтбораПоИмени("ДатаВыполнения");    
    ДобавитьПолеПустогоОтбораПоИмени("СостояниеЗадания");    
    ДобавитьПолеПустогоОтбораПоИмени("ПометкаУдаления",Ложь);    
    
КонецПроцедуры

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

 

 

Категория: Формы | Добавил: leshic (22.06.2022)
Просмотров: 277 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Вход на сайт
Поиск
Категории раздела
СКД [48]
Регистры [7]
Формы [41]
Администрирование [35]
Запросы [10]
Объекты конфигурации и типы данных [20]
Взаимодействие с другими базами, приложениями и источниками данных [16]
Программирование [29]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0