Как организовать удобный ввод и хранение временных интервалов в 1С 8.3 (Управляемые формы)?

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

Вопрос ввода времени и временных интервалов является классической задачей при разработке систем автоматизации доставки, записи на услуги или планирования ресурсов. Несмотря на кажущуюся простоту, стандартное поле ввода типа Дата (с составом Время) не всегда удовлетворяет требованиям эргономики, особенно когда речь идет о веб-клиенте или необходимости быстрого выбора диапазона. В этой статье мы подробно разберем несколько стратегий реализации этой задачи: от простых полей до продвинутых графических интерфейсов.

Метод 1: Использование стандартных полей ввода с оптимизацией

Самый простой способ — использовать два реквизита типа Дата (состав даты — Время) для обозначения начала и окончания интервала. Однако, чтобы пользователю было удобно работать с ними, необходимо выполнить дополнительную настройку интерфейса.

Проанализируем, как можно улучшить стандартное поле ввода:

  1. Маска ввода: Установите маску 99:99 в свойствах элемента формы. Это предотвратит ввод лишних символов и поможет пользователю сразу понять формат.
  2. Кнопки регулирования (Спиннеры): Включите свойство КнопкиРегулирования. Это позволит изменять время стрелками «вверх/вниз».
  3. Программный шаг: Мы можем перехватить событие Регулирование и изменять время с определенным шагом, например, в 15 или 30 минут. Это гораздо быстрее, чем менять каждую минуту.

Рассмотрим пример кода для управления шагом времени:


&НаКлиенте
Процедура ВремяДоставкиНачалоРегулирование(Элемент, Направление, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    ШагВМинутах = 15;
    ТекущееЗначение = Объект.ВремяДоставкиНачало;
    
    Если Направление = 1 Тогда // Вверх
        Объект.ВремяДоставкиНачало = ТекущееЗначение + (ШагВМинутах * 60);
    Иначе // Вниз
        Объект.ВремяДоставкиНачало = ТекущееЗначение - (ШагВМинутах * 60);
    КонецЕсли;
КонецПроцедуры

Метод 2: Справочник стандартных интервалов

Как показывает практика логистических компаний, клиенты редко выбирают произвольное время вроде «11:14». Обычно существуют фиксированные окна доставки. В этом случае идеальным решением будет создание справочника ВременныеИнтервалы.

Разберем преимущества этого подхода:

Для реализации достаточно создать справочник с двумя реквизитами типа Число (для хранения времени в секундах от начала дня) и строковым наименованием для удобства отображения в выпадающих списках.

Метод 3: Использование специализированного контрола «Планировщик»

Если задача требует визуального контроля занятости (например, запись в автосервис или к врачу), лучше всего использовать встроенный объект платформы — Планировщик. Он отлично работает в тонком и веб-клиенте.

Посмотрим на алгоритм работы с Планировщиком:

  1. Размещаем элемент формы типа Планировщик.
  2. Настраиваем ШкалаВремени, устанавливая нужную кратность (например, 30 минут).
  3. Пользователь просто выделяет мышкой нужный блок времени.

Это интерфейсное решение позволяет не только вводить интервал, но и сразу видеть пересечения с другими задачами. Данные из планировщика легко считываются в структуру ЭлементПланировщика, из которой можно получить Начало и Конец периода.

Метод 4: Диалог редактирования стандартного периода

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


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

&НаКлиенте
Процедура ВыборПериодаЗавершение(ВыбранныйПериод, ДополнительныеПараметры) Экспорт
    Если ВыбранныйПериод <> Неопределено Тогда
        Объект.ДатаНачала = ВыбранныйПериод.ДатаНачала;
        Объект.ДатаОкончания = ВыбранныйПериод.ДатаОкончания;
    КонецЕсли;
КонецПроцедуры

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

Метод 5: Интеграция с HTML/JavaScript (для продвинутых интерфейсов)

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

Проанализируем шаги интеграции:

  1. В макет конфигурации помещается HTML-код с подключенной JS-библиотекой (например, flatpickr или timepicker).
  2. В управляемой форме создается ПолеHTMLДокумента.
  3. Взаимодействие осуществляется через событие ПриНажатии (или через механизм СообщениеИзHTML в новых версиях платформы).

Этот метод позволяет реализовать любой дизайн, но требует навыков веб-разработки и аккуратной обработки передачи данных обратно в базу 1С.

Архитектура хранения данных

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

  1. Тип Дата: Храним время как Дата, где дата всегда равна 01.01.0001. Это удобно для отображения на форме, но может вызывать сложности при сравнении интервалов в запросах.
  2. Количество секунд (Тип Число): Храним время как число секунд от начала дня (от 0 до 86399). Это самый эффективный способ для математических расчетов. Например, чтобы проверить, входит ли время в интервал, достаточно простого условия: ВремяЗаказа >= ВремяНачала И ВремяЗаказа <= ВремяОкончания.

Если же у одного документа может быть несколько разрывных интервалов (например, «с 9 до 11 и с 16 до 18»), рекомендуется использовать Табличную часть или хранить данные в формате JSON в строковом реквизите неограниченной длины. Последний вариант особенно удобен, если структура интервалов может меняться, а поиск по ним внутри запроса не требуется (только отображение).

Выбор конкретного метода зависит от ваших бизнес-требований. Для простых задач доставки лучше всего подойдет справочник интервалов, а для сложных систем бронирования — Планировщик или интеграция с HTML.

← На главную