Как в управляемой форме 1С настроить планировщик для отображения дня, недели и месяца и переключать их без искажения интерфейса

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

При разработке интерфейсов в 1С:Предприятии 8.3 перед программистом часто встает задача визуализации расписания, задач или загрузки сотрудников. Для этих целей идеально подходит стандартный элемент управления Планировщик. Однако при попытке реализовать динамическое переключение масштабов (например, просмотр расписания по дням, неделям или месяцам) разработчики сталкиваются с рядом трудностей: интерфейс начинает «плыть», шкала времени сжимается, а свойства элементов управления ведут себя непредсказуемо.

В этой статье мы подробно разберем, как правильно спроектировать интерфейс для работы с планировщиком в управляемых формах, как настроить его внешний вид без ошибок платформы и как победить проблему «плывущей» сетки при динамической смене периодов.

Решение 1. Использование механизма страниц для разделения планировщиков

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

Рассмотрим по шагам, как быстро и правильно добавить страницы на управляемую форму:

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

Теперь для переключения между планировщиками нам достаточно управлять текущей страницей формы. Сделать это можно по нажатию обычных кнопок на форме, используя следующий программный код:


&НаКлиенте
Процедура ПриНажатииКнопкиДень(Команда)
    Элементы.ГруппаРежимыПланировщика.ТекущаяСтраница = Элементы.СтраницаДень;
КонецПроцедуры

&НаКлиенте
Процедура ПриНажатииКнопкиНеделя(Команда)
    Элементы.ГруппаРежимыПланировщика.ТекущаяСтраница = Элементы.СтраницаНеделя;
КонецПроцедуры

Такой подход исключает конфликты настроек шкал, однако он имеет существенный минус — избыточность данных. Нам приходится поддерживать три разных элемента управления на форме, что усложняет код их заполнения.

Решение 2. Динамическая перестройка одного планировщика

Гораздо более изящным и производительным решением является использование одного планировщика на форме, параметры которого меняются «на лету» при нажатии соответствующих кнопок. Это экономит память сервера и упрощает логику обновления данных. При необходимости можно воспользоваться альтернативным решением в виде универсального календаря для выбора периодов и перехода к датам.

Проанализируем пример кода, который выполняет переключение режимов для одного элемента планировщика на форме:


&НаКлиенте
Процедура УстановитьРежимОтображения(ИмяРежима)
    
    // Сбросим текущие периоды
    Планировщик.ТекущиеПериодыОтображения.Очистить();
    ТекущаяДата = ТекущаяДатаСеанса();
    
    Если ИмяРежима = "День" Тогда
        
        // Настраиваем отображение одного текущего дня
        Планировщик.ТекущиеПериодыОтображения.Добавить(НачалоДня(ТекущаяДата), КонецДня(ТекущаяДата));
        Планировщик.ЕдиницаПериодическогоВарианта = ТипЕдиницыШкалыВремени.Час;
        Планировщик.КратностьПериодическогоВарианта = 1; // Сетка по 1 часу
        
    ИначеЕсли ИмяРежима = "Неделя" Тогда
        
        // Настраиваем отображение текущей недели
        Планировщик.ТекущиеПериодыОтображения.Добавить(НачалоНедели(ТекущаяДата), КонецНедели(ТекущаяДата));
        Планировщик.ЕдиницаПериодическогоВарианта = ТипЕдиницыШкалыВремени.День;
        Планировщик.КратностьПериодическогоВарианта = 1; // Сетка по дням
        
    ИначеЕсли ИмяРежима = "Месяц" Тогда
        
        // Настраиваем отображение текущего месяца
        Планировщик.ТекущиеПериодыОтображения.Добавить(НачалоМесяца(ТекущаяДата), КонецМесяца(ТекущаяДата));
        Планировщик.ЕдиницаПериодическогоВарианта = ТипЕдиницыШкалыВремени.День;
        Планировщик.КратностьПериодическогоВарианта = 7; // Группировка сетки по неделям
        
    КонецЕсли;
    
КонецПроцедуры

Решение 3. Что делать, если сетка планировщика «плывет» при смене периодов

При использовании динамической настройки одного планировщика разработчики часто сталкиваются с неприятным поведением платформы: при первом открытии формы все отображается красиво, но при переключении режимов (например, с дня на неделю) сетка масштабируется некорректно, «плывет» или сжимается до нечитаемого состояния. Это происходит из-за того, что платформа пытается применить старые настройки шкалы времени к новому периоду.

Выясним причины и разберем по шагам правила безопасной инициализации планировщика:

  1. Правильная очистка и добавление элементов шкалы времени. При переходе между масштабами (особенно при переходе на масштаб «Месяц») необходимо полностью перестраивать коллекцию ШкалаВремени.Элементы. Важный нюанс платформы: вы не можете удалить единственный элемент из коллекции шкал. Чтобы избежать ошибок выполнения, сначала добавьте новый элемент шкалы времени, соответствующий новому режиму, и только после этого удалите старый элемент, который стал неактуальным.
  2. Сброс настроек скрытия нерабочего времени. Для режимов «День» и «Неделя» часто задаются свойства скрытия ночных часов с помощью отступов начала и конца переноса шкалы. При переключении в режим «Месяц» эти свойства обязательно нужно сбросить в исходное состояние, иначе сетка исказится. Обязательно очищайте свойства ОтступСНачалаПереносаШкалыВремени и ОтступСКонцаПереносаШкалыВремени, устанавливая их в значение 0.
  3. Очистка старых данных. Перед перестроением сетки всегда очищайте коллекции измерений и элементов планировщика, иначе старые данные будут пытаться спозиционироваться на новой сетке, вызывая визуальные баги:
    
    Планировщик.Измерения.Очистить();
    Планировщик.Элементы.Очистить();
    
  4. Обход бага отрисовки через принудительное обновление видимости. Если на вашем релизе платформы при смене масштаба шкала времени все равно отображается некорректно (сжимается до минимальной ширины), используйте проверенный обходной путь: временно отключите и снова включите видимость элемента формы с планировщиком. Это заставит платформу выполнить полную перерисовку объекта.
    
    Элементы.Планировщик.Видимость = Ложь;
    Элементы.Планировщик.Видимость = Истина;
    

Решение 4. Настройка сетки и исправление ошибки «Поле объекта недоступно для записи (ТипЛинии)»

Для визуального разделения интервалов в планировщике используется настройка линий делений шкалы. При попытке напрямую изменить тип линии у существующего свойства шкалы разработчики часто получают ошибку: «Поле объекта недоступно для записи (ТипЛинии)».

Проанализируем причину возникновения ошибки. Объект Линия в платформе 1С:Предприятие является неизменяемым (immutable) после своего создания. Вы не можете обратиться к свойству уже существующей линии и переопределить его. Единственный способ изменить оформление — создать новый объект Линия через конструктор и целиком присвоить его свойству шкалы.

Посмотрим на пример правильной программной установки линий:


// Ошибка! Так делать нельзя:
// Шкала.ЛинииДелений.ТипЛинии = ТипЛинииЯчейкиТабличногоДокумента.Сплошная;

// Правильный вариант: создаем новый объект Линия и присваиваем его свойству
Шкала = Планировщик.ШкалаВремени;
Шкала.ЛинииДелений = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Сплошная, 2);

Важное примечание: Обратите внимание на первый параметр конструктора Новый Линия. Тип используемого системного перечисления зависит от контекста. При настройке линий делений шкалы планировщика следует использовать перечисление ТипЛинииРисункаТабличногоДокумента. Использование перечисления ТипЛинииЯчейкиТабличногоДокумента (которое предназначено исключительно для отчетов и табличных документов) на некоторых релизах платформы может приводить к ошибкам совместимости и неверному отображению интерфейса.

Применяя данные подходы, вы сможете создать гибкий, красивый и быстродействующий интерфейс планировщика задач в 1С 8.3 без визуальных искажений и ошибок платформы.

← На главную