К статье
Практический материал

Разработка и Конфигурация · 9 мин

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

Как открыть форму выбора периода в 1С: диалог редактирования стандартного периода, код для управляемых и обычных форм, обработка результата и ошибки.

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

Способ вызова зависит от режима работы: в управляемом приложении используется асинхронный метод Показать() с описанием оповещения, а в обычных формах — синхронный метод Редактировать(). Ниже разобраны оба варианта, работа с датами напрямую и типовые ошибки, из-за которых диалог открывается пустым или не возвращает результат.

Что такое стандартный период и зачем нужен диалог

Стандартный период — это объект типа СтандартныйПериод, который хранит две даты: начало и конец интервала. Он используется в отчётах на СКД, динамических списках и типовых механизмах отбора. У объекта есть два ключевых свойства: ДатаНачала и ДатаОкончания.

Диалог редактирования стандартного периода — встроенное окно платформы, в котором пользователь может выбрать произвольные даты или воспользоваться предустановленными вариантами: сегодня, эта неделя, этот месяц, этот квартал, этот год и другие. Возможность выбора предустановленных вариантов — главное преимущество стандартного диалога перед самостоятельно нарисованной формой с двумя полями дат.

Как открыть диалог в управляемом приложении

В управляемых формах модальный вызов запрещён, поэтому диалог открывается асинхронно через метод Показать(). Результат приходит в отдельную процедуру — обработчик оповещения. Типовой код выглядит так:

&НаКлиенте

Процедура ВыбратьПериод(Команда)

Диалог = Новый ДиалогРедактированияСтандартногоПериода();

Диалог.Период = Период; // реквизит формы типа СтандартныйПериод

Оповещение = Новый ОписаниеОповещения("ВыбратьПериодЗавершение", ЭтотОбъект);

Диалог.Показать(Оповещение);

КонецПроцедуры

&НаКлиенте

Процедура ВыбратьПериодЗавершение(Результат, ДополнительныеПараметры) Экспорт

Если Результат <> Неопределено Тогда

Период = Результат;

КонецЕсли;

КонецПроцедуры

Обратите внимание: если пользователь нажмёт «Отмена», в обработчик придёт Неопределено, и значение реквизита менять не нужно. Проверка результата обязательна — без неё отмена выбора обнулит ваш период.

Порядок действий в управляемой форме
  1. 1
    Добавьте на форму реквизит типа СтандартныйПериод
  2. 2
    В команде создайте ДиалогРедактированияСтандартногоПериода и присвойте ему текущий период
  3. 3
    Сформируйте ОписаниеОповещения с именем процедуры-обработчика
  4. 4
    Вызовите Диалог.Показать(Оповещение)
  5. 5
    В обработчике проверьте, что результат не Неопределено, и сохраните период

Как открыть диалог в обычных формах

В обычном приложении (и в режиме совместимости) доступен синхронный метод Редактировать(). Он возвращает Истина, если пользователь подтвердил выбор, и Ложь при отмене. Новое значение записывается прямо в свойство Период диалога:

Диалог = Новый ДиалогРедактированияСтандартногоПериода;

Диалог.Период.ДатаНачала = НачалоМесяца(ТекущаяДата());

Диалог.Период.ДатаОкончания = КонецМесяца(ТекущаяДата());

Если Диалог.Редактировать() Тогда

НачалоПериода = Диалог.Период.ДатаНачала;

КонецПериода = Диалог.Период.ДатаОкончания;

КонецЕсли;

Такой код короче, но работает только там, где разрешён модальный режим. Если конфигурация запускается в управляемом приложении, вызов Редактировать() завершится ошибкой «Использование модальных окон в данном режиме запрещено».

Как задать период по умолчанию перед открытием

Если открыть диалог с пустым периодом, пользователь увидит незаполненные даты, что неудобно. Практичное решение — подставлять осмысленное значение по умолчанию: текущий месяц, текущий день или последний использованный период, сохранённый в настройках.

Для заполнения удобно использовать функции работы с датами: НачалоМесяца(), КонецМесяца(), НачалоКвартала(), КонецГода(). Важно помнить: дата окончания должна включать конец дня, иначе документы, проведённые в последний день периода после 00:00, не попадут в выборку. Функция КонецМесяца() уже возвращает время 23:59:59, а вот ручное присвоение даты без времени даст 00:00:00 — это частая причина «пропавших» документов.

Альтернатива: выбор двух дат вместо стандартного периода

Иногда в форме хранятся два отдельных реквизита типа «Дата», а не один стандартный период. В этом случае диалог всё равно можно использовать: перед открытием соберите из дат временный объект СтандартныйПериод, а после выбора разложите результат обратно по реквизитам.

Другой вариант — вообще обойтись без диалога и дать пользователю два поля ввода даты на форме плюс выпадающий список быстрых вариантов («Месяц», «Квартал», «Год») с программным заполнением. Это оправдано, когда период всегда типовой и произвольные даты не нужны. Но в большинстве случаев стандартный диалог удобнее: он уже локализован, проверен и знаком пользователям по типовым отчётам.

Сравнение вариантов

ДиалогРедактированияСтандартногоПериода

Готовое окно платформы с предустановленными периодами. Подходит почти всегда; ограничение — нужен асинхронный вызов в управляемых формах.

Два поля даты на форме

Полный контроль над интерфейсом, но предустановленные варианты придётся программировать самостоятельно.

Настройки СКД

В отчётах на СКД период выбирается штатно через пользовательские настройки, отдельный диалог не нужен.

Типичные ошибки и их устранение

Разработчики при работе с диалогом периода чаще всего сталкиваются с несколькими повторяющимися проблемами. Первая — отсутствие проверки результата в обработчике оповещения: при нажатии «Отмена» период затирается пустым значением. Вторая — передача в диалог локальной переменной вместо реквизита формы, из-за чего выбранное значение теряется после закрытия обработчика.

Третья группа ошибок связана с границами дат: дата окончания без времени, перепутанные начало и конец (диалог позволяет ввести период «наоборот», если даты заданы программно с ошибкой), а также пустая дата начала, которая в запросах интерпретируется как «с начала времён» и резко замедляет выборку.

Типичные ошибки
01
Нет проверки Результат &lt;&gt; Неопределено — отмена выбора обнуляет период
02
Вызов Редактировать() в управляемом приложении — ошибка о запрете модальных окон
03
Дата окончания с временем 00:00:00 — документы последнего дня не попадают в отбор
04
Период хранится в локальной переменной, а не в реквизите формы — значение теряется
05
Пустая дата начала — запросы и отборы работают по всей базе и тормозят

Как проверить, что всё работает правильно

После внедрения кода проверьте три сценария. Первый: выберите период и подтвердите — значения в реквизитах формы должны обновиться, причём дата окончания должна содержать время 23:59:59. Второй: откройте диалог и нажмите «Отмена» — прежний период должен сохраниться без изменений. Третий: повторно откройте диалог — он должен показать ранее выбранный период, а не пустые даты.

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

Контрольные точки

Как проверить результат

Подтверждение выбора
Норма

Реквизиты формы обновились, дата окончания содержит 23:59:59

Тревожный признак

Период пустой или обрезан по времени

Нажатие «Отмена»
Норма

Прежний период сохранился

Тревожный признак

Период обнулился

Повторное открытие диалога
Норма

Диалог показывает текущий выбранный период

Тревожный признак

Диалог открывается с пустыми датами

Итог

Что важно запомнить

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

Частые вопросы

Чем отличается Показать() от Редактировать()?

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

Как открыть диалог, если в форме две отдельные даты, а не СтандартныйПериод?

Создайте временный объект СтандартныйПериод, заполните его из ваших реквизитов, передайте в диалог, а в обработчике оповещения запишите ДатаНачала и ДатаОкончания результата обратно в свои реквизиты.

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

Почти всегда причина в том, что дата окончания задана без времени и равна 00:00:00. Используйте КонецДня() или КонецМесяца(), чтобы граница периода включала весь последний день.

Можно ли ограничить список предустановленных вариантов в диалоге?

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

Нужен ли этот диалог в отчётах на СКД?

Нет. В отчётах на компоновке данных период добавляется в пользовательские настройки, и платформа сама показывает стандартный выбор периода в панели настроек отчёта. Собственный код требуется только для произвольных форм и обработок.