Как обновить параметры динамического списка при нажатии кнопки «Обновить» или по таймеру?

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

При разработке управляемых форм в платформе 1С:Предприятие 8.3 часто возникает задача: в динамический список передается динамический параметр (например, текущая дата или время), однако при стандартном интерактивном обновлении списка (по кнопке «Обновить» или клавише F5) значение параметра не меняется и остается равным тому, которое было установлено при открытии формы. Разберем особенности работы платформы и рассмотрим рабочие способы решения этой задачи.

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

Проанализируем механику работы динамического списка. При открытии формы в процедуре ПриСозданииНаСервере мы программно инициализируем параметры запроса списка. Когда пользователь нажимает стандартную кнопку «Обновить» в командной панели таблицы или нажимает клавишу F5, платформа выполняет повторный запрос к СУБД с теми параметрами, которые уже сохранены в объекте динамического списка. При этом никакие серверные события формы (такие как ПриСозданииНаСервере или ПриЧтенииНаСервере) не вызываются.

Событие ПриПолученииДанныхНаСервере также не подходит для изменения параметров: оно вызывается уже после выполнения основного запроса к базе данных и предназначено исключительно для постобработки и визуального оформления полученных строк. Изменение параметров внутри него не пересчитает текущую выборку и приведет к ошибкам.

Поэтому переустановить параметр динамического списка можно только явно, до момента выполнения метода Обновить().

Способ 1. Переопределение стандартной команды «Обновить»

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

  1. Открываем форму списка и свойства командной панели динамического списка. Отключаем автоматическое добавление стандартной кнопки «Обновить» (или отключаем ее видимость).
  2. Создаем новую команду формы, например ОбновитьДанные, и назначаем ей сочетание клавиш F5.
  3. Размещаем созданную команду на командной панели.
  4. В обработчике команды на клиенте вызываем серверную процедуру для переустановки параметров, после чего обновляем отображение таблицы.

Посмотрим на пример программной реализации:


&НаСервере
Процедура ОбновитьСписокНаСервере()
    // Переустанавливаем параметр в актуальное значение
    Список.Параметры.УстановитьЗначениеПараметра("ТекущаяДата", ТекущаяДатаСеанса());
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьДанные(Команда)
    ОбновитьСписокНаСервере();
    Элементы.Список.Обновить();
КонецПроцедуры

Обратите внимание: для корректной работы в клиент-серверном режиме и базах с пользователями из разных часовых поясов рекомендуется использовать функцию ТекущаяДатаСеанса() вместо ТекущаяДата(), чтобы расчет велся с учетом времени клиентского сеанса.

Способ 2. Автоматическое обновление через обработчик ожидания

В сценариях, когда список должен обновляться автоматически через равные промежутки времени (например, на рабочих местах диспетчеров, складов или мониторов заказов), стандартное свойство таблицы «Автообновление» не подойдет, так как оно лишь перезапрашивает данные со старыми параметрами. В этом случае используем обработчик ожидания.

Разберем реализацию фонового обновления:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Подключаем обработчик с интервалом обновления, например, 60 секунд
    ПодключитьОбработчикОжидания("ФоновоеОбновлениеСписка", 60);
КонецПроцедуры

&НаСервере
Процедура ОбновитьПараметрыСпискаНаСервере()
    Список.Параметры.УстановитьЗначениеПараметра("ТекущаяДата", ТекущаяДатаСеанса());
КонецПроцедуры

&НаКлиенте
Процедура ФоновоеОбновлениеСписка()
    ОбновитьПараметрыСпискаНаСервере();
    Элементы.Список.Обновить();
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
    // Обязательно отключаем обработчик при закрытии формы
    ОтключитьОбработчикОжидания("ФоновоеОбновлениеСписка");
КонецПроцедуры

Способ 3. Использование стандартных периодов компоновщика настроек

Рассмотрим альтернативный вариант: если параметр в запросе динамического списка используется для ограничения данных по текущему дню (например, «заказы за сегодня»), более надежным подходом является отказ от жестких параметров запроса в пользу отбора через КомпоновщикНастроек.

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

← На главную