При работе с динамическими списками на управляемых формах пользователи часто используют удобные механизмы быстрых фильтров — например, интерактивный поиск по сочетанию клавиш Alt+F. В результате такого поиска платформа создает специальное «Состояние просмотра», в котором содержатся установленные отборы.
В процессе разработки может возникнуть необходимость прочитать эти настройки, внести в них изменения из кода и применить их обратно к списку. Однако при попытке программно перезаписать данные настройки разработчики сталкиваются с тем, что форма списка не обновляется. Рассмотрим подробно, почему так происходит и как правильно решить эту задачу.
Проанализируем базовый код, который часто пытаются использовать для решения задачи:
Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
НовыйОтбор = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
НовыйОтбор.Использование = Истина;
НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Дата1");
НовыйОтбор.ПравоеЗначение = ТекущаяДата();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Данный подход не приводит к обновлению динамического списка на форме по следующим причинам:
ПолучитьИсполняемуюСхемуКомпоновкиДанных() и ПолучитьИсполняемыеНастройкиКомпоновкиДанных() возвращают слепок (копию) текущего состояния списка. Они предназначены исключительно для чтения текущих настроек — например, для выгрузки данных, расчета итогов или печати. Изменение объекта НастройкиКомпоновкиДанных, полученного таким способом, не оказывает никакого влияния на сам элемент формы.ПроцессорВывода.Вывести() выводит результат компоновки в табличный документ или коллекцию значений в памяти, но не связан с отображением динамического списка на форме.Чтобы программно наложить отбор на динамический список и обновить отображаемые в нем данные, необходимо изменять свойства объекта КомпоновщикНастроек самого списка (реквизита формы), а не исполняемые настройки элемента формы.
Если отбор должен применяться программно и пользователь не должен имееть возможности случайно его отключить через стандартную панель, используем ФиксированныеНастройки:
// Получаем коллекцию отборов фиксированных настроек
КоллекцияОтбора = Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор;
// Добавляем новый элемент отбора
ЭлементОтбора = КоллекцияОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Дата1");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = ТекущаяДата();
ЭлементОтбора.Использование = Истина;
// Обновляем отображение динамического списка
Элементы.Список.Обновить();
Если требуется, чтобы программно установленный отбор отображался у пользователя в окне настройки списка или в блоке быстрых фильтров и мог быть изменен или отключен вручную, добавляем его в ПользовательскиеНастройки:
// Поиск или добавление элемента в пользовательские настройки
ЭлементОтбора = Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Дата1");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = ТекущаяДата();
ЭлементОтбора.Использование = Истина;
// Обновляем список на форме
Элементы.Список.Обновить();
Если разработка ведется в типовой конфигурации, где подключена БСП, рекомендуется использовать готовые функции общего модуля ОбщегоНазначенияКлиентСервер. Это сокращает объем кода и предотвращает дублирование отборов:
// Установка отбора с помощью функции БСП
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(
Список.КомпоновщикНастроек.Отбор,
"Дата1",
ВидСравненияКомпоновкиДанных.Равно,
ТекущаяДата()
);
// Принудительно обновляем данные в элементе формы
Элементы.Список.Обновить();
При работе с динамическими списками важно разделять получение текущих исполняемых данных и управление настройками списка:
ПолучитьИсполняемыеНастройкиКомпоновкиДанных() подходят только для чтения текущего состояния (включая поиск Alt+F).Список.КомпоновщикНастроек и вызывать метод Элементы.Список.Обновить().