Есть форма с динамическим списком и хочется разместит на форме таблицу с отбором, так чтобы параметры отбора можно было изменить, как количественно, так и качественно, и чтобы введенные пользователем настройки сохранялись и открывались при следующем открытии формы.
Можно конечно использовать свойство элемента формы списка "Группа пользовательских настроек", но тогда, чтобы изменить состав настроек надо нажимать "Ещё/Настроить список" и условие может отображаться коряво, особенно для текстовых реквизитов. Мы пойдем другим путем...
Для начала создадим реквизит формы "Список" и расположим его на форме. Так как все динамические списки построены на основе СКД, то у него есть табличная часть "Отбор". Раскрываем реквизит "Список", находим "Отбор" и перетаскиваем его на форму.
Казалось бы вот и все: динамический список есть, настройки отбора можно настраивать как хочешь, НО... при закрытии формы настройки не сохраняются.
Чтобы добиться того, чтобы настройки сохранялись сделаем следующее:
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).Элементы Цикл
ДобавитьЭлементОтбора(Список.Отбор, СтрокаОтбора);
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ДобавитьЭлементОтбора(МестоДобавления, ДанныеОтбора)
ПолеОтбора = МестоДобавления.Элементы.Добавить(ТипЗнч(ДанныеОтбора));
ЗаполнитьЗначенияСвойств(ПолеОтбора, ДанныеОтбора);
Если ТипЗнч(ДанныеОтбора) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда
Для каждого ЭлементГруппы Из ДанныеОтбора.Элементы Цикл
ДобавитьЭлементОтбора(ПолеОтбора, ЭлементГруппы)
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Здесь мы читаем настройки и с помощью сериализатора загружаем полученные настройки группировки и отбора в настройки Списка. Не забываем очищать настройки отбора перед загрузкой прочитанных.
Но опять проблемка - события не срабатывают.
Чтобы события срабатывали, надо в процедуре ПриОткрытии() добавить строку СохраняемыеВНастройкахДанныеМодифицированы = Истина; (это работает только на клиенте)
Теперь события срабатывают и настройки восстанавливаются. В результате получаем примерно следующее:
Осталось немного помочь пользователям и вывести в отбор основные настройки отбора, которые загрузятся в первый раз. Для этого в процедуре ПриСозданииНаСервере() добавляем поля отбора с выключенным признаком Использование, чтобы пользователю осталось только заполнит нужное значение.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//добавляем настройки отборадля первого запуска
ДобавитьПолеПустогоОтбораПоИмени("Подразделение");
ДобавитьПолеПустогоОтбораПоИмени("Автор");
ДобавитьПолеПустогоОтбораПоИмени("Исполнитель");
ДобавитьПолеПустогоОтбораПоИмени("ДатаВыполнения");
ДобавитьПолеПустогоОтбораПоИмени("СостояниеЗадания");
ДобавитьПолеПустогоОтбораПоИмени("ПометкаУдаления",Ложь);
КонецПроцедуры
&НаСервере
Процедура ДобавитьПолеПустогоОтбораПоИмени(ИмяПоля, Значение = Неопределено)
Перем ПолеОтбора, ЭлементОтбора;
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ПолеОтбора = Новый ПолеКомпоновкиДанных(ИмяПоля);
ЭлементОтбора.ЛевоеЗначение = ПолеОтбора;
ЭлементОтбора.ВидСравнения=ВидСравненияКомпоновкиДанных.Равно;
Если Значение = Неопределено Тогда
ЭлементОтбора.Использование = Ложь;
Иначе
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ПравоеЗначение = Значение;
КонецЕсли;
КонецПроцедуры
|