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