Как программно изменить отбор и обновить динамический список в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с динамическими списками на управляемых формах пользователи часто используют удобные механизмы быстрых фильтров — например, интерактивный поиск по сочетанию клавиш Alt+F. В результате такого поиска платформа создает специальное «Состояние просмотра», в котором содержатся установленные отборы.

В процессе разработки может возникнуть необходимость прочитать эти настройки, внести в них изменения из кода и применить их обратно к списку. Однако при попытке программно перезаписать данные настройки разработчики сталкиваются с тем, что форма списка не обновляется. Рассмотрим подробно, почему так происходит и как правильно решить эту задачу.

Выясним причину: почему исполняемые настройки работают только на чтение

Проанализируем базовый код, который часто пытаются использовать для решения задачи:


Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных(); 
Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных(); 

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

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных(); 
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки); 
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; 
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки); 

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; 
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Данный подход не приводит к обновлению динамического списка на форме по следующим причинам:

  1. Односторонняя связь методов: Методы ПолучитьИсполняемуюСхемуКомпоновкиДанных() и ПолучитьИсполняемыеНастройкиКомпоновкиДанных() возвращают слепок (копию) текущего состояния списка. Они предназначены исключительно для чтения текущих настроек — например, для выгрузки данных, расчета итогов или печати. Изменение объекта НастройкиКомпоновкиДанных, полученного таким способом, не оказывает никакого влияния на сам элемент формы.
  2. Отсутствие API для записи в «Состояние просмотра»: В платформе 1С отсутствует программный интерфейс для прямой записи значений в блоки строки поиска и интерактивного состояния просмотра (Alt+F). Эти механизмы являются чисто пользовательскими и управляются внутренними алгоритмами платформы.
  3. Назначение процессоров вывода: Вызов ПроцессорВывода.Вывести() выводит результат компоновки в табличный документ или коллекцию значений в памяти, но не связан с отображением динамического списка на форме.

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

Чтобы программно наложить отбор на динамический список и обновить отображаемые в нем данные, необходимо изменять свойства объекта КомпоновщикНастроек самого списка (реквизита формы), а не исполняемые настройки элемента формы.

Вариант 1. Использование фиксированных настроек (жесткое ограничение)

Если отбор должен применяться программно и пользователь не должен имееть возможности случайно его отключить через стандартную панель, используем ФиксированныеНастройки:


// Получаем коллекцию отборов фиксированных настроек
КоллекцияОтбора = Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор;

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

// Обновляем отображение динамического списка
Элементы.Список.Обновить();

Вариант 2. Использование пользовательских настроек (управляемый отбор)

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


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

// Обновляем список на форме
Элементы.Список.Обновить();

Использование функций Библиотеки Стандартных Подсистем (БСП)

Если разработка ведется в типовой конфигурации, где подключена БСП, рекомендуется использовать готовые функции общего модуля ОбщегоНазначенияКлиентСервер. Это сокращает объем кода и предотвращает дублирование отборов:


// Установка отбора с помощью функции БСП
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(
    Список.КомпоновщикНастроек.Отбор,
    "Дата1",
    ВидСравненияКомпоновкиДанных.Равно,
    ТекущаяДата()
);

// Принудительно обновляем данные в элементе формы
Элементы.Список.Обновить();

Подведем итоги

При работе с динамическими списками важно разделять получение текущих исполняемых данных и управление настройками списка:

  1. Методы ПолучитьИсполняемыеНастройкиКомпоновкиДанных() подходят только для чтения текущего состояния (включая поиск Alt+F).
  2. Записать измененные настройки обратно в служебный блок «Состояние просмотра» платформенными средствами нельзя.
  3. Для изменения выборки и обновления списка всегда необходимо вносить изменения в Список.КомпоновщикНастроек и вызывать метод Элементы.Список.Обновить().
← На главную