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