Как настроить ввод времени в формате 00:00 на управляемой форме 1С?

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

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

В этой статье мы подробно разберем, почему стандартные события интерактивного ввода могут работать некорректно, и рассмотрим несколько надежных, проверенных на практике способов реализации ввода времени в формате «00:00» на управляемых формах 1С.

Почему не стоит использовать событие «ИзменениеТекстаРедактирования»

Начинающие разработчики часто пытаются решить задачу «в лоб»: перехватить ввод пользователя с помощью события ИзменениеТекстаРедактирования, проанализировать длину строки и программно вставить двоеточие на третью позицию. Рассмотрим, почему этот подход неэффективен и неудобен:

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

Для реализации красивого интерфейса лучше отказаться от «ручной» вставки символов на лету и воспользоваться стандартными механизмами платформы 1С.

Способ 1. Использование типа Дата и правильной форматной строки

Это самый простой, правильный и идеологически верный способ работы со временем в 1С. Вместо строкового реквизита мы используем стандартный тип Дата, но настраиваем его так, чтобы отображалось только время.

Выполним настройку по шагам:

  1. Создадим реквизит формы (или реквизит объекта) с типом Дата. В свойствах самого реквизита укажем Состав даты — Время.
  2. Перенесем реквизит на форму. В свойствах созданного поля ввода найдем пункт Формат редактирования.
  3. В поле ввода формата нужно вручную прописать форматную строку: ДФ=ЧЧ:мм (для русской локали платформы) или DF=HH:mm (для английской).

Важный нюанс: Обратите внимание на регистр символов! Использование строчных букв чч задает 12-часовой формат времени, что приведет к появлению раздражающих суффиксов «AM/PM» в интерфейсе. Использование заглавных букв ЧЧ жестко задает стандартный 24-часовой формат.

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

Способ 2. Использование маски ввода «99:99» для строк

Если по каким-то причинам вам необходимо хранить время именно в виде строки (например, в текстовом реквизите длиной 5 символов), оптимальным решением будет использование маски ввода.

Для этого в свойствах поля ввода на форме найдем свойство Маска и укажем значение: 99:99.

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

Важное предупреждение: Маска контролирует только формат ввода (символы и их количество), но не осуществляет логическую валидацию данных! Пользователь без труда сможет ввести некорректное время, например, 25:80 или 99:59. Также могут возникнуть проблемы при копировании и вставке текста из буфера обмена.

Чтобы избежать записи некорректных данных в базу, обязательно реализуем проверку в событии ПриИзменении поля ввода. Разберем пример кода для такой валидации:


&НаКлиенте
Процедура ВремяПриИзменении(Элемент)
    
    СтрокаВремени = Объект.ВремяСтрокой; // Пример значения: "25:70"
    
    Если ПустаяСтрока(СтрокаВремени) Тогда
        Возврат;
    КонецЕсли;
    
    // Удалим лишние пробелы, если маска заполнена не полностью
    СтрокаВремени = СтрЗаменить(СтрокаВремени, " ", "0");
    
    ЧастиВремени = СтрРазделить(СтрокаВремени, ":");
    Если ЧастиВремени.Количество() <> 2 Тогда
        ПоказатьПредупреждение(, "Неверный формат времени!");
        Объект.ВремяСтрокой = "";
        Возврат;
    КонецЕсли;
    
    Часы = Число(ЧастиВремени[0]);
    Минуты = Число(ЧастиВремени[1]);
    
    // Проверяем логические границы времени
    Если Часы > 23 Или Минуты > 59 Тогда
        ПоказатьПредупреждение(, "Указано некорректное время! Часы должны быть в диапазоне 00-23, минуты — 00-59.");
        Объект.ВремяСтрокой = "";
    КонецЕсли;
    
КонецПроцедуры

Способ 3. Поле времени с кнопкой регулирования (спиннером)

Если мы используем первый способ (тип Дата с форматом ДФ=ЧЧ:мм), мы можем сделать интерфейс еще более «живым» и удобным для пользователя, включив свойство поля ввода Кнопка регулирования.

В результате с правой стороны поля ввода появятся маленькие стрелочки «вверх» и «вниз». Проанализируем, как это работает:

Способ 4. Разделение на два числовых поля

Иногда самым надежным решением с точки зрения UX (пользовательского опыта) является полное разделение ввода часов и минут. Мы можем создать два независимых числовых реквизита на форме:

Разберем, как красиво оформить это на управляемой форме:

  1. Создадим на форме группу элементов с видом Группа колонок (или обычную группу с горизонтальной группировкой) и отключим отображение заголовка.
  2. Поместим в эту группу поле ввода для часов. В свойствах элемента установим: Минимум = 0, Максимум = 23. Также можно включить кнопку регулирования.
  3. Добавим в группу декорацию с видом Надпись и текстом ":".
  4. Поместим поле ввода для минут. В свойствах элемента установим: Минимум = 0, Максимум = 59. Формат редактирования настроим как ЧЦ=2; ЧДЦ=0; ЧГ=0 (чтобы всегда отображалось два знака, например, "05" вместо "5").

Этот подход гарантирует 100% корректность вводимых данных на уровне платформы без необходимости писать программный код валидации в модуле формы. При сохранении объекта мы всегда сможем собрать полноценное время или дату из этих двух числовых реквизитов.

Резюме

Мы проанализировали различные варианты настройки ввода времени в формате «ЧЧ:мм» на управляемых формах 1С. Для простых задач идеально подходит Способ 1 с настройкой формата редактирования типа Дата. Если бизнес-логика требует строкового представления — используйте Способ 2 с обязательной программной валидацией. Для максимально жесткого контроля вводимых значений отлично подойдет разделение на два поля из Способа 4.

← На главную