Как реализовать выбор и ввод времени на форме в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

В платформе 1С:Предприятие 7.7 примитивный тип данных Дата содержит исключительно календарную дату (день, месяц, год). В отличие от платформы 1С 8.x, встроенного типа «Дата и время» или отдельного элемента диалога для интерактивного выбора времени в 7.7 не предусмотрено. Встроенный механизм времени существует только у документов, а при разработке произвольных механизмов (например, всплывающих напоминаний, расписаний или графиков) задачу ввода и хранения времени разработчику приходится решать самостоятельно.

Разберем основные практические варианты реализации удобного ввода времени на форме диалога, алгоритмы проверки корректности значений и способы хранения данных.

Вариант 1. Текстовое поле с маской ввода и постобработкой

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

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

  1. Разместим на форме диалога реквизит типа Строка (длиной 5 символов для формата ЧЧ:ММ или 8 символов для ЧЧ:ММ:СС).
  2. В свойствах элемента диалога зададим маску ввода: 99:99 или 99:99:99. Символ «9» в маске 1С 7.7 разрешает ввод только цифр, а двоеточия автоматически разделяют разряды.
  3. В поле формулы элемента диалога укажем процедуру проверки, например ПроверитьВводВремени().

Поскольку маска ограничивает только тип символов, пользователь может ввести недопустимые значения (например, 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);
КонецПроцедуры

Вариант 2. Выбор значения из списка интервалов

Для таких задач, как напоминания или планирование встреч, посекундная точность обычно не требуется. Удобнее предоставить пользователю выбор из фиксированного списка с определенным шагом (например, 5, 10 или 15 минут). Это полностью исключает ошибки ручного ввода.

Посмотрим на пример реализации через выпадающий список или модальный выбор:


Процедура ВыбратьВремя()
    СписокВремени = СоздатьОбъект("СписокЗначений");
    
    Для Ч = 8 По 20 Цикл
        СтрЧас = Формат(Ч, "Ч(0)2.0");
        Для М = 0 По 55 Цикл
            Если (М % 15) = 0 Тогда // шаг 15 минут
                СтрМин = Формат(М, "Ч(0)2.0");
                СписокВремени.ДобавитьЗначение(СтрЧас + ":" + СтрМин);
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    
    ВыбЗнач = "";
    Если СписокВремени.ВыбратьЗначение(ВыбЗнач, "Выберите время напоминания", , , 1) = 1 Тогда
        Время = ВыбЗнач;
    КонецЕсли;
КонецПроцедуры

Вариант 3. Раздельные поля со счетчиками («спиннерами»)

Еще один эргономичный способ без использования масок — размещение двух компактных числовых полей: ПолеЧасы (длина 2, точность 0) и ПолеМинуты (длина 2, точность 0).

Разберем порядок настройки:

  1. В свойствах каждого из полей включаем флаг Счетчик (появляются кнопки «вверх/вниз»).
  2. Для часов задаем диапазон от 0 до 23, для минут — от 0 до 59.
  3. При изменении любого из полей выполняем пересчет в общую строковую или числовую переменную времени.

Вариант 4. Встраивание системного контрола ActiveX (DTPicker)

Если требуется интерфейс, аналогичный стандартным элементам Windows, воспользуемся компонентом MSComCtl2.DTPicker (Microsoft Date and Time Picker):

  1. В конфигураторе открываем форму диалога и выбираем меню вставки элемента ActiveX.
  2. Выбираем Microsoft Date and Time Picker Control.
  3. В свойствах объекта устанавливаем режим Format = 2 (режим dtpTime) и UpDown = True.
  4. В коде модуля обращаемся к значению контрола через его свойства и передаем время в нужные переменные.

Хранение и сравнение времени в базе данных

Хранить время в реквизитах справочников или документов можно двумя путями:

  1. Строка фиксированной длины (ЧЧ:ММ:СС): удобна для отображения в списках и печатных формах, корректно сортируется по алфавиту при наличии лидирующих нулей.
  2. Число (количество секунд с начала суток): наиболее эффективно для прямого сравнения, фильтрации и использования в запросах.

Рассмотрим формулы перевода времени в секунды и обратно:


// Перевод строки "ЧЧ:ММ:СС" в число секунд от начала дня:
СекундыСуток = Число(Сред(Время, 1, 2)) * 3600 + Число(Сред(Время, 4, 2)) * 60 + Число(Сред(Время, 7, 2));

// Обратный перевод числа секунд в строку формата "ЧЧ:ММ":
Часы = Цел(СекундыСуток / 3600);
Минуты = Цел((СекундыСуток % 3600) / 60);
ВремяСтр = Формат(Часы, "Ч(0)2.0") + ":" + Формат(Минуты, "Ч(0)2.0");

Использование числа секунд позволяет легко проверять наступление событий в периодических фоновых циклах и прямых SQL-запросах простым условием ТекущиеСекунды >= ВремяНапоминания.

← На главную