При разработке систем управления задачами, сервисными центрами или логистикой часто возникает необходимость визуализировать загрузку ресурсов. Стандартный объект 1С Планировщик предоставляет богатые возможности для этого, однако его базовая настройка не всегда соответствует ожиданиям. Часто требуется реализовать вид, напоминающий диаграмму Ганта: когда в левой части экрана расположен список сотрудников (ресурсов), а сверху — временная шкала (дни или месяцы).
В этой статье мы подробно разберем, как трансформировать стандартный вид планировщика, настроить его ориентацию и научиться правильно распределять задачи по строкам сотрудников.
Рассмотрим ситуацию: нам необходимо вывести график выездов мастеров. В левой колонке должны отображаться фамилии специалистов, а по горизонтали — календарная сетка. Проанализируем, почему для этой задачи лучше использовать Планировщик, а не встроенный объект ДиаграммаГанта. Несмотря на схожесть, Планировщик обладает более высокой интерактивностью. Он позволяет пользователю перетаскивать задачи между сотрудниками или изменять время выполнения простым движением мыши, что критически важно для оперативного планирования. Для интерактивного распределения заданий между исполнителями также подойдёт расширение с доской Канбан на управляемых формах.
По умолчанию Планировщик часто отображается в вертикальном режиме, где время идет сверху вниз. Чтобы получить классический «горизонтальный» вид, нам необходимо изменить свойство Ориентация. Выясним, как это сделать программно:
// Устанавливаем горизонтальную ориентацию
Элементы.ПланировщикСхема.Ориентация = ОриентацияПланировщика.Горизонтальная;
После установки этого свойства шкала времени автоматически переместится наверх, а область для ресурсов (измерений) окажется слева. Это первый и самый важный шаг к достижению нужного интерфейса.
Проанализируем типичную ошибку начинающих разработчиков: даже после смены ориентации слева могут оставаться часы, а не сотрудники. Это происходит потому, что в объекте не настроены Измерения. В терминах 1С измерения — это оси, по которым группируются данные.
Для решения нашей задачи выполним следующие действия:
Измерения планировщика.Посмотрим на пример кода, который инициализирует список сотрудников в планировщике:
// Очищаем старые измерения
ПланировщикСхема.Измерения.Очистить();
// Добавляем новое измерение "Сотрудник"
НовоеИзмерение = ПланировщикСхема.Измерения.Добавить("Сотрудник");
// Заполняем измерение списком мастеров из справочника или запроса
ЗапросМастера = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Сотрудники ГДЕ Работает");
Выборка = ЗапросМастера.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ЭлементИзмерения = НовоеИзмерение.Элементы.Добавить(Выборка.Ссылка);
ЭлементИзмерения.Текст = Строка(Выборка.Ссылка);
КонецЦикла;
Теперь разберем, как связать конкретную задачу (выезд мастера) с его строкой в планировщике. При добавлении нового элемента в коллекцию Элементы планировщика, крайне важно заполнить свойство ЗначенияИзмерений. Если этого не сделать, программа не поймет, в какую строку поместить прямоугольник события, и он просто не отобразится корректно.
Рассмотрим модифицированный пример кода на основе обсуждения:
&НаСервере
Процедура ЗаполнитьПланировщик()
// Очистка старых данных
ПланировщикСхема.Элементы.Очистить();
// Настройка периода отображения
НачалоПериода = НачалоДня(ТекущаяДата());
КонецПериода = КонецДня(ТекущаяДата() + 7 * 24 * 3600); // на неделю вперед
ПланировщикСхема.ТекущиеПериодыОтображения.Очистить();
ПланировщикСхема.ТекущиеПериодыОтображения.Добавить(НачалоПериода, КонецПериода);
// Запрос к базе данных
ЗапросВыезды = Новый Запрос;
ЗапросВыезды.Текст =
"ВЫБРАТЬ
| Выезд.Ссылка КАК Ссылка,
| Выезд.Сотрудник КАК Сотрудник,
| Выезд.ПланДатаНачала КАК ДатаНачала,
| Выезд.ПланДатаОкончания КАК ДатаОкончания,
| Выезд.Контрагент КАК Контрагент
|ИЗ
| Документ.ВыездМастера КАК Выезд
|ГДЕ
| Выезд.Проведен И Выезд.ПланДатаНачала МЕЖДУ &ДатаН И &ДатаК";
ЗапросВыезды.УстановитьПараметр("ДатаН", НачалоПериода);
ЗапросВыезды.УстановитьПараметр("ДатаК", КонецПериода);
Выборка = ЗапросВыезды.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Добавляем элемент в планировщик
НовыйЭлемент = ПланировщикСхема.Элементы.Добавить(Выборка.ДатаНачала, Выборка.ДатаОкончания);
НовыйЭлемент.Текст = Строка(Выборка.Контрагент);
НовыйЭлемент.Значение = Выборка.Ссылка;
// КЛЮЧЕВОЙ МОМЕНТ: Привязка к сотруднику (измерению)
// Имя "Сотрудник" должно совпадать с именем измерения, созданного ранее
НовыйЭлемент.ЗначенияИзмерений.Вставить("Сотрудник", Выборка.Сотрудник);
КонецЦикла;
КонецПроцедуры
Для удобства восприятия (особенно если планирование идет на месяцы) нам нужно настроить шкалу времени. Планировщик позволяет создавать многоуровневые заголовки. Например, верхний уровень — месяц, нижний — день.
Рассмотрим, как настроить шкалу:
ПланировщикСхема.ШкалаВремени.Элементы.ТипЕдиницыШкалыВремени.Месяц для общего ориентирования.ТипЕдиницыШкалыВремени.День для детального планирования.Важно помнить про свойство КратностьПериодическогоВарианта. Если установить его в значение 24 для единицы Час, мы получим деление по суткам. Однако для полноценного вида «как на фотошопе» лучше напрямую оперировать единицами День или Неделя.
Чтобы планировщик был не просто функциональным, но и удобным, проанализируем еще несколько свойств:
1. Группировка. Используйте свойство Группировка, чтобы визуально объединять задачи одного ресурса. Это предотвратит «кашу» из прямоугольников, если у одного мастера запланировано несколько пересекающихся выездов.
2. Отображение нерабочего времени. Чтобы выходные или ночные часы не занимали место на экране, настройте ПараметрыОтображенияПериодов. Это позволит «сжать» нерабочие интервалы, оставив только полезную информацию.
3. Форматирование заголовков. Используйте свойство ФорматПеренесенныхЗаголовковШкалыВремени, чтобы задать человекопонятный вид дат (например, «Понедельник, 15 мая»).
Мы выяснили, что для реализации вида диаграммы Ганта в объекте Планировщик необходимо обязательно использовать три составляющие: установку свойства Ориентация в Горизонтальная, создание и заполнение коллекции Измерения, а также явную привязку каждого элемента через ЗначенияИзмерений. При соблюдении этих условий вы получите гибкий и интерактивный инструмент для визуализации работы персонала или оборудования. В качестве готовой основы для разработки подобного интерфейса можно использовать конфигурацию-заготовку для отображения задач в виде календаря.