Полоски в 1С (простой пример вывода диаграммы Ганта)
Диаграмма Ганта — эффективный способ управления проектами, разработанный экономистом Генри Гантом в 1910 году. Она позволяет отображать несколько временных интервалов в едином потоке, выявляя пересечения, окна простоя. Что, в свою очередь, позволяет гибко управлять сроками проекта.
Платформа 1С:Предприятие имеет штатные средства отображения диаграммы Ганта. Рассмотрим самый простой пример добавления такой диаграммы. Предположим, у нас есть некий проект, разбитый по задачам, и несколько исполнителей, которые могут выполнять задачи. Данные по задачам располагаются в регистре сведений с указанием Даты начала (Дата), Даты окончания (Дата), Задачи (справочник Задачи) и её Исполнителя (справочник Контрагенты). Мы хотим видеть периоды исполнения по задачам в виде диаграммы Ганта.
Для начала расположим необходимые реквизиты и элементы на форме. Нам понадобятся:
- Собственно, сама Диаграмма Ганта. Добавляем реквизит и соответствующий элемент на форму;
- Способ ограничить её период — например, реквизит с типом Стандартный период. Назовём его ПериодОтчета и разместим на форме;
- Команда Сформировать для формирования диаграммы;
Остановимся немного, чтобы разобраться с терминологией. В диаграмму Ганта входят следующие части:
- Точка — расположенные на вертикальной оси группировки данных;
- Серия — дополнительная аналитика каждой из точек. Так же располагаются на вертикальной оси, имеют подписанную легенду;
- Значение — состоит из точки и серии. Представлено отдельной полосой на диаграмме;
- Интервал — принадлежит значению и определяет начало и конец полоски Значения. Располагается на горизонтальной оси;
Считаем данные из регистра сведений, сделав бесконтекстный серверный вызов. Для простоты будем включать в запрос только те задачи, которые полностью входят в интервал. Чтобы данные можно было отправить с сервера на клиент, разместим их в массив структур.
Теперь выведем полученные значения в диаграмму на форме, заполним в ней Точку, Серию, Значение и Интервал последовательно для каждой строки данных.
Здесь стоит обратить внимание, что конец интервала отображается как начало переданной даты. Поэтому, чтобы зарезервировать последний день, нужно добавить 24 часа.
На этом всё. У нас есть минимальный пример для вывода диаграммы Ганта на форму в среде 1С:Предприятие.
Полный код для вывода диаграммы:
&НаСервереБезКонтекста
Функция ПолучитьДанныеДиаграммы(НачалоПолногоИнтервалаВход, КонецПолногоИнтервалаВход)
РезультатФункции = Новый Массив;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПериодыВыполненияЗадач.Задача КАК Задача,
| ПериодыВыполненияЗадач.ДатаНачала КАК ДатаНачала,
| ПериодыВыполненияЗадач.ДатаОкончания КАК ДатаОкончания,
| ПериодыВыполненияЗадач.Исполнитель КАК Исполнитель,
| ПериодыВыполненияЗадач.Задача.КраткоеОписание КАК КраткоеОписание
|ИЗ
| РегистрСведений.ПериодыВыполненияЗадач КАК ПериодыВыполненияЗадач
|ГДЕ
| ПериодыВыполненияЗадач.ДатаНачала >= НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ)
| И ПериодыВыполненияЗадач.ДатаОкончания <= КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ)
|
|УПОРЯДОЧИТЬ ПО
| ДатаНачала";
Запрос.УстановитьПараметр("ДатаНачала", НачалоПолногоИнтервалаВход);
Запрос.УстановитьПараметр("ДатаОкончания", КонецПолногоИнтервалаВход);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
СтруктураРезультат = Новый Структура;
СтруктураРезультат.Вставить("Задача", ВыборкаДетальныеЗаписи.Задача);
СтруктураРезультат.Вставить("ДатаНачала", ВыборкаДетальныеЗаписи.ДатаНачала);
СтруктураРезультат.Вставить("ДатаОкончания", ВыборкаДетальныеЗаписи.ДатаОкончания);
СтруктураРезультат.Вставить("Исполнитель", ВыборкаДетальныеЗаписи.Исполнитель);
СтруктураРезультат.Вставить("КраткоеОписание", ВыборкаДетальныеЗаписи.КраткоеОписание);
РезультатФункции.Добавить(СтруктураРезультат);
КонецЦикла;
Возврат РезультатФункции;
КонецФункции // ПолучитьДанныеДиаграммы()
&НаКлиенте
Процедура Сформировать(Команда)
ДанныеДиаграммы = ПолучитьДанныеДиаграммы(ПериодОтчета.ДатаНачала, ПериодОтчета.ДатаОкончания);
Диаграмма.Обновление = Ложь;
Диаграмма.Очистить();
Для Каждого ТекДанныеДиаграммы Из ДанныеДиаграммы Цикл
ТекЗадача = ТекДанныеДиаграммы.Задача;
ТекКраткоеОписание = ТекДанныеДиаграммы.КраткоеОписание;
ТекИсполнитель = ТекДанныеДиаграммы.Исполнитель;
ТекДатаНачала = ТекДанныеДиаграммы.ДатаНачала;
ТекДатаОкончания = ТекДанныеДиаграммы.ДатаОкончания;
// Точка.
Точка = Диаграмма.УстановитьТочку(ТекЗадача);
ТекстТочки = Строка(ТекЗаДача) + " (" + Строка(ТекКраткоеОписание) + ")";
Точка.Текст = ТекстТочки;
// Серия.
Серия = Диаграмма.УстановитьСерию(ТекИсполнитель);
Серия.Текст = Строка(ТекИсполнитель);
// Значение.
Значение = Диаграмма.ПолучитьЗначение(Точка, Серия);
// Интервал.
Интервал = Значение.Добавить();
Интервал.Начало = ТекДанныеДиаграммы.ДатаНачала;
Интервал.Конец = ТекДатаОкончания + 24*60*60; // Добавим сутки, чтобы интервал отображался до конца дня окончания.
КонецЦикла;
КонецПроцедуры












Добавить комментарий