При разработке интерфейсов в «1С:Предприятии» часто возникает тривиальная на первый взгляд задача — дать пользователю возможность удобно вводить время (например, время обеда, начала перерыва или записи на прием) в привычном формате «ЧЧ:мм» (часы и минуты). Попытки реализовать это «на лету» через программную обработку каждого нажатия клавиши часто приводят разработчиков в тупик.
В этой статье мы подробно разберем, почему стандартные события интерактивного ввода могут работать некорректно, и рассмотрим несколько надежных, проверенных на практике способов реализации ввода времени в формате «00:00» на управляемых формах 1С.
Начинающие разработчики часто пытаются решить задачу «в лоб»: перехватить ввод пользователя с помощью события ИзменениеТекстаРедактирования, проанализировать длину строки и программно вставить двоеточие на третью позицию. Рассмотрим, почему этот подход неэффективен и неудобен:
ИзменениеТекстаРедактирования может вообще не срабатывать или работать некорректно, если элемент ввода находится внутри ячейки таблицы формы (динамического списка или табличной части).ОбновлениеТекстаРедактирования (его нужно переключать в значение ПриИзмененииЗначения или Всегда), что усложняет логику формы.Для реализации красивого интерфейса лучше отказаться от «ручной» вставки символов на лету и воспользоваться стандартными механизмами платформы 1С.
Это самый простой, правильный и идеологически верный способ работы со временем в 1С. Вместо строкового реквизита мы используем стандартный тип Дата, но настраиваем его так, чтобы отображалось только время.
Выполним настройку по шагам:
Дата. В свойствах самого реквизита укажем Состав даты — Время.ДФ=ЧЧ:мм (для русской локали платформы) или DF=HH:mm (для английской).Важный нюанс: Обратите внимание на регистр символов! Использование строчных букв чч задает 12-часовой формат времени, что приведет к появлению раздражающих суффиксов «AM/PM» в интерфейсе. Использование заглавных букв ЧЧ жестко задает стандартный 24-часовой формат.
При такой настройке платформа сама создаст удобное поле ввода, где будут автоматически разделены часы и минуты, а при вводе пользователю не придется вручную нажимать двоеточие.
Если по каким-то причинам вам необходимо хранить время именно в виде строки (например, в текстовом реквизите длиной 5 символов), оптимальным решением будет использование маски ввода.
Для этого в свойствах поля ввода на форме найдем свойство Маска и укажем значение: 99:99.
Символ «9» в маске 1С означает, что на этой позиции может быть введена только цифра. Двоеточие выступает в роли жестко зафиксированного разделителя. Пользователь физически не сможет ввести буквы или стереть двоеточие.
Важное предупреждение: Маска контролирует только формат ввода (символы и их количество), но не осуществляет логическую валидацию данных! Пользователь без труда сможет ввести некорректное время, например, 25:80 или 99:59. Также могут возникнуть проблемы при копировании и вставке текста из буфера обмена.
Чтобы избежать записи некорректных данных в базу, обязательно реализуем проверку в событии ПриИзменении поля ввода. Разберем пример кода для такой валидации:
&НаКлиенте
Процедура ВремяПриИзменении(Элемент)
СтрокаВремени = Объект.ВремяСтрокой; // Пример значения: "25:70"
Если ПустаяСтрока(СтрокаВремени) Тогда
Возврат;
КонецЕсли;
// Удалим лишние пробелы, если маска заполнена не полностью
СтрокаВремени = СтрЗаменить(СтрокаВремени, " ", "0");
ЧастиВремени = СтрРазделить(СтрокаВремени, ":");
Если ЧастиВремени.Количество() <> 2 Тогда
ПоказатьПредупреждение(, "Неверный формат времени!");
Объект.ВремяСтрокой = "";
Возврат;
КонецЕсли;
Часы = Число(ЧастиВремени[0]);
Минуты = Число(ЧастиВремени[1]);
// Проверяем логические границы времени
Если Часы > 23 Или Минуты > 59 Тогда
ПоказатьПредупреждение(, "Указано некорректное время! Часы должны быть в диапазоне 00-23, минуты — 00-59.");
Объект.ВремяСтрокой = "";
КонецЕсли;
КонецПроцедуры
Если мы используем первый способ (тип Дата с форматом ДФ=ЧЧ:мм), мы можем сделать интерфейс еще более «живым» и удобным для пользователя, включив свойство поля ввода Кнопка регулирования.
В результате с правой стороны поля ввода появятся маленькие стрелочки «вверх» и «вниз». Проанализируем, как это работает:
Иногда самым надежным решением с точки зрения UX (пользовательского опыта) является полное разделение ввода часов и минут. Мы можем создать два независимых числовых реквизита на форме:
ВремяЧасы (тип Число, длина 2, точность 0)ВремяМинуты (тип Число, длина 2, точность 0)Разберем, как красиво оформить это на управляемой форме:
0, Максимум = 23. Также можно включить кнопку регулирования.":".0, Максимум = 59. Формат редактирования настроим как ЧЦ=2; ЧДЦ=0; ЧГ=0 (чтобы всегда отображалось два знака, например, "05" вместо "5").Этот подход гарантирует 100% корректность вводимых данных на уровне платформы без необходимости писать программный код валидации в модуле формы. При сохранении объекта мы всегда сможем собрать полноценное время или дату из этих двух числовых реквизитов.
Мы проанализировали различные варианты настройки ввода времени в формате «ЧЧ:мм» на управляемых формах 1С. Для простых задач идеально подходит Способ 1 с настройкой формата редактирования типа Дата. Если бизнес-логика требует строкового представления — используйте Способ 2 с обязательной программной валидацией. Для максимально жесткого контроля вводимых значений отлично подойдет разделение на два поля из Способа 4.