Разработка и Конфигурация · 9 мин
Как открыть форму выбора периода в 1С
Как открыть форму выбора периода в 1С: диалог редактирования стандартного периода, код для управляемых и обычных форм, обработка результата и ошибки.
Выбор периода — одна из самых частых операций в 1С: он нужен в отчётах, обработках, журналах документов и при отборе данных. Платформа предоставляет готовый механизм — стандартный диалог выбора периода, который не нужно рисовать вручную. Достаточно вызвать объект ДиалогРедактированияСтандартногоПериода, передать в него начальные значения и обработать результат.
Способ вызова зависит от режима работы: в управляемом приложении используется асинхронный метод Показать() с описанием оповещения, а в обычных формах — синхронный метод Редактировать(). Ниже разобраны оба варианта, работа с датами напрямую и типовые ошибки, из-за которых диалог открывается пустым или не возвращает результат.
Что такое стандартный период и зачем нужен диалог
Стандартный период — это объект типа СтандартныйПериод, который хранит две даты: начало и конец интервала. Он используется в отчётах на СКД, динамических списках и типовых механизмах отбора. У объекта есть два ключевых свойства: ДатаНачала и ДатаОкончания.
Диалог редактирования стандартного периода — встроенное окно платформы, в котором пользователь может выбрать произвольные даты или воспользоваться предустановленными вариантами: сегодня, эта неделя, этот месяц, этот квартал, этот год и другие. Возможность выбора предустановленных вариантов — главное преимущество стандартного диалога перед самостоятельно нарисованной формой с двумя полями дат.
Как открыть диалог в управляемом приложении
В управляемых формах модальный вызов запрещён, поэтому диалог открывается асинхронно через метод Показать(). Результат приходит в отдельную процедуру — обработчик оповещения. Типовой код выглядит так:
&НаКлиенте
Процедура ВыбратьПериод(Команда)
Диалог = Новый ДиалогРедактированияСтандартногоПериода();
Диалог.Период = Период; // реквизит формы типа СтандартныйПериод
Оповещение = Новый ОписаниеОповещения("ВыбратьПериодЗавершение", ЭтотОбъект);
Диалог.Показать(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ВыбратьПериодЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> Неопределено Тогда
Период = Результат;
КонецЕсли;
КонецПроцедуры
Обратите внимание: если пользователь нажмёт «Отмена», в обработчик придёт Неопределено, и значение реквизита менять не нужно. Проверка результата обязательна — без неё отмена выбора обнулит ваш период.
- 1Добавьте на форму реквизит типа СтандартныйПериод
- 2В команде создайте ДиалогРедактированияСтандартногоПериода и присвойте ему текущий период
- 3Сформируйте ОписаниеОповещения с именем процедуры-обработчика
- 4Вызовите Диалог.Показать(Оповещение)
- 5В обработчике проверьте, что результат не Неопределено, и сохраните период
Как открыть диалог в обычных формах
В обычном приложении (и в режиме совместимости) доступен синхронный метод Редактировать(). Он возвращает Истина, если пользователь подтвердил выбор, и Ложь при отмене. Новое значение записывается прямо в свойство Период диалога:
Диалог = Новый ДиалогРедактированияСтандартногоПериода;
Диалог.Период.ДатаНачала = НачалоМесяца(ТекущаяДата());
Диалог.Период.ДатаОкончания = КонецМесяца(ТекущаяДата());
Если Диалог.Редактировать() Тогда
НачалоПериода = Диалог.Период.ДатаНачала;
КонецПериода = Диалог.Период.ДатаОкончания;
КонецЕсли;
Такой код короче, но работает только там, где разрешён модальный режим. Если конфигурация запускается в управляемом приложении, вызов Редактировать() завершится ошибкой «Использование модальных окон в данном режиме запрещено».
Как задать период по умолчанию перед открытием
Если открыть диалог с пустым периодом, пользователь увидит незаполненные даты, что неудобно. Практичное решение — подставлять осмысленное значение по умолчанию: текущий месяц, текущий день или последний использованный период, сохранённый в настройках.
Для заполнения удобно использовать функции работы с датами: НачалоМесяца(), КонецМесяца(), НачалоКвартала(), КонецГода(). Важно помнить: дата окончания должна включать конец дня, иначе документы, проведённые в последний день периода после 00:00, не попадут в выборку. Функция КонецМесяца() уже возвращает время 23:59:59, а вот ручное присвоение даты без времени даст 00:00:00 — это частая причина «пропавших» документов.
Альтернатива: выбор двух дат вместо стандартного периода
Иногда в форме хранятся два отдельных реквизита типа «Дата», а не один стандартный период. В этом случае диалог всё равно можно использовать: перед открытием соберите из дат временный объект СтандартныйПериод, а после выбора разложите результат обратно по реквизитам.
Другой вариант — вообще обойтись без диалога и дать пользователю два поля ввода даты на форме плюс выпадающий список быстрых вариантов («Месяц», «Квартал», «Год») с программным заполнением. Это оправдано, когда период всегда типовой и произвольные даты не нужны. Но в большинстве случаев стандартный диалог удобнее: он уже локализован, проверен и знаком пользователям по типовым отчётам.
Сравнение вариантов
Готовое окно платформы с предустановленными периодами. Подходит почти всегда; ограничение — нужен асинхронный вызов в управляемых формах.
Полный контроль над интерфейсом, но предустановленные варианты придётся программировать самостоятельно.
В отчётах на СКД период выбирается штатно через пользовательские настройки, отдельный диалог не нужен.
Типичные ошибки и их устранение
Разработчики при работе с диалогом периода чаще всего сталкиваются с несколькими повторяющимися проблемами. Первая — отсутствие проверки результата в обработчике оповещения: при нажатии «Отмена» период затирается пустым значением. Вторая — передача в диалог локальной переменной вместо реквизита формы, из-за чего выбранное значение теряется после закрытия обработчика.
Третья группа ошибок связана с границами дат: дата окончания без времени, перепутанные начало и конец (диалог позволяет ввести период «наоборот», если даты заданы программно с ошибкой), а также пустая дата начала, которая в запросах интерпретируется как «с начала времён» и резко замедляет выборку.
Как проверить, что всё работает правильно
После внедрения кода проверьте три сценария. Первый: выберите период и подтвердите — значения в реквизитах формы должны обновиться, причём дата окончания должна содержать время 23:59:59. Второй: откройте диалог и нажмите «Отмена» — прежний период должен сохраниться без изменений. Третий: повторно откройте диалог — он должен показать ранее выбранный период, а не пустые даты.
Если период используется в запросе или динамическом списке, дополнительно убедитесь, что в выборку попадают документы первого и последнего дня периода. Это самый надёжный способ поймать ошибку с границами дат до того, как её заметят пользователи.
Как проверить результат
Реквизиты формы обновились, дата окончания содержит 23:59:59
Период пустой или обрезан по времени
Прежний период сохранился
Период обнулился
Диалог показывает текущий выбранный период
Диалог открывается с пустыми датами
Что важно запомнить
Используйте ДиалогРедактированияСтандартногоПериода: в управляемых формах — Показать() с оповещением и проверкой результата, в обычных — Редактировать(). Задавайте период по умолчанию и следите, чтобы дата окончания включала конец дня.
Частые вопросы
Чем отличается Показать() от Редактировать()?
Редактировать() — синхронный модальный метод для обычных форм, он сразу возвращает Истина или Ложь. Показать() — асинхронный метод для управляемого приложения: результат приходит в отдельную процедуру через описание оповещения. В управляемом режиме Редактировать() вызовет ошибку.
Как открыть диалог, если в форме две отдельные даты, а не СтандартныйПериод?
Создайте временный объект СтандартныйПериод, заполните его из ваших реквизитов, передайте в диалог, а в обработчике оповещения запишите ДатаНачала и ДатаОкончания результата обратно в свои реквизиты.
Почему в отбор не попадают документы последнего дня периода?
Почти всегда причина в том, что дата окончания задана без времени и равна 00:00:00. Используйте КонецДня() или КонецМесяца(), чтобы граница периода включала весь последний день.
Можно ли ограничить список предустановленных вариантов в диалоге?
Стандартный диалог не позволяет настроить состав вариантов — он показывает фиксированный набор платформы. Если нужен свой набор быстрых периодов, придётся делать собственную форму выбора с полями дат и кнопками-вариантами.
Нужен ли этот диалог в отчётах на СКД?
Нет. В отчётах на компоновке данных период добавляется в пользовательские настройки, и платформа сама показывает стандартный выбор периода в панели настроек отчёта. Собственный код требуется только для произвольных форм и обработок.