При работе с элементом управления Планировщик в 1С:Предприятие разработчики часто сталкиваются со стандартным поведением платформы: при добавлении нескольких периодов отображения или дней, система автоматически отрисовывает временную шкалу (часы) для каждой колонки. Это сильно загромождает интерфейс, особенно если нужно отобразить сетку на 10 и более дней. Наша задача — сделать так, чтобы время отображалось только один раз (слева), а остальные колонки представляли собой просто чистую сетку для планирования.
В этой статье мы подробно разберем, почему это происходит, и проанализируем основные способы решения этой задачи, включая использование механизма измерений и правильную настройку шкалы времени.
Разберем ситуацию: по умолчанию Планировщик настроен так, что каждый элемент коллекции ТекущиеПериодыОтображения воспринимается как самостоятельный блок со своей собственной шкалой времени. Если вы программно добавляете в эту коллекцию 7 дней по отдельности, платформа отрисует 7 вертикальных шкал. Чтобы этого избежать, нам нужно изменить подход к формированию структуры данных планировщика.
Это наиболее эффективный «обходной путь», который позволяет оставить временную шкалу только в одном экземпляре. Суть заключается в том, что мы устанавливаем один общий период отображения (например, текущие сутки), а разделение на «колонки-дни» реализуем через механизм Измерений.
Проанализируем пример кода, который создает такую структуру:
// Настраиваем базовую шкалу на один день
Планировщик.ЕдиницаПериодическогоВарианта = ТипЕдиницыШкалыВремени.Час;
Планировщик.КратностьПериодическогоВарианта = 24;
Планировщик.ВыравниватьГраницыЭлементовПоШкалеВремени = Ложь;
// Устанавливаем период отображения только на сегодня
Планировщик.НачалоПериодаОтображения = НачалоДня(ТекущаяДата());
Планировщик.КонецПериодаОтображения = КонецДня(ТекущаяДата());
// Создаем измерение, которое будет имитировать колонки дней
ДобавитьИзмерения = Планировщик.Измерения.Добавить("Дни");
// Заполняем измерение элементами (датами на 10 дней вперед)
Для Счетчик = 0 по 10 цикл
ДатаКолонки = ТекущаяДата() + Счетчик * 24 * 60 * 60;
НовыйЭлемент = ДобавитьИзмерения.Элементы.Добавить(Формат(ДатаКолонки, "ДФ=дд.ММ"));
НовыйЭлемент.Текст = Формат(ДатаКолонки, "ДФ='дддд, д ММММ'");
КонецЦикла;
Рассмотрим, что происходит в этом коде. Мы «обманываем» планировщик: он думает, что показывает только один день (поэтому рисует шкалу времени только один раз слева), но за счет измерения Дни он размножает визуальные колонки. Важно помнить: при таком подходе стандартная привязка данных к датам усложняется. Вам придется программно сопоставлять значения измерения с реальными датами при записи и чтении событий.
Если вы хотите сохранить стандартную работу с датами, нам нужно настроить коллекцию ТекущиеПериодыОтображения так, чтобы она не дробила шкалу. Ошибка многих разработчиков заключается в добавлении каждого дня отдельной строкой в цикле. Вместо этого попробуем задать один непрерывный интервал, но ограничить отображение только рабочими часами.
Посмотрим на пример правильной инициализации в процедуре ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Планировщик.ВыравниватьГраницыЭлементовПоШкалеВремени = Ложь;
// Очищаем старые периоды
Планировщик.ТекущиеПериодыОтображения.Очистить();
// Задаем один сплошной период от начала недели до конца следующей
НачалоПериода = НачалоНедели(ТекущаяДата());
КонецПериода = КонецНедели(ТекущаяДата() + 86400 * 7);
// Добавляем ОДИН период. Если добавить несколько, шкала будет дублироваться
Планировщик.ТекущиеПериодыОтображения.Добавить(НачалоПериода, КонецПериода);
// Настраиваем перенос шкалы, чтобы не показывать ночные часы
// Это поможет оставить время только в начале (слева)
Планировщик.ОтступСНачалаПереносаШкалыВремени = 8; // С 8 утра
Планировщик.ОтступСКонцаПереносаШкалыВремени = 18; // До 18 вечера
КонецПроцедуры
В этом случае, если Планировщик.ОтображатьВременнуюШкалу установлено в Авто, платформа постарается расположить шкалу максимально компактно. Однако, если колонки становятся слишком узкими, 1С может снова начать дублировать время. Чтобы этого не произошло, необходимо контролировать ширину элементов.
Выясним причину, по которой время может мешать визуально. Иногда пользователю мешает не само наличие шкалы, а ее избыточность. Мы можем настроить ЭлементыШкалыВремени, чтобы заголовки были более лаконичными. Рассмотрим, как программно изменить формат заголовков, чтобы они занимали меньше места:
// Настройка формата заголовков для дней и часов
Шкала = Планировщик.ШкалаВремени;
Шкала.Элементы.Очистить();
// Добавляем уровень дней
НовыйУровеньДни = Шкала.Элементы.Добавить(ТипЕдиницыШкалыВремени.День, 1);
НовыйУровеньДни.Формат = "ДФ='дддд, д ММММ'";
// Добавляем уровень часов (будет отображаться только слева, если период один)
НовыйУровеньЧасы = Шкала.Элементы.Добавить(ТипЕдиницыШкалыВремени.Час, 1);
НовыйУровеньЧасы.Формат = "ДФ=ЧЧ:мм";
Полезный совет: Если вы используете Платформу 8.3.15 и выше, обратите внимание на свойство ПоложениеШкалыВремени. Установка этого значения в Слева явно указывает планировщику, где должна находиться ось времени, что минимизирует вероятность ее появления в каждой колонке.
Проанализируем ситуацию с шириной колонок. В 1С Планировщик автоматически распределяет ширину колонок в зависимости от ширины формы. Если вы используете Измерения (как в Способе 1), помните:
Дни, преобразовывать его обратно в дату и сохранять в базу данных, так как свойство Начало у элемента планировщика в этом случае будет содержать только время (в пределах тех суток, что мы задали в периоде отображения).Таким образом, мы рассмотрели два принципиально разных подхода. Если вам нужна просто красивая "шахматка" с датами сверху и временем только слева — используйте Измерения. Если вам важна стандартная логика работы 1С с периодами и автоматизация — используйте один непрерывный период отображения с настроенными отступами переноса шкалы.