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