Форма выбора даты и времени
📝 Описание
Стандартные формы выбора даты не предполагают выбор времени — его нужно вводить вручную в поле ввода. Для удобства можно создать собственную форму и вызывать её при выборе даты в поле ввода.
🛠 Создание формы, параметров, реквизитов
-
Создаём новую форму с реквизитами:
День
(тип: Дата)Часы
(тип: Число)Минуты
(тип: Число)
-
Размещаем реквизиты на форме и объединяем их в группу с горизонтальной группировкой.
-
Создаём ключевой параметр
Дата
(тип: Дата, состав: Дата и время), в который будем передавать исходную дату в форму извне.
-
Для реквизитов
Часы
иМинуты
устанавливаем вид как «Поле переключателя» с видом переключателя «Тумблер». -
Для
Часы
определяем список выбора и устанавливаем количество колонок = 2.
-
Для
Минуты
делаем аналогично, но количество колонок = 1 и список выбора немного другой. -
Добавляем команду
Выбрать
и размещаем её на командной панели. -
Добавляем декорацию
Представление времени
, настраиваем шрифт, цвет и прочее. Эта декорация будет показывать выбранные значения.
🧩 Модуль формы
Обработчики событий формы
&НаСервереПроцедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Если ЗначениеЗаполнено(Параметры.Дата) Тогда СтруктураДаты = СтруктураДаты(Параметры.Дата); День = Параметры.Дата; Часы = СтруктураДаты.Час; Минуты = СтруктураДаты.Минута; Иначе День = ТекущаяДатаСеанса(); Часы = 8; Минуты = 0; КонецЕсли;КонецПроцедуры
&НаКлиентеПроцедура ПриОткрытии(Отказ) ОбновитьДекорациюВыбранноеВремя();КонецПроцедуры
Обработчики событий элементов шапки формы
&НаКлиентеПроцедура ДеньВыбор(Элемент, ВыбраннаяДата) ВыбратьДатуВремя();КонецПроцедуры
&НаКлиентеПроцедура ДеньПриИзменении(Элемент) ОбновитьДекорациюВыбранноеВремя();КонецПроцедуры
&НаКлиентеПроцедура ЧасыПриИзменении(Элемент) ОбновитьДекорациюВыбранноеВремя();КонецПроцедуры
&НаКлиентеПроцедура МинутыПриИзменении(Элемент) ОбновитьДекорациюВыбранноеВремя();КонецПроцедуры
Обработчики команд формы
&НаКлиентеПроцедура Выбрать(Команда) ВыбратьДатуВремя();КонецПроцедуры
Служебные процедуры и функции
&НаКлиентеПроцедура ВыбратьДатуВремя() СтруктураДаты = СтруктураДаты(День); ВыбраннаяДатаВремя = Дата(СтруктураДаты.Год, СтруктураДаты.Месяц, СтруктураДаты.День, Часы, Минуты, 0); ОповеститьОВыборе(ВыбраннаяДатаВремя);КонецПроцедуры
&НаКлиентеПроцедура ОбновитьДекорациюВыбранноеВремя() ВыбранноеВремя = СтрШаблон("Выбрано: %1 %2 ч. %3 мин.", Формат(День, "ДФ='дд ММММ гггг "г."'"), Формат(Часы, "ЧЦ=2; ЧН=00; ЧВН="), Формат(Минуты, "ЧЦ=2; ЧН=00; ЧВН=")); Элементы.ПредставлениеВремени.Заголовок = ВыбранноеВремя;КонецПроцедуры
&НаКлиентеФункция СтруктураДаты(Дата) Экспорт Структура = Новый Структура; Структура.Вставить("Год", 1); Структура.Вставить("Месяц", 1); Структура.Вставить("День", 1); Структура.Вставить("Час", 0); Структура.Вставить("Минута", 0); Структура.Вставить("Секунда", 0); Если ТипЗнч(Дата) = Тип("Дата") Тогда Структура.Год = Год(Дата); Структура.Месяц = Месяц(Дата); Структура.День = День(Дата); Структура.Час = Час(Дата); Структура.Минута = Минута(Дата); Структура.Секунда = Секунда(Дата); КонецЕсли; Возврат Структура;КонецФункции
🚀 Вызов формы
Определяем два обработчика событий произвольного реквизита формы с типом дата — НачалоВыбора
и ОбработкаВыбора
.
В обработчике НачалоВыбора
вызываем нашу форму. При вызове владельцем нужно указать элемент формы, который инициировал выбор.
&НаКлиентеПроцедура ДатаВремяУбытияНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("Дата", Объект.ДатаВремяУбытия);
ОткрытьФорму("ОбщаяФорма.УТЗ_ПЛ_ВыборСтантартногоПериодаСоВременем", ПараметрыФормы, Элементы.ДатаВремяУбытия, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиентеПроцедура ДатаВремяУбытияОбработкаВыбора(Элемент, ВыбранноеЗначение, ДополнительныеДанные, СтандартнаяОбработка)
Если ЗначениеЗаполнено(ВыбранноеЗначение) Тогда Объект.ДатаВремяУбытия = ВыбранноеЗначение; КонецЕсли;
КонецПроцедуры