Как открыть форму списка документов с отбором по интервалу дат в 1С?

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

При разработке подсистем и обработок часто возникает необходимость открыть форму списка документов с предварительно установленным фильтром по дате (например, за определенный период с даты начала по дату окончания). Способ решения этой задачи существенно отличается в зависимости от используемой архитектуры форм: обычных форм (платформы 1С 8.1, 8.2) или управляемых форм (платформа 1С 8.3, включая конфигурации УНФ, ERP, УТ и БП).

Рассмотрим подробно оба варианта и проанализируем особенности реализации для каждого из них.

Решение для обычных форм (1С 8.1 / 8.2)

В обычных формах отбор настраивается напрямую у объекта формы или у табличного поля. Для установки интервала дат применяется объект отбора, у которого задается вид сравнения ВидСравнения.Интервал, а также значение начала и конца периода.

Разберем по шагам алгоритм действий:

  1. Получаем объект формы списка нужного документа через менеджер документа с помощью метода ПолучитьФормуСписка().
  2. Включаем использование отбора по полю Дата, установив свойство Использование = Истина.
  3. Задаем вид сравнения ВидСравнения.Интервал.
  4. Указываем начальное и конечное значение периода с помощью свойств ЗначениеС и ЗначениеПо. Чтобы в интервал корректно попали все документы крайних дней, приводим границы к НачалоДня() и КонецДня().
  5. Открываем форму с помощью метода Открыть().

Посмотрим на пример программного кода для обычного приложения:


ФормаСписка = Документы.Командировка.ПолучитьФормуСписка();

ФормаСписка.Отбор.Дата.Использование = Истина;
ФормаСписка.Отбор.Дата.ВидСравнения = ВидСравнения.Интервал;
ФормаСписка.Отбор.Дата.ЗначениеС = НачалоДня(ДатаНачала);
ФормаСписка.Отбор.Дата.ЗначениеПо = КонецДня(ДатаКонца);

Если Не ФормаСписка.Открыта() Тогда
    ФормаСписка.Открыть();
КонецЕсли;

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


ПолеВвода1 = НачалоДня(ДатаНачала);
ПолеВвода2 = КонецДня(ДатаКонца);

ФормаСписка = Документы.РеализацияТоваровУслуг.ПолучитьФормуСписка();
ФормаСписка.ДокументСписок.Отбор.Дата.ВидСравнения = ВидСравнения.Интервал;
ФормаСписка.ДокументСписок.Отбор.Дата.Использование = Истина;
ФормаСписка.ДокументСписок.Отбор.Дата.ЗначениеС = ПолеВвода1;
ФормаСписка.ДокументСписок.Отбор.Дата.ЗначениеПо = ПолеВвода2;

Если Не ФормаСписка.Открыта() Тогда
    ФормаСписка.Открыть();
КонецЕсли;

Решение для управляемых форм (1С 8.3 / УНФ)

В управляемом интерфейсе платформы 1С 8.3 концепция работы со списками изменилась. Основным реквизитом форм списков является ДинамическийСписок, работающий на базе Системы компоновки данных (СКД).

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

Рассмотрим основные способы установки отбора по интервалу дат в управляемых формах.

Способ 1. Использование параметра ФиксированныеНастройки или ПользовательскиеНастройки

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

Проанализируем пример формирования фиксированных настроек перед вызовом ОткрытьФорму():


Настройки = Новый НастройкиКомпоновкиДанных;

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

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

ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ФиксированныеНастройки", Настройки);

ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаСписка", ПараметрыФормы);

Способ 2. Передача параметров и программная обработка на сервере

Альтернативный подход заключается в передаче произвольных параметров (например, ДатаНачала и ДатаКонца) в форму списка и их обработке в модуле открываемой формы на сервере.

На клиенте перед вызовом формы передаем параметры периода:


ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ДатаНачала", НачалоДня(ДатаНачала));
ПараметрыФормы.Вставить("ДатаКонца", КонецДня(ДатаКонца));

ОткрытьФорму("Документ.Командировка.ФормаСписка", ПараметрыФормы);

В модуле открываемой формы списка документов в обработчике ПриСозданииНаСервере считываем параметры и настраиваем элемент отбора динамического списка (с использованием функций БСП):


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

Важные особенности при работе с датами и фильтрами

Выясним ключевые нюансы, о которых важно помнить при реализации отборов по датам:

  1. Учет времени в дате: Реквизит Дата у документов в 1С всегда содержит время. Если не приводить левую границу к НачалоДня(), а правую — к КонецДня(), то документы за крайний день интервала могут не попасть в результаты фильтрации.
  2. Повторный вызов формы: Если форма списка уже открыта в текущем сеансе, повторный вызов ОткрытьФорму() без передачи параметра КлючУникальности просто активирует существующую форму. Новые параметры отбора при этом не применятся повторно автоматически.
  3. Оптимизация скорости работы: В динамических списках с большой базой данных фильтрация поверх сложного запроса может приводить к замедлению. Если динамический список построен на базе виртуальных таблиц, эффективнее передавать границы интервала прямо в параметры виртуальной таблицы (&НачалоПериода и &КонецПериода).
← На главную