Как настроить временную шкалу и периоды в Диаграмме Ганта 1С?

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

При работе с объектом ДиаграммаГанта в управляемых формах 1С часто возникает задача настроить отображение временной шкалы — для этого подойдёт автоматизация планирования проектов с диаграммой Ганта. Это более специфичная задача, чем, например, создание и соединение точек в системе координат, так как здесь мы жестко привязаны к календарным датам, а не абстрактным осям X и Y. Например, нужно показать данные в разрезе дней, недель, месяцев или кварталов. Многие разработчики интуитивно пытаются использовать метод УстановитьИнтервал(), предполагая, что он отвечает за детализацию шкалы. Однако это приводит к неожиданным результатам: общий период диаграммы меняется, а деления шкалы остаются прежними. Давайте разберемся, в чем здесь дело и как правильно управлять масштабом диаграммы.

Разбираем ошибку: почему УстановитьИнтервал() не меняет шкалу?

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

Диаграмма.УстановитьИнтервал(НачалоДня(ТекущаяДата()), КонецДня(ТекущаяДата()));

Затем, для отображения по месяцам, он попробовал так:


Диаграмма.УстановитьИнтервал(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));

В обоих случаях детализация шкалы не изменилась. Почему так происходит? Это не похоже на пример использования 2D графики без внешних компонент, где разработчик полностью контролирует отрисовку каждой линии; здесь платформа 1С берет управление визуализацией на себя. Дело в том, что метод УстановитьИнтервал(Начало, Конец) предназначен исключительно для установки границ видимой области диаграммы. Он отвечает на вопрос "какой период времени мы видим на экране?", но не на вопрос "в каких единицах (днях, месяцах) этот период разбит?".

Таким образом, этот метод работает как "зум" на определенный отрезок времени, но не меняет "линейку", по которой мы измеряем этот отрезок.

Правильное решение: используем метод УстановитьМасштаб()

Для управления детализацией временной шкалы предназначен другой метод — УстановитьМасштаб(). Именно он позволяет задать, в каких единицах будет отображаться период: днях, неделях, месяцах и так далее. Рассмотрим его синтаксис подробнее.

УстановитьМасштаб(НачалоПериода, ОкончаниеПериода, МасштабОтображения)

  1. НачалоПериода — дата начала отображаемого интервала.
  2. ОкончаниеПериода — дата окончания отображаемого интервала.
  3. МасштабОтображения — самый важный параметр. Он имеет тип МасштабОтображенияИнтерваловДиаграммыГанта и определяет единицу измерения шкалы.

Параметр МасштабОтображения может принимать следующие системные перечисления:

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


Процедура УстановитьПериодИМасштабДиаграммы()

    // Определяем границы периода - текущий месяц
    НачалоПериода = НачалоМесяца(ТекущаяДата());
    КонецПериода = КонецМесяца(ТекущаяДата());

    // Устанавливаем масштаб с отображением по дням
    Масштаб = МасштабОтображенияИнтерваловДиаграммыГанта.День;

    // Применяем настройки к диаграмме
    Элементы.МояДиаграмма.УстановитьМасштаб(НачалоПериода, КонецПериода, Масштаб);

КонецПроцедуры

В этом коде мы четко указываем платформе: "покажи нам интервал с начала до конца текущего месяца и разбей шкалу на дни". Это именно то, что требовалось автору. Если бы нам нужна была разбивка по неделям, мы бы просто изменили одну строку:

Масштаб = МасштабОтображенияИнтерваловДиаграммыГанта.Неделя;

Важный момент: метод УстановитьМасштаб() одновременно устанавливает и видимый интервал, и его детализацию, поэтому использовать после него УстановитьИнтервал() не нужно.

Продвинутая настройка: работа со свойством ШкалаВремени

Метод УстановитьМасштаб() является удобной оберткой для быстрой настройки. Однако для создания более сложных, многоуровневых шкал времени (например, когда сверху отображаются месяцы, а снизу — дни) необходимо работать напрямую со свойством ШкалаВремени. Этот механизм значительно удобнее и гибче, чем рисование линий и закрашивание областей в табличном документе вручную для имитации графика.

Это свойство представляет собой коллекцию, каждый элемент которой (ЭлементШкалыВремениДиаграммыГанта) описывает один уровень шкалы. Разберем по шагам, как создать двухуровневую шкалу.

  1. Очищаем существующую шкалу. Перед добавлением новых уровней рекомендуется очистить стандартные. Диаграмма.ШкалаВремени.Очистить();
  2. Добавляем верхний уровень (месяцы). Создаем новый элемент шкалы, указываем единицу измерения и формат отображения.
    
    // Верхний уровень шкалы - Месяцы
    ЭлементШкалыМесяц = Диаграмма.ШкалаВремени.Добавить();
    ЭлементШкалыМесяц.Единица = ЕдиницаМасштабаДиаграммыГанта.Месяц;
    ЭлементШкалыМесяц.Формат = "Л_месяца='MMMM yyyy'"; // Выведет "Январь 2024", "Февраль 2024" и т.д.
    
  3. Добавляем нижний уровень (дни). Аналогично добавляем второй элемент для отображения дней. Кстати, для улучшения восприятия данных важна не только структура шкалы, но и визуальный стиль (поможет инструмент настройки визуального оформления диаграмм), напоминающий настройку цветов серий в диаграмме отчета на СКД.
    
    // Нижний уровень шкалы - Дни
    ЭлементШкалыДень = Диаграмма.ШкалаВремени.Добавить();
    ЭлементШкалыДень.Единица = ЕдиницаМасштабаДиаграммыГанта.День;
    ЭлементШкалыДень.Формат = "dd"; // Выведет числа дней: 01, 02, 03...
    
  4. Устанавливаем видимый интервал. После настройки шкал нужно задать видимый период с помощью уже знакомого нам метода УстановитьИнтервал().
    
    // Устанавливаем границы отображения, например, на первый квартал года
    НачалоИнтервала = НачалоКвартала(ТекущаяДата());
    КонецИнтервала = КонецКвартала(ТекущаяДата());
    Диаграмма.УстановитьИнтервал(НачалоИнтервала, КонецИнтервала);
    
  5. Обновляем диаграмму. Чтобы изменения вступили в силу, можно вызвать метод Обновить(), хотя обычно это происходит автоматически.

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

Подведем итог: для управления отображением периодов в ДиаграммеГанта запомните простое правило. Если нужно просто и быстро задать шкалу в одних единицах (дни, месяцы, кварталы) — используйте метод УстановитьМасштаб(). Если требуется сложная, многоуровневая шкала с особым форматированием — работайте напрямую со свойством-коллекцией ШкалаВремени. Если же возможностей стандартной диаграммы недостаточно для ваших задач визуализации, можно рассмотреть использование SVG картинок в интерфейсе 1С или даже использование 1С + PlantUML + JavaScript для расширения интерактивных функций. Для этой задачи есть конструктор интерфейсов и рабочих столов без программирования.

← На главную