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

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

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

Разберем типичные ошибки, возникающие при попытке задать период, выясним особенности работы платформы с динамическими списками и рассмотрим проверенные способы установки интервала.

В чем заключается частая ошибка разработчиков?

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

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

Способ 1. Установка периода через элемент формы

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

Рассмотрим по шагам, как задать период непосредственно в форме списка:

  1. Создаем новый объект типа СтандартныйПериод.
  2. Задаем необходимые границы интервала дат.
  3. Присваиваем сформированный период свойству Период элемента таблицы формы.

Проанализируем пример кода на сервере (например, в обработчике ПриСозданииНаСервере):


Интервал = Новый СтандартныйПериод;
Интервал.ДатаНачала = НачалоДня(ТекущаяДата());
Интервал.ДатаОкончания = КонецДня(ТекущаяДата());

// Применяем период к элементам формы (где "Список" - имя таблицы на форме)
Элементы.Список.Период = Интервал;

Способ 2. Передача периода при открытии формы через параметры

Если форму списка требуется открыть из другого места (например, из обработки или другого документа) с уже установленным периодом, необходимо передать параметры в процедуру ОткрытьФорму().

Платформа 1С не имеет встроенного предопределенного параметра Период при вызове формы списка, поэтому передачу и прием параметра следует реализовать явно.

Шаг 1. На стороне вызывающего кода формируем структуру параметров и передаем объект СтандартныйПериод:


ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("Период", Новый СтандартныйПериод(ВариантСтандартногоПериода.ЭтотМесяц));

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

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Параметры.Свойства("Период") И ЗначениеЗаполнено(Параметры.Период) Тогда
        Элементы.Список.Период = Параметры.Период;
    КонецЕсли;
КонецПроцедуры

Ограничения и важные особенности работы периода

При работе со стандартным периодом динамического списка следует учитывать несколько критически важных условий платформы 1С:

1. Наличие основной таблицы. Штатная кнопка и механизм периода работают только тогда, когда у динамического списка заполнено свойство ОсновнаяТаблица (например, Документ.РеализацияТоваровУслуг). Если список построен на произвольном запросе без указания основной таблицы, платформенный механизм периода недоступен.

2. Работа с произвольными запросами. Если динамический список использует запрос с параметрами периода (например, &ДатаНач и &ДатаКон), устанавливать их следует через параметры списка:


Список.Параметры.УстановитьЗначениеПараметра("ДатаНач", НачалоМесяца(ТекущаяДата()));
Список.Параметры.УстановитьЗначениеПараметра("ДатаКон", КонецМесяца(ТекущаяДата()));

Для интерактивного изменения такого периода пользователем потребуется вывести на форму отдельный реквизит с типом СтандартныйПериод и обновлять параметры запроса в его событии ПриИзменении.

← На главную