Как убрать дублирование времени для каждого столбца в планировщике 1С

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

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

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

Причина дублирования временной шкалы

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

Способ 1. Использование измерений вместо периодов отображения

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

Проанализируем пример кода, который создает такую структуру:


// Настраиваем базовую шкалу на один день
Планировщик.ЕдиницаПериодическогоВарианта = ТипЕдиницыШкалыВремени.Час;
Планировщик.КратностьПериодическогоВарианта = 24;
Планировщик.ВыравниватьГраницыЭлементовПоШкалеВремени = Ложь;

// Устанавливаем период отображения только на сегодня
Планировщик.НачалоПериодаОтображения = НачалоДня(ТекущаяДата());
Планировщик.КонецПериодаОтображения = КонецДня(ТекущаяДата());

// Создаем измерение, которое будет имитировать колонки дней
ДобавитьИзмерения = Планировщик.Измерения.Добавить("Дни");

// Заполняем измерение элементами (датами на 10 дней вперед)
Для Счетчик = 0 по 10 цикл
    ДатаКолонки = ТекущаяДата() + Счетчик * 24 * 60 * 60;
    НовыйЭлемент = ДобавитьИзмерения.Элементы.Добавить(Формат(ДатаКолонки, "ДФ=дд.ММ"));
    НовыйЭлемент.Текст = Формат(ДатаКолонки, "ДФ='дддд, д ММММ'");
КонецЦикла;

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

Способ 2. Правильная настройка «Текущих периодов отображения»

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

Посмотрим на пример правильной инициализации в процедуре ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Планировщик.ВыравниватьГраницыЭлементовПоШкалеВремени = Ложь;
    
    // Очищаем старые периоды
    Планировщик.ТекущиеПериодыОтображения.Очистить();
    
    // Задаем один сплошной период от начала недели до конца следующей
    НачалоПериода = НачалоНедели(ТекущаяДата());
    КонецПериода = КонецНедели(ТекущаяДата() + 86400 * 7);
    
    // Добавляем ОДИН период. Если добавить несколько, шкала будет дублироваться
    Планировщик.ТекущиеПериодыОтображения.Добавить(НачалоПериода, КонецПериода);
    
    // Настраиваем перенос шкалы, чтобы не показывать ночные часы
    // Это поможет оставить время только в начале (слева)
    Планировщик.ОтступСНачалаПереносаШкалыВремени = 8; // С 8 утра
    Планировщик.ОтступСКонцаПереносаШкалыВремени = 18; // До 18 вечера
    
КонецПроцедуры

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

Работа со шкалой времени и форматами

Выясним причину, по которой время может мешать визуально. Иногда пользователю мешает не само наличие шкалы, а ее избыточность. Мы можем настроить ЭлементыШкалыВремени, чтобы заголовки были более лаконичными. Рассмотрим, как программно изменить формат заголовков, чтобы они занимали меньше места:


// Настройка формата заголовков для дней и часов
Шкала = Планировщик.ШкалаВремени;
Шкала.Элементы.Очистить();

// Добавляем уровень дней
НовыйУровеньДни = Шкала.Элементы.Добавить(ТипЕдиницыШкалыВремени.День, 1);
НовыйУровеньДни.Формат = "ДФ='дддд, д ММММ'";

// Добавляем уровень часов (будет отображаться только слева, если период один)
НовыйУровеньЧасы = Шкала.Элементы.Добавить(ТипЕдиницыШкалыВремени.Час, 1);
НовыйУровеньЧасы.Формат = "ДФ=ЧЧ:мм";

Полезный совет: Если вы используете Платформу 8.3.15 и выше, обратите внимание на свойство ПоложениеШкалыВремени. Установка этого значения в Слева явно указывает планировщику, где должна находиться ось времени, что минимизирует вероятность ее появления в каждой колонке.

Ограничения и важные нюансы

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

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

Таким образом, мы рассмотрели два принципиально разных подхода. Если вам нужна просто красивая "шахматка" с датами сверху и временем только слева — используйте Измерения. Если вам важна стандартная логика работы 1С с периодами и автоматизация — используйте один непрерывный период отображения с настроенными отступами переноса шкалы.

← На главную