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

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

При разработке и доработке форм списков в управляемом приложении 1С разработчики нередко сталкиваются с ситуацией, когда у динамического списка пропадает или вовсе отсутствует стандартная кнопка Установить период. При этом в свойствах списка может быть указана основная таблица, а в составе колонок присутствует поле Дата. Разберем причины такого поведения платформы и рассмотрим способы добавления удобного выбора периода для пользователей.

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

Проанализируем работу механизмов платформы «1С:Предприятие 8.3». Стандартное действие и кнопка интерактивной настройки периода генерируются платформой автоматически только при одновременном выполнении следующих условий:

  1. В свойствах динамического списка отключен флаг Произвольный запрос.
  2. В качестве основной таблицы указан объект, поддерживающий стандартное платформенное управление периодом (например, список документов, журнал документов или периодический регистр).

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

Рассмотрим подробнее доступные варианты реализации.

Способ 1. Добавление реквизита формы с типом СтандартныйПериод

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

Разберем по шагам создание такого элемента:

  1. В редакторе формы перейдем на вкладку Реквизиты и создадим новый реквизит формы, назвав его, например, Период, с типом данных СтандартныйПериод.
  2. Перетащим созданный реквизит в элементы формы — например, в командную панель динамического списка или в специальную группу фильтров над таблицей.
  3. Для созданного элемента формы определим событие ПриИзменении, в котором будет вызываться процедура обновления отбора в списке.

Теперь посмотрим на пример кода, который применяет установленный интервал через компоновщик настроек динамического списка. Управлять условиями лучше всего через фиксированные настройки, чтобы пользовательские манипуляции с поиском не сбрасывали установленный период:


&НаКлиенте
Процедура ПериодПриИзменении(Элемент)
    УстановитьОтборПоПериодуНаСервере();
КонецПроцедуры

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

Способ 2. Программный вызов диалога через команду формы

Если требуется повторить именно поведение отдельной кнопки (без постоянного отображения поля ввода на панели), добавим на форму команду и используем платформенный объект ДиалогРедактированияСтандартногоПериода.

Рассмотрим реализацию вызова диалога на клиенте в асинхронном режиме:

  1. Создадим команду формы, например УстановитьИнтервал, и поместим соответствующую кнопку в командную панель формы.
  2. Создадим на форме реквизит ТекущийПериод с типом СтандартныйПериод для сохранения выбранных дат.
  3. Напишем обработчик команды с открытием системного диалога.

Посмотрим, как выглядит программный вызов:


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

&НаКлиенте
Процедура ПослеВыбораПериода(ВыбранныйПериод, ДополнительныеПараметры) Экспорт
    Если ВыбранныйПериод <> Неопределено Тогда
        ТекущийПериод = ВыбранныйПериод;
        ПрименитьПериодКДинамическомуСписку();
    КонецЕсли;
КонецПроцедуры

Способ 3. Передача периода в параметры запроса динамического списка

Выясним еще один практический вариант: если в динамическом списке используется произвольный запрос со сложными объединениями или виртуальными таблицами, оптимальнее передавать границы дат напрямую в параметры запроса.

В тексте запроса динамического списка пропишем условие:


ГДЕ
    ТаблицаДокументов.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания

В процедуре установки отбора передадим значения в коллекцию Параметры динамического списка:


&НаСервере
Процедура ПрименитьПериодЧерезПараметры()
    ГраницаНачала = ?(ЗначениеЗаполнено(Период.ДатаНачала), Период.ДатаНачала, '00010101');
    ГраницаОкончания = ?(ЗначениеЗаполнено(Период.ДатаОкончания), КонецДня(Период.ДатаОкончания), '39991231235959');
    
    Список.Параметры.УстановитьЗначениеПараметра("ДатаНачала", ГраницаНачала);
    Список.Параметры.УстановитьЗначениеПараметра("ДатаОкончания", ГраницаОкончания);
КонецПроцедуры

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

← На главную