---
title: Форма выбора даты и времени
slug: примеры-сниппеты-общее-управляемые-формы/форма-выбора-даты-и-времени
---
## 📝 Описание

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

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

1. Создаём новую форму с реквизитами:
   - `День` (тип: Дата)
   - `Часы` (тип: Число)
   - `Минуты` (тип: Число)

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

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

![Изображение 1.png](https://sinenikolsky.ru/s/QEWSKmHn7HKGJX4/download?path=%2F2025%2F04%2F16&files=aa602e3a-8359-411c-be66-4df036543426.png)

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

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

![Изображение 2.png](https://sinenikolsky.ru/s/QEWSKmHn7HKGJX4/download?path=%2F2025%2F04%2F16&files=1df97832-daf2-4cae-96e1-3524b06f712f.png)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

```bsl
&НаКлиенте
Процедура ВыбратьДатуВремя()
    СтруктураДаты = СтруктураДаты(День);
    ВыбраннаяДатаВремя = Дата(СтруктураДаты.Год, СтруктураДаты.Месяц, СтруктураДаты.День, Часы, Минуты, 0);
    ОповеститьОВыборе(ВыбраннаяДатаВремя);
КонецПроцедуры

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

&НаКлиенте
Функция СтруктураДаты(Дата) Экспорт
    Структура = Новый Структура;
    Структура.Вставить("Год", 1);
    Структура.Вставить("Месяц", 1);
    Структура.Вставить("День", 1);
    Структура.Вставить("Час", 0);
    Структура.Вставить("Минута", 0);
    Структура.Вставить("Секунда", 0);
    Если ТипЗнч(Дата) = Тип("Дата") Тогда
        Структура.Год = Год(Дата);
        Структура.Месяц = Месяц(Дата);
        Структура.День = День(Дата);
        Структура.Час = Час(Дата);
        Структура.Минута = Минута(Дата);
        Структура.Секунда = Секунда(Дата);
    КонецЕсли;
    Возврат Структура;
КонецФункции
```

## 🚀 Вызов формы

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

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

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

&НаКлиенте
Процедура ДатаВремяУбытияОбработкаВыбора(Элемент, ВыбранноеЗначение, ДополнительныеДанные, СтандартнаяОбработка)
	
	Если ЗначениеЗаполнено(ВыбранноеЗначение) Тогда
		Объект.ДатаВремяУбытия = ВыбранноеЗначение;
	КонецЕсли;
	
КонецПроцедуры
```