Как ввести две даты с временем в 1С 8.3: стандартные диалоги и создание собственных решений

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

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

Использование Диалога редактирования стандартного периода

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

Рассмотрим по шагам, как программно вызвать этот диалог и обработать результат в управляемых формах. Проанализируем пример кода:


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

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

Важное ограничение: Выясним причину, почему этот метод не всегда подходит. Объект СтандартныйПериод всегда нормализует время: дата начала устанавливается на 00:00:00, а дата окончания — на 23:59:59. Если пользователю критично ввести время (например, начало смены в 08:30), данный диалог «обрежет» эти данные.

Последовательный ввод через цепочку оповещений

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


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

&НаКлиенте
Процедура ПослеВводаПервойДаты(ВыбраннаяДата, ОповещениеОкончания) Экспорт
    
    Если ВыбраннаяДата <> Неопределено Тогда
        ЭтаФорма.ДатаНачала = ВыбраннаяДата;
        // Вызываем второй диалог, передавая введенную дату как начальное значение
        ПоказатьВводДаты(ОповещениеОкончания, ВыбраннаяДата, "Выберите дату и время окончания", ЧастиДаты.ДатаВремя);
    КонецЕсли;
    
КонецПроцедуры

&НаКлиенте
Процедура ПослеВводаВторойДаты(ВыбраннаяДата, ДополнительныеПараметры) Экспорт
    
    Если ВыбраннаяДата <> Неопределено Тогда
        ЭтаФорма.ДатаОкончания = ВыбраннаяДата;
        // Здесь можно добавить проверку, чтобы дата окончания не была меньше даты начала
    КонецЕсли;
    
КонецПроцедуры

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

Создание собственной формы ввода (Рекомендованный способ)

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

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

Преимущества собственной формы очевидны:

Типичные ошибки при реализации

Разберем ошибку, которая часто встречается у начинающих разработчиков при копировании примеров кода (как это было в сообщении 7 обсуждения). Ошибка "Переменная не определена (Объект)" возникает, когда код, написанный для формы справочника или документа, переносится в форму обработки или общую форму.

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

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

← На главную