В платформе 1С:Предприятие 7.7 примитивный тип данных Дата содержит исключительно календарную дату (день, месяц, год). В отличие от платформы 1С 8.x, встроенного типа «Дата и время» или отдельного элемента диалога для интерактивного выбора времени в 7.7 не предусмотрено. Встроенный механизм времени существует только у документов, а при разработке произвольных механизмов (например, всплывающих напоминаний, расписаний или графиков) задачу ввода и хранения времени разработчику приходится решать самостоятельно.
Разберем основные практические варианты реализации удобного ввода времени на форме диалога, алгоритмы проверки корректности значений и способы хранения данных.
Рассмотрим наиболее популярный способ: размещение на форме диалога строкового поля ввода с маской формата времени.
Выполним настройку по шагам:
Строка (длиной 5 символов для формата ЧЧ:ММ или 8 символов для ЧЧ:ММ:СС).99:99 или 99:99:99. Символ «9» в маске 1С 7.7 разрешает ввод только цифр, а двоеточия автоматически разделяют разряды.ПроверитьВводВремени().Поскольку маска ограничивает только тип символов, пользователь может ввести недопустимые значения (например, 28:85). Проанализируем процедуру валидации, которая проверяет корректность диапазонов (часы от 0 до 23, минуты и секунды от 0 до 59) и в случае некорректного ввода возвращает предыдущее правильное значение:
Перем СтарЧасы, СтарМинуты, СтарСекунды;
Процедура ПроверитьВводВремени()
Часы = Число(Сред(Время, 1, 2));
Минуты = Число(Сред(Время, 4, 2));
Секунды = Число(Сред(Время, 7, 2));
Ошибка = 0;
Если (Часы < 0) Или (Часы > 23) Тогда
Сообщить("Часы должны быть в диапазоне от 00 до 23!", "!");
Ошибка = 1;
КонецЕсли;
Если (Минуты < 0) Или (Минуты > 59) Тогда
Сообщить("Минуты должны быть в диапазоне от 00 до 59!", "!");
Ошибка = 1;
КонецЕсли;
Если (Секунды < 0) Или (Секунды > 59) Тогда
Сообщить("Секунды должны быть в диапазоне от 00 до 59!", "!");
Ошибка = 1;
КонецЕсли;
Если Ошибка = 1 Тогда
// Возвращаем сохраненное ранее корректное значение
Время = СтарЧасы + ":" + СтарМинуты + ":" + СтарСекунды;
Иначе
// Фиксируем новое корректное значение
СтарЧасы = Сред(Время, 1, 2);
СтарМинуты = Сред(Время, 4, 2);
СтарСекунды = Сред(Время, 7, 2);
КонецЕсли;
КонецПроцедуры
Процедура ПриОткрытии()
Если ПустаяСтрока(Время) = 1 Тогда
Время = "09:00:00";
КонецЕсли;
СтарЧасы = Сред(Время, 1, 2);
СтарМинуты = Сред(Время, 4, 2);
СтарСекунды = Сред(Время, 7, 2);
КонецПроцедуры
Для таких задач, как напоминания или планирование встреч, посекундная точность обычно не требуется. Удобнее предоставить пользователю выбор из фиксированного списка с определенным шагом (например, 5, 10 или 15 минут). Это полностью исключает ошибки ручного ввода.
Посмотрим на пример реализации через выпадающий список или модальный выбор:
Процедура ВыбратьВремя()
СписокВремени = СоздатьОбъект("СписокЗначений");
Для Ч = 8 По 20 Цикл
СтрЧас = Формат(Ч, "Ч(0)2.0");
Для М = 0 По 55 Цикл
Если (М % 15) = 0 Тогда // шаг 15 минут
СтрМин = Формат(М, "Ч(0)2.0");
СписокВремени.ДобавитьЗначение(СтрЧас + ":" + СтрМин);
КонецЕсли;
КонецЦикла;
КонецЦикла;
ВыбЗнач = "";
Если СписокВремени.ВыбратьЗначение(ВыбЗнач, "Выберите время напоминания", , , 1) = 1 Тогда
Время = ВыбЗнач;
КонецЕсли;
КонецПроцедуры
Еще один эргономичный способ без использования масок — размещение двух компактных числовых полей: ПолеЧасы (длина 2, точность 0) и ПолеМинуты (длина 2, точность 0).
Разберем порядок настройки:
Если требуется интерфейс, аналогичный стандартным элементам Windows, воспользуемся компонентом MSComCtl2.DTPicker (Microsoft Date and Time Picker):
Microsoft Date and Time Picker Control.Format = 2 (режим dtpTime) и UpDown = True.Хранить время в реквизитах справочников или документов можно двумя путями:
ЧЧ:ММ:СС): удобна для отображения в списках и печатных формах, корректно сортируется по алфавиту при наличии лидирующих нулей.Рассмотрим формулы перевода времени в секунды и обратно:
// Перевод строки "ЧЧ:ММ:СС" в число секунд от начала дня:
СекундыСуток = Число(Сред(Время, 1, 2)) * 3600 + Число(Сред(Время, 4, 2)) * 60 + Число(Сред(Время, 7, 2));
// Обратный перевод числа секунд в строку формата "ЧЧ:ММ":
Часы = Цел(СекундыСуток / 3600);
Минуты = Цел((СекундыСуток % 3600) / 60);
ВремяСтр = Формат(Часы, "Ч(0)2.0") + ":" + Формат(Минуты, "Ч(0)2.0");
Использование числа секунд позволяет легко проверять наступление событий в периодических фоновых циклах и прямых SQL-запросах простым условием ТекущиеСекунды >= ВремяНапоминания.