При разработке интерфейсов в 1С:Предприятии 8.3 перед программистом часто встает задача визуализации расписания, задач или загрузки сотрудников. Для этих целей идеально подходит стандартный элемент управления Планировщик. Однако при попытке реализовать динамическое переключение масштабов (например, просмотр расписания по дням, неделям или месяцам) разработчики сталкиваются с рядом трудностей: интерфейс начинает «плыть», шкала времени сжимается, а свойства элементов управления ведут себя непредсказуемо.
В этой статье мы подробно разберем, как правильно спроектировать интерфейс для работы с планировщиком в управляемых формах, как настроить его внешний вид без ошибок платформы и как победить проблему «плывущей» сетки при динамической смене периодов.
Если для каждого режима отображения (день, неделя, месяц) вам требуются принципиально разные настройки колонок, разные измерения или специфическое поведение, самым простым и надежным решением с точки зрения проектирования интерфейса в конфигураторе является создание нескольких страниц на форме. На каждой странице будет располагаться свой собственный элемент планировщика.
Рассмотрим по шагам, как быстро и правильно добавить страницы на управляемую форму:
ГруппаРежимыПланировщика.СтраницаДень.СтраницаНеделя и СтраницаМесяц.Планировщик.Теперь для переключения между планировщиками нам достаточно управлять текущей страницей формы. Сделать это можно по нажатию обычных кнопок на форме, используя следующий программный код:
&НаКлиенте
Процедура ПриНажатииКнопкиДень(Команда)
Элементы.ГруппаРежимыПланировщика.ТекущаяСтраница = Элементы.СтраницаДень;
КонецПроцедуры
&НаКлиенте
Процедура ПриНажатииКнопкиНеделя(Команда)
Элементы.ГруппаРежимыПланировщика.ТекущаяСтраница = Элементы.СтраницаНеделя;
КонецПроцедуры
Такой подход исключает конфликты настроек шкал, однако он имеет существенный минус — избыточность данных. Нам приходится поддерживать три разных элемента управления на форме, что усложняет код их заполнения.
Гораздо более изящным и производительным решением является использование одного планировщика на форме, параметры которого меняются «на лету» при нажатии соответствующих кнопок. Это экономит память сервера и упрощает логику обновления данных. При необходимости можно воспользоваться альтернативным решением в виде универсального календаря для выбора периодов и перехода к датам.
Проанализируем пример кода, который выполняет переключение режимов для одного элемента планировщика на форме:
&НаКлиенте
Процедура УстановитьРежимОтображения(ИмяРежима)
// Сбросим текущие периоды
Планировщик.ТекущиеПериодыОтображения.Очистить();
ТекущаяДата = ТекущаяДатаСеанса();
Если ИмяРежима = "День" Тогда
// Настраиваем отображение одного текущего дня
Планировщик.ТекущиеПериодыОтображения.Добавить(НачалоДня(ТекущаяДата), КонецДня(ТекущаяДата));
Планировщик.ЕдиницаПериодическогоВарианта = ТипЕдиницыШкалыВремени.Час;
Планировщик.КратностьПериодическогоВарианта = 1; // Сетка по 1 часу
ИначеЕсли ИмяРежима = "Неделя" Тогда
// Настраиваем отображение текущей недели
Планировщик.ТекущиеПериодыОтображения.Добавить(НачалоНедели(ТекущаяДата), КонецНедели(ТекущаяДата));
Планировщик.ЕдиницаПериодическогоВарианта = ТипЕдиницыШкалыВремени.День;
Планировщик.КратностьПериодическогоВарианта = 1; // Сетка по дням
ИначеЕсли ИмяРежима = "Месяц" Тогда
// Настраиваем отображение текущего месяца
Планировщик.ТекущиеПериодыОтображения.Добавить(НачалоМесяца(ТекущаяДата), КонецМесяца(ТекущаяДата));
Планировщик.ЕдиницаПериодическогоВарианта = ТипЕдиницыШкалыВремени.День;
Планировщик.КратностьПериодическогоВарианта = 7; // Группировка сетки по неделям
КонецЕсли;
КонецПроцедуры
При использовании динамической настройки одного планировщика разработчики часто сталкиваются с неприятным поведением платформы: при первом открытии формы все отображается красиво, но при переключении режимов (например, с дня на неделю) сетка масштабируется некорректно, «плывет» или сжимается до нечитаемого состояния. Это происходит из-за того, что платформа пытается применить старые настройки шкалы времени к новому периоду.
Выясним причины и разберем по шагам правила безопасной инициализации планировщика:
ШкалаВремени.Элементы.
Важный нюанс платформы: вы не можете удалить единственный элемент из коллекции шкал. Чтобы избежать ошибок выполнения, сначала добавьте новый элемент шкалы времени, соответствующий новому режиму, и только после этого удалите старый элемент, который стал неактуальным.
ОтступСНачалаПереносаШкалыВремени и ОтступСКонцаПереносаШкалыВремени, устанавливая их в значение 0.
Планировщик.Измерения.Очистить();
Планировщик.Элементы.Очистить();
Элементы.Планировщик.Видимость = Ложь;
Элементы.Планировщик.Видимость = Истина;
Для визуального разделения интервалов в планировщике используется настройка линий делений шкалы. При попытке напрямую изменить тип линии у существующего свойства шкалы разработчики часто получают ошибку: «Поле объекта недоступно для записи (ТипЛинии)».
Проанализируем причину возникновения ошибки. Объект Линия в платформе 1С:Предприятие является неизменяемым (immutable) после своего создания. Вы не можете обратиться к свойству уже существующей линии и переопределить его. Единственный способ изменить оформление — создать новый объект Линия через конструктор и целиком присвоить его свойству шкалы.
Посмотрим на пример правильной программной установки линий:
// Ошибка! Так делать нельзя:
// Шкала.ЛинииДелений.ТипЛинии = ТипЛинииЯчейкиТабличногоДокумента.Сплошная;
// Правильный вариант: создаем новый объект Линия и присваиваем его свойству
Шкала = Планировщик.ШкалаВремени;
Шкала.ЛинииДелений = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Сплошная, 2);
Важное примечание: Обратите внимание на первый параметр конструктора Новый Линия. Тип используемого системного перечисления зависит от контекста. При настройке линий делений шкалы планировщика следует использовать перечисление ТипЛинииРисункаТабличногоДокумента. Использование перечисления ТипЛинииЯчейкиТабличногоДокумента (которое предназначено исключительно для отчетов и табличных документов) на некоторых релизах платформы может приводить к ошибкам совместимости и неверному отображению интерфейса.
Применяя данные подходы, вы сможете создать гибкий, красивый и быстродействующий интерфейс планировщика задач в 1С 8.3 без визуальных искажений и ошибок платформы.