Диаграмма Ганта (еще ее называют ленточной диаграммой) позволяет визуально отобразить временные интервалы использования ресурсов объектами. В объектной модели встроенного языка 1С представлена объектом ДиаграммаГанта, используемые ресурсы являются сериями, а объекты, которые эти ресурсы используют – точками. Рассмотрим простой пример создания диаграммы Ганта.
Программное формирование диаграммы Ганта в 1С
Создадим в 1С в режиме конфигуратора обработку, добавим реквизит ДГ с типом ДиаграммаГанта, и выведем на форму в виде элемента с видом “Поле диаграммы Ганта”
Добавим команду “Сформировать”, вынесем кнопку на форму. Так как чаще всего диаграмма Ганта наполняется значениями из базы данных, заполнять ее будем на сервере, без контекста. В качестве параметра передадим сам объект диаграммы – ДГ.
В примере используем несколько вариантов работы с интервалами в диаграмме Ганта:
- Процедура ЗаполнитьДанныеОтчетности() – все данные формируются из встроенного языка
- ЗаполнитьГрафикОтпусков() – данные берутся из базы данных. Также приведен пример заполнения вспомогательных реквизитов, появившихся в версии платформы 8.3.21. Для этого создадим и наполним регистр сведений ГрафикОтпусков. Структуру регистра и тестовые данные см. ниже.
- ЗаполнитьГрафикСогласованияБюджета() – продемонстрирована связь интервалов и иерархия точек.
Для того, чтобы платформа не выполняла лишних пересчетов в процессе наполнения данными, на время заполнения диаграммы признак обновления устанавливаем в Ложь. Также очистим саму диаграмму Ганта и коллекцию меток. После этого на примере вывода метки текущей даты рассмотрим работу с метками.
&НаСервереБезКонтекста Процедура СформироватьНаСервере(ДГ) ДГ.Обновление = Ложь; ДГ.Очистить(); ЗаполнитьДанныеОтчетности(ДГ); ЗаполнитьГрафикОтпусков(ДГ); ЗаполнитьГрафикСогласованияБюджета(ДГ); Шкала = ДГ.ОбластьПостроения.ШкалаВремени.Элементы[0]; Шкала.Метки.Очистить(); МеткаВремени = Шкала.Метки.Добавить(НачалоДня(ТекущаяДата())); МеткаВремени.Текст = "Текущая дата " + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy"); МеткаВремени.ЦветТекста = WebЦвета.Красный; МеткаВремени.ЦветЛинии = WebЦвета.Красный; ДГ.Обновление = Истина; КонецПроцедуры
Рассмотрим пример программного наполнения диаграммы Ганта. Сперва необходимо описать точку, затем серию. После этого на пересечении точки и серии мы указываем значение. А дальше для значения мы можем создать один или несколько интервалов.
&НаСервереБезКонтекста Процедура ЗаполнитьДанныеОтчетности(ДГ) ТочкаН = ДГ.УстановитьТочку("Налоговая"); //Картинка будет отображаться слева от имени точки в виде маленькой иконки ТочкаН.Картинка = БиблиотекаКартинок.ВложеннаяТаблица; ТочкаБ = ДГ.УстановитьТочку("Бухгалтерская"); ТочкаБ.Картинка = БиблиотекаКартинок.ВидРасчета; //Серия отвечает за цветовое оформление Серия = ДГ.УстановитьСерию("Отчетность"); НалоговаяОтчетность = ДГ.ПолучитьЗначение(ТочкаН, Серия); БухОтчетность = ДГ.ПолучитьЗначение(ТочкаБ, Серия); Интервал_КВ1 = НалоговаяОтчетность.Добавить(); Интервал_КВ1.Начало = Дата(2022, 04, 01); Интервал_КВ1.Конец = Дата(2022, 04, 15); //Текст выводится во всплывающей подсказке Интервал_КВ1.Текст = "Квартальная, 1 кв."; Интервал_КВ2 = НалоговаяОтчетность.Добавить(); Интервал_КВ2.Начало = Дата(2022, 07, 01); Интервал_КВ2.Конец = Дата(2022, 07, 15); Интервал_КВ2.Текст = "Полугодие"; //Интервалы также можно отдельно выделять цветом Интервал_КВ2.Цвет = WebЦвета.ТемноЗеленый; Интервал_БКВ1 = БухОтчетность.Добавить(); Интервал_БКВ1.Начало = Дата(2022, 04, 10); Интервал_БКВ1.Конец = Дата(2022, 04, 20); Интервал_БКВ1.Текст = "Квартальная, 1 кв."; Интервал_БКВ2 = БухОтчетность.Добавить(); Интервал_БКВ2.Начало = Дата(2022, 07, 10); Интервал_БКВ2.Конец = Дата(2022, 07, 20); Интервал_БКВ2.Текст = "Полугодие"; Интервал_БКВ2.Цвет = WebЦвета.ТемноЗеленый; КонецПроцедуры
В версии платформы 8.3.21 у диаграммы Ганта появилась возможность добавлять произвольные реквизиты, которые выводятся в табличной части слева от области диаграммы. Вспомогательные реквизиты программно заполняются через коллекцию Значение.Данные. Рассмотрим еще один пример формирования диаграммы Ганта, на этот раз по данным из информационной базы.
&НаСервереБезКонтекста Процедура ЗаполнитьГрафикОтпусков(ДГ) Запрос = Новый Запрос("ВЫБРАТЬ | ГрафикОтпусков.Сотрудник КАК Сотрудник, | ГрафикОтпусков.Сотрудник.Должность КАК Должность, | ГрафикОтпусков.ДатаНачала КАК ДатаНачала, | ГрафикОтпусков.ДатаОкончания КАК ДатаОкончания |ИЗ | РегистрСведений.ГрафикОтпусков КАК ГрафикОтпусков"); Выборка = Запрос.Выполнить().Выбрать(); Серия = ДГ.УстановитьСерию("Отпуска"); Пока Выборка.Следующий() Цикл Точка = ДГ.УстановитьТочку(Выборка.Сотрудник); Значение = ДГ.ПолучитьЗначение(Точка, Серия); //Пример заполнения вспомогательного реквизита Значение.Данные.Должность = Выборка.Должность; Интервал = Значение.Добавить(); Интервал.Начало = Выборка.ДатаНачала; Интервал.Конец = Выборка.ДатаОкончания; КонецЦикла; КонецПроцедуры
Содержимое регистра см. на скриншоте ниже.
Интервалы на диаграмме Ганта можно связывать один с другим. Делается это немного непривычным образом. Сперва мы создаем первый интервал, затем второй, и после этого в первый интервал добавляем второй. Рассмотрим это на примере отображения условного процесса согласования бюджета.
&НаСервереБезКонтекста Процедура ЗаполнитьГрафикСогласованияБюджета(ДГ) ТочкаБюджет = ДГ.УстановитьТочку("Формирование бюджета"); ТочкаСогласованиеРабот = ДГ.УстановитьТочку("Согласование работ", "Формирование бюджета"); ТочкаСогласованиеРасходов = ДГ.УстановитьТочку("Согласование расходов", "Формирование бюджета"); ТочкаУтверждениеБюджета = ДГ.УстановитьТочку("Утверждение бюджета", "Формирование бюджета"); Серия = ДГ.УстановитьСерию("Бюджет"); Значение = ДГ.ПолучитьЗначение(ТочкаБюджет, Серия); Интервал = Значение.Добавить(); Интервал.Начало = Дата(2022,01,10); Интервал.Конец = Дата(2022,03,10); Значение = ДГ.ПолучитьЗначение(ТочкаСогласованиеРабот, Серия); Интервал = Значение.Добавить(); Интервал.Начало = Дата(2022,01,10); Интервал.Конец = Дата(2022,01,20); Интервал2 = Значение.Добавить(); Интервал2.Начало = Дата(2022,01,21); Интервал2.Конец = Дата(2022,01,31); Интервал.Добавить(Интервал2); Значение = ДГ.ПолучитьЗначение(ТочкаСогласованиеРасходов, Серия); Интервал3 = Значение.Добавить(); Интервал3.Начало = Дата(2022,02,01); Интервал3.Конец = Дата(2022,02,10); Интервал2.Добавить(Интервал3); Значение = ДГ.ПолучитьЗначение(ТочкаУтверждениеБюджета, Серия); Интервал4 = Значение.Добавить(); Интервал4.Начало = Дата(2022,03,15); Интервал4.Конец = Дата(2022,03,20); //Множественная связь этапов Интервал2.Добавить(Интервал4); Интервал3.Добавить(Интервал4); КонецПроцедуры
Теперь посмотрим, что получилось в итоге. Ниже – пример диаграммы Ганта, которую мы заполнили.
Настройки диаграммы Ганта
Внешний вид диаграммы Ганта в 1С можно настраивать достаточно гибко, при этом настройки возможны как в Конфигураторе, так и в пользовательском режиме.
Чтобы настроить диаграмму Ганта в конфигураторе, нужно открыть свойства нужного реквизита, нажать ссылку Настройка: Открыть. В открывшемся окне по правой кнопке открыть контекстное меню и выбрать пункт “Настройка”.
В режиме пользователя достаточно просто щелкнуть правой кнопкой на диаграмме Ганта и выбрать “Настройка”.
В открывшемся окне можно создать нужное количество временных шкал и задать их свойства. Можно настроить цвета, шрифты, задать список меток и единицу времени на шкале. Например при планировании графика отпусков удобно выводить по неделям, а при работе с бизнес-процессами – по дням. Особое внимание уделите полю Кратность. Оно отвечает за последовательность временных единиц. Например, если указать кратность 2, то для дней получим 01.01, 03.01, 05.01…, т.е. через день. А та же самая кратность для единицы “Месяц” даст деления шкалы январь, март, май и т.д.
Метки не обязательно задавать кодом, их можно настроить, открыв соответствующее окно в настройках Диаграммы Ганта. Для меток можно указать дату, текст, цвет линий и текста.
Также в настройках диаграммы Ганта в 1С можно задать период, за который она будет выведена. Например, при долгосрочном планировании можно указать вывод нескольких лет на временной шкале, даже если данных за будущие даты нет. Для этого выбираем Период, показывать <Нужное количество лет> и вид интервала “Год”. Ниже приведен пример такой настройки и соответствующий внешний вид диаграммы Ганта. Для удобства выведены две шкалы – по годам и по месяцам.
В конфигураторе доступна еще одна настройка диаграммы Ганта – оформление цвета фона для разных интервалов. На примере ниже показана настройка фона и ее результат. Разумеется, интервалы фона можно настраивать и средствами встроенного языка. Например, можно выделять цветом выходные и праздничные дни.
Рассмотрим пример – нужно оформить субботу и воскресенье серым цветом.
ДГ.ИнтервалыФона.Очистить(); ДатаНач = НачалоГода(ТекущаяДата()); Пока ДатаНач <= КонецГода(ТекущаяДата()) Цикл Если ДеньНедели(ДатаНач) > 5 Тогда ИнтервалФона = ДГ.ИнтервалыФона.Добавить(ДатаНач, КонецДня(ДатаНач)); ИнтервалФона.Цвет = WebЦвета.Серый; КонецЕсли; ДатаНач = ДатаНач + 86400; КонецЦикла;
В пользовательском режиме доступны все те же настройки, что и в конфигураторе, кроме оформления интервалов фона. Примечательно, что интервалы фона применяются только до той даты, по которую в диаграмме есть данные. При этом учитывается единица измерения времени. Т.е. “в будущее” она их не отрисовывает, даже несмотря на то, что в коллекции ИнтервалыФона эти даты есть. Например, мы имеем последний интервал с датой окончания 16.08.2022. В этом случае если единица указана Неделя, то раскрашены будут только интервалы до недели с 15 по 21. 08. А вот если указать единицу Год – то раскраска выходных отрисуется до конца года.