Как реализовать расписание бронирования автомобилей в самописной конфигурации 1С?

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

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

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

Главное правило при работе с графиками и расписаниями в 1С — разделять уровень хранения данных и уровень их визуального представления. Сам элемент формы не предназначен для хранения информации в базе данных, он лишь отображает подготовленные записи.

Для хранения броней и графиков доступности автотранспорта используют два основных подхода:

  1. Документная схема с независимым или подчиненным регистром сведений: создается документ БронированиеАвтомобиля, в котором указываются автомобиль, период бронирования (дата/время начала и окончания), ответственный и цель поездки. При проведении документ делает записи в независимый регистр сведений ГрафикЗанятостиАвтомобилей.
  2. Периодический регистр сведений: если создание документов избыточно, используется независимый регистр сведений. Измерениями выступают Автомобиль и временной интервал, а ресурсами — статус занятости и бронирующий сотрудник.

Проанализируем пример структуры измерений и ресурсов регистра сведений для детального учета временных слотов:

  1. Измерения: Автомобиль (Ссылка на СправочникСсылка.Автомобили), ДатаНачала (Дата), ДатаОкончания (Дата).
  2. Ресурсы: Занят (Булево), Сотрудник (Ссылка на СправочникСсылка.Сотрудники).
  3. Реквизиты: Комментарий (Строка), Автор (Ссылка на СправочникСсылка.Пользователи).

Использование штатного элемента управления «Планировщик»

Начиная с версии платформы 8.3.6, на управляемых формах доступен специализированный элемент управления — Планировщик. Он позволяет выводить временную сетку с заданной дискретностью (например, 30 минут) и визуально отображать отрезки времени для каждого объекта.

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

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

Посмотрим на пример программной инициализации и заполнения элемента Планировщик при открытии формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Настройка шкалы времени (интервал 30 минут)
    Элементы.РасписаниеЗанятости.ТекущийПериодОтображения = Новый СтандартныйПериод(НачалоДня(ТекущаяДата()), КонецДня(ТекущаяДата()));
    
    // Очистка и формирование элементов планировщика из базы данных
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	ТекЗаписи.Автомобиль КАК Измерение,
        |	ТекЗаписи.ДатаНачала КАК Начало,
        |	ТекЗаписи.ДатаОкончания КАК Конец,
        |	ТекЗаписи.Сотрудник КАК Представление,
        |	ТекЗаписи.Ссылка КАК Значение
        |ИЗ
        |	РегистрСведений.ЗанятостьАвтомобилей КАК ТекЗаписи
        |ГДЕ
        |	ТекЗаписи.ДатаНачала >= &НачалоПериода
        |	И ТекЗаписи.ДатаОкончания <= &КонецПериода";
        
    Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ТекущаяДата()));
    Запрос.УстановитьПараметр("КонецПериода", КонецДня(ТекущаяДата()));
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    РасписаниеЗанятости.Элементы.Очистить();
    Пока Выборка.Следующий() Цикл
        НовыйЭлемент = РасписаниеЗанятости.Элементы.Добавить();
        НовыйЭлемент.Значение = Выборка.Значение;
        НовыйЭлемент.Текст = Строка(Выборка.Представление);
        НовыйЭлемент.Начало = Выборка.Начало;
        НовыйЭлемент.Конец = Выборка.Конец;
    КонецЦикла;
    
КонецПроцедуры

Проверка пересечения интервалов при бронировании

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

Условие пересечения двух временных отрезков (A, B) и (C, D) математически описывается следующим образом: интервалы пересекаются, если НачалоНовое < КонецСуществующее И КонецНовое > НачалоСуществующее.

Рассмотрим пример функции проверки наложения брони на серверном контексте:


&НаСервере
Функция ПроверитьЗанятостьАвтомобиля(АвтомобильRef, НачалоНовое, КонецНовое, ИсключаемаяБронь = Неопределено) Экспорт
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |	1
        |ИЗ
        |	РегистрСведений.ЗанятостьАвтомобилей КАК Занятость
        |ГДЕ
        |	Занятость.Автомобиль = &Автомобиль
        |	И &НачалоНовое < Занятость.ДатаОкончания
        |	И &КонецНовое > Занятость.ДатаНачала";
        
    Запрос.УстановитьПараметр("Автомобиль", АвтомобильRef);
    Запрос.УстановитьПараметр("НачалоНовое", НачалоНовое);
    Запрос.УстановитьПараметр("КонецНовое", КонецНовое);
    
    Возврат НЕ Запрос.Выполнить().Пустой();
    
КонецФункции

Альтернативные варианты построения расписания

Если штатного элемента Планировщик недостаточно или требуются специфические варианты отображения, можно использовать следующие решения:

  1. Диаграмма Ганта (объект ДиаграммаГанта): графический элемент 1С, удобный для наглядного показа длительных интервалов и загрузки объектов во времени.
  2. Динамическая таблица формы с условным оформлением: формируется табличная часть или таблица значений, где строки — это автомобили, а колонки — 30-минутные слоты. Ячейки подсвечиваются разными цветами с помощью условного оформления в зависимости от занятости.
  3. Поле HTML-документа (объект ПолеHTMLДокумента): позволяет интегрировать сторонние веб-календари на JavaScript для достижения максимальной гибкости дизайна и интерактивности.
← На главную