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