Skip to content

Форма выбора даты и времени

📝 Описание

Стандартные формы выбора даты не предполагают выбор времени — его нужно вводить вручную в поле ввода. Для удобства можно создать собственную форму и вызывать её при выборе даты в поле ввода.

🛠 Создание формы, параметров, реквизитов

  1. Создаём новую форму с реквизитами:

    • День (тип: Дата)
    • Часы (тип: Число)
    • Минуты (тип: Число)
  2. Размещаем реквизиты на форме и объединяем их в группу с горизонтальной группировкой.

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

Изображение 1.png

  1. Для реквизитов Часы и Минуты устанавливаем вид как «Поле переключателя» с видом переключателя «Тумблер».

  2. Для Часы определяем список выбора и устанавливаем количество колонок = 2.

Изображение 2.png

  1. Для Минуты делаем аналогично, но количество колонок = 1 и список выбора немного другой.

  2. Добавляем команду Выбрать и размещаем её на командной панели.

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

🧩 Модуль формы

Обработчики событий формы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если ЗначениеЗаполнено(Параметры.Дата) Тогда
СтруктураДаты = СтруктураДаты(Параметры.Дата);
День = Параметры.Дата;
Часы = СтруктураДаты.Час;
Минуты = СтруктураДаты.Минута;
Иначе
День = ТекущаяДатаСеанса();
Часы = 8;
Минуты = 0;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ОбновитьДекорациюВыбранноеВремя();
КонецПроцедуры

Обработчики событий элементов шапки формы

&НаКлиенте
Процедура ДеньВыбор(Элемент, ВыбраннаяДата)
ВыбратьДатуВремя();
КонецПроцедуры
&НаКлиенте
Процедура ДеньПриИзменении(Элемент)
ОбновитьДекорациюВыбранноеВремя();
КонецПроцедуры
&НаКлиенте
Процедура ЧасыПриИзменении(Элемент)
ОбновитьДекорациюВыбранноеВремя();
КонецПроцедуры
&НаКлиенте
Процедура МинутыПриИзменении(Элемент)
ОбновитьДекорациюВыбранноеВремя();
КонецПроцедуры

Обработчики команд формы

&НаКлиенте
Процедура Выбрать(Команда)
ВыбратьДатуВремя();
КонецПроцедуры

Служебные процедуры и функции

&НаКлиенте
Процедура ВыбратьДатуВремя()
СтруктураДаты = СтруктураДаты(День);
ВыбраннаяДатаВремя = Дата(СтруктураДаты.Год, СтруктураДаты.Месяц, СтруктураДаты.День, Часы, Минуты, 0);
ОповеститьОВыборе(ВыбраннаяДатаВремя);
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьДекорациюВыбранноеВремя()
ВыбранноеВремя = СтрШаблон("Выбрано: %1 %2 ч. %3 мин.",
Формат(День, "ДФ='дд ММММ гггг "г."'"),
Формат(Часы, "ЧЦ=2; ЧН=00; ЧВН="),
Формат(Минуты, "ЧЦ=2; ЧН=00; ЧВН="));
Элементы.ПредставлениеВремени.Заголовок = ВыбранноеВремя;
КонецПроцедуры
&НаКлиенте
Функция СтруктураДаты(Дата) Экспорт
Структура = Новый Структура;
Структура.Вставить("Год", 1);
Структура.Вставить("Месяц", 1);
Структура.Вставить("День", 1);
Структура.Вставить("Час", 0);
Структура.Вставить("Минута", 0);
Структура.Вставить("Секунда", 0);
Если ТипЗнч(Дата) = Тип("Дата") Тогда
Структура.Год = Год(Дата);
Структура.Месяц = Месяц(Дата);
Структура.День = День(Дата);
Структура.Час = Час(Дата);
Структура.Минута = Минута(Дата);
Структура.Секунда = Секунда(Дата);
КонецЕсли;
Возврат Структура;
КонецФункции

🚀 Вызов формы

Определяем два обработчика событий произвольного реквизита формы с типом дата — НачалоВыбора и ОбработкаВыбора.

В обработчике НачалоВыбора вызываем нашу форму. При вызове владельцем нужно указать элемент формы, который инициировал выбор.

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