Разработка системы планирования — это комплексная задача, которая требует не только создания удобного интерфейса, но и проектирования надежной архитектуры базы данных. В рамках этой статьи мы рассмотрим, как реализовать учет расписания в нетиповой конфигурации, обеспечив высокую производительность и гибкость отчетов. Мы проанализируем выбор объектов метаданных, способы визуализации и механизмы контроля пересечений.
Прежде всего, разберем структуру хранения данных. Для эффективной работы системы нам недостаточно одного регистра. Мы предлагаем разделить потоки данных на три составляющие: график доступности, планируемые события и фактическое выполнение.
Для определения «свободных слотов» нам необходим Регистр сведений ГрафикРаботыСотрудников. В нем мы будем хранить информацию о том, в какие дни и часы преподаватель потенциально может вести занятия. Это позволит системе быстро отсекать время, когда сотрудника нет на рабочем месте.
Основную логику занятости реализуем через Регистр сведений ЗанятостьПреподавателей. В качестве измерений выберем Преподаватель и Период. Поскольку в условии задачи указано, что минимальный слот равен 30 минутам, мы можем использовать периодический регистр или фиксировать начало и окончание занятия в ресурсах. Это позволит строить запросы для поиска «дырок» в графике.
Для план-фактного анализа (пункт 5 задачи) рекомендуем использовать Регистр накопления (Обороты) НагрузкаПреподавателей. Использование регистра сведений для аналитических отчетов за большой период может привести к замедлению системы. В регистр накопления мы будем записывать данные при проведении документов «Занятие» со статусом «Запланировано» или «Выполнено».
Рассмотрим необходимые документы:
Для реализации графического отображения (пункт 6) воспользуемся встроенным объектом платформы 1С — Планировщик. Это специализированный элемент управления для работы с календарями и временными шкалами.
Посмотрим на основные настройки планировщика, которые нам понадобятся. Мы настроим его так, чтобы по вертикали отображались преподаватели (Измерения), а по горизонтали — временная шкала с шагом в 30 минут. Проанализируем код инициализации планировщика на форме:
// Пример настройки элементов планировщика
ЭлементРасписания = Планировщик.Элементы.Добавить(НачалоЗанятия, КонецЗанятия);
ЭлементРасписания.Текст = "Занятие: " + ФИОСлушателя;
ЭлементРасписания.Значение = СсылкаНаДокумент;
// Установка цвета в зависимости от статуса (план или факт)
Если СтатусЗанятия = Перечисления.СтатусыЗанятий.Выполнено Тогда
ЭлементРасписания.ЦветФона = ЦветаСтиля.Красный;
Иначе
ЭлементРасписания.ЦветФона = ЦветаСтиля.Желтый;
КонецЕсли;
Чтобы интерфейс работал быстро, внедрим механизм «ленивой загрузки». Мы не будем загружать данные за весь год. При изменении периода в планировщике (например, при переходе на следующую неделю), мы вызовем серверную процедуру, которая получит данные только для текущего видимого диапазона дат.
Одной из критических задач является исключение ситуации, когда на один и тот же слот записываются два занятия. Выясним причину, почему обычной проверки запросом перед записью недостаточно. В условиях многопользовательской работы два менеджера могут одновременно проверить слот, увидеть, что он свободен, и нажать кнопку «Записать» с разницей в миллисекунды. Запрос первого еще не зафиксировал данные в БД, когда выполнился запрос второго.
Для решения этой проблемы применим управляемые блокировки. Перед записью документа в регистр мы заблокируем комбинацию преподавателя и времени:
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ЗанятостьПреподавателей");
ЭлементБлокировки.УстановитьЗначение("Преподаватель", Объект.Преподаватель);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИспользоватьИзДанныхИсточник("Период", СписокВременныхСлотов);
Блокировка.Заблокировать();
// Далее выполняем запрос на наличие пересечений и саму запись
Такой подход гарантирует, что пока одна транзакция проверяет и записывает данные, вторая будет ждать своей очереди, что исключит «наложение» уроков.
Проанализируем ситуацию, когда сотрудников в организации очень много. Отображение всех преподавателей в одном планировщике сделает его нечитаемым и медленным. Мы внедрим фильтрацию по отделам и дисциплинам. Также рекомендуем использовать пастельные тона для раскраски слотов, чтобы интерфейс не утомлял глаза пользователей при длительной работе.
Для удобства работы реализуем механизм Drag-and-drop. Платформа 1С позволяет перетаскивать элементы планировщика мышью. При завершении перетаскивания мы будем вызывать обработчик события, который пересчитает время занятия и предложит пользователю подтвердить изменение документа. Это значительно ускорит процесс оперативного изменения расписания.
Чтобы выполнить требование по получению нагрузки (пункт 5), создадим отчет на базе Системы Компоновки Данных (СКД). Источником данных выступит наш Регистр накопления НагрузкаПреподавателей. В отчете мы выведем следующие колонки:
Это позволит руководству видеть реальную картину занятости и эффективности каждого сотрудника за любой произвольный интервал времени.
В современных реалиях удобно дополнить систему уведомлениями. Мы можем настроить подписку на события записи регистра ЗанятостьПреподавателей. При создании нового занятия система автоматически сформирует сообщение и отправит его преподавателю через Telegram-бота или внутреннюю почту 1С. Это минимизирует риски того, что преподаватель забудет о новом назначенном уроке.
Таким образом, сочетание правильной структуры регистров, использование управляемых блокировок и стандартного объекта Планировщик с элементами оптимизации позволит создать профессиональное решение для управления учебным центром.