Как автоматически подставлять текущее время при выборе сегодняшней даты в управляемой форме 1С?

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

При интерактивном выборе даты через стандартный календарь в управляемых формах платформа 1С по умолчанию всегда подставляет нулевое время (00:00:00). Посмотрим, с чем связано такое поведение, какие настройки формы необходимо выполнить и как с помощью кода обработки события ПриИзменении реализовать автоподстановку текущего времени, если пользователь выбрал сегодняшний день.

Причина поведения платформы и обязательные настройки

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

Прежде чем писать программный код, необходимо убедиться, что реквизит и поле формы корректно настроены для работы со временем:

  1. В свойствах реквизита формы или объекта проверим свойство Состав даты. В нем должно быть установлено значение Дата и время. Если выбрать значение Дата, то временная часть отображаться и сохраняться в реквизите не будет.
  2. В свойствах элемента формы (поля ввода) проверим параметр Формат или Формат редактирования, чтобы убедиться, что отображение времени не скрыто маской формата.

Программная подстановка времени через событие ПриИзменении

Рассмотрим ситуацию, когда требуется следующее поведение: если пользователь выбирает в календаре сегодняшнее число, в поле должно подставляться текущее время. Если же выбрана любая другая дата (прошедшая или будущая), должна оставаться начальная точка дня (00:00:00).

Для реализации этого логического правила создадим обработчик события ПриИзменении для соответствующего поля формы.

Простейший вариант решения выглядит следующим образом:


&НаКлиенте
Процедура Реквизит1ПриИзменении(Элемент)
    
    // Если выбранная дата совпадает с началом текущего дня, подставляем текущую дату и время
    Объект.Реквизит1 = ?(Объект.Реквизит1 = НачалоДня(ТекущаяДата()), ТекущаяДата(), Объект.Реквизит1);
    
КонецПроцедуры

Совершенствуем решение по стандартам разработки 1С

Проанализируем базовый вариант и выясним его слабые стороны. Использование функции ТекущаяДата() на клиенте в клиент-серверном варианте работы может привести к ошибкам, если системное время на локальном ПК пользователя отличается от времени сервера или часового пояса сеанса. Поэтому по стандартам разработки 1С рекомендуется использовать функцию ТекущаяДатаСеанса().

Кроме того, сделаем проверку более точной, чтобы она корректно обрабатывала заполненность реквизита:


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

Альтернативные варианты и возможности новых версий платформы

Посмотрим на дополнительные способы управления вводом даты и времени в 1С:

  1. Свойство РежимВыбораВремени (начиная с платформы 8.3.25): В новых версиях платформы у элемента формы «Поле ввода» с типом Дата добавлено свойство РежимВыбораВремени. При установке значения Произвольное время прямо в выпадающем календаре появляется встроенная панель для выбора часов и минут без необходимости писать дополнительный код.
  2. Сохранение ранее введенного времени при смене даты: Если пользователь уже вручную ввел время (например, 14:30:00), а затем решил изменить только календарную дату, можно вычислять временное смещение и прибавлять его к новой выбранной дате.
← На главную