Вот итоговый скрин-шот интерфейса, который мы хотим получить при вводе/установки фильтров для каждого события уведомления нашего webapp-приложения:
Однако, как оказалось, не так просто реализовать подобный интерфейс ввода фильтров СКД.
Поэтому расскажу как сделать все по шагам:
1. Добавляем для хранения поле "Отбор" в табличную часть, тип ХранилищеЗначения.
2. Создаем реквизит формы "Доступный отбор" типа динамический список, и устанавливаем ему нужный текст запроса для отбора.
3. Добавляем реквизит формы "ОтборФорма" для табличной части объекта, где будем хранить отбор компоновки данных:
4. Добавляем заполнение поля формы "ОтборФорма" в процедуру ПриЧтенииНаСервере :
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
Для Каждого СтрокаТЧ Из ТекущийОбъект.СобытияУведомлений Цикл
МассивСтрок = Объект.СобытияУведомлений.НайтиСтроки(Новый Структура("НомерСтроки", СтрокаТЧ.НомерСтроки));
Если МассивСтрок.Количество()=0 Тогда
Продолжить;
КонецЕсли;
СтрокаФормы = МассивСтрок[0];
СтрокаФормы.ОтборФорма = СтрокаТЧ.Отбор.Получить();
КонецЦикла;
КонецПроцедуры
5. Добавляем сохранение поля формы "ОтборФорма" в базу:
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Для Каждого СтрокаТЧ Из ТекущийОбъект.СобытияУведомлений Цикл
МассивСтрок = Объект.СобытияУведомлений.НайтиСтроки(Новый Структура("НомерСтроки", СтрокаТЧ.НомерСтроки));
Если МассивСтрок.Количество()=0 Тогда
Продолжить;
КонецЕсли;
СтрокаФормы = МассивСтрок[0];
СтрокаТЧ.Отбор = Новый ХранилищеЗначения(СтрокаФормы.ОтборФорма);
КонецЦикла;
КонецПроцедуры
6. Дальше, самое интересное, чтобы при открытии отбора Вы увидели все доступные поля для отбора, то мы должны взять наш реквизит формы "Доступный отбор" с текстом запроса и скопировать в него текущий отбор формы по строке:
&НаКлиенте
Процедура СобытияУведомленийПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
СтрокаТЧ = Элементы.СобытияУведомлений.ТекущиеДанные;
Если СтрокаТЧ=Неопределено Тогда
Возврат;
КонецЕсли;
ДоступныйОтбор.КомпоновщикНастроек.Настройки.Отбор.Элементы.Очистить();
КомпоновкаДанныхКлиентСервер.СкопироватьТолькоОтборКомпоновкиДанных(СтрокаТЧ.ОтборФорма, ДоступныйОтбор.КомпоновщикНастроек.Настройки.Отбор);
СтрокаТЧ.ОтборФорма = ДоступныйОтбор.КомпоновщикНастроек.Настройки.Отбор;
КонецПроцедуры
7. А при окончании редактирования создать новый компоновщик и скопировать туда только настройки отбора из поля "ОтборФорма". В противном случае, Вы столкнетесь с проблемой изменения отбора в других строчках при изменении в текущей строке:
&НаКлиенте
Процедура СобытияУведомленийПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
СтрокаТЧ = Элементы.СобытияУведомлений.ТекущиеДанные;
Если СтрокаТЧ=Неопределено Тогда
Возврат;
КонецЕсли;
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновкаДанныхКлиентСервер.СкопироватьТолькоОтборКомпоновкиДанных(СтрокаТЧ.ОтборФорма, КомпоновщикНастроек.Настройки.Отбор);
СтрокаТЧ.ОтборФорма = КомпоновщикНастроек.Настройки.Отбор;
КонецПроцедуры
) вот и всё, отбор настроен, сохраняется, восстанавливается и позволяет редактировать.
Надеюсь, моя публикация была Вам полезна и сэкономит Ваше время, ссылка на все публикации SizovE.
Подписывайтесь на мой канал (наверху), будет много интересного бесплатного контента :)