Полоски в 1С (простой пример вывода диаграммы Ганта)

Диаграмма Ганта — эффективный способ управления проектами, разработанный экономистом Генри Гантом в 1910 году. Она позволяет отображать несколько временных интервалов в едином потоке, выявляя пересечения, окна простоя. Что, в свою очередь, позволяет гибко управлять сроками проекта.

Платформа 1С:Предприятие имеет штатные средства отображения диаграммы Ганта. Рассмотрим самый простой пример добавления такой диаграммы. Предположим, у нас есть некий проект, разбитый по задачам, и несколько исполнителей, которые могут выполнять задачи. Данные по задачам располагаются в регистре сведений с указанием Даты начала (Дата), Даты окончания (Дата), Задачи (справочник Задачи) и её Исполнителя (справочник Контрагенты). Мы хотим видеть периоды исполнения по задачам в виде диаграммы Ганта.

Гант исходные данныеДля начала расположим необходимые реквизиты и элементы на форме. Нам понадобятся:

  • Собственно, сама Диаграмма Ганта. Добавляем реквизит и соответствующий элемент на форму;
  • Способ ограничить её период — например, реквизит с типом Стандартный период. Назовём его ПериодОтчета и разместим на форме;
  • Команда Сформировать для формирования диаграммы;

Гант элементы формы

Остановимся немного, чтобы разобраться с терминологией. В диаграмму Ганта входят следующие части:

  • Точка — расположенные на вертикальной оси группировки данных;
  • Серия — дополнительная аналитика каждой из точек. Так же располагаются на вертикальной оси, имеют подписанную легенду;
  • Значение — состоит из точки и серии. Представлено отдельной полосой на диаграмме;
  • Интервал — принадлежит значению и определяет начало и конец полоски Значения. Располагается на горизонтальной оси;

 

Гант части

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

Гант данные БД

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

Гант код размещение

Здесь стоит обратить внимание, что конец интервала отображается как начало переданной даты. Поэтому, чтобы зарезервировать последний день, нужно добавить 24 часа.

На этом всё. У нас есть минимальный пример для вывода диаграммы Ганта на форму в среде 1С:Предприятие.

Полный код для вывода диаграммы:

 

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

&НаКлиенте
Процедура Сформировать(Команда)
	ДанныеДиаграммы = ПолучитьДанныеДиаграммы(ПериодОтчета.ДатаНачала, ПериодОтчета.ДатаОкончания);
	Диаграмма.Обновление = Ложь;
	Диаграмма.Очистить();
	Для Каждого ТекДанныеДиаграммы Из ДанныеДиаграммы Цикл
		ТекЗадача			 = ТекДанныеДиаграммы.Задача;
		ТекКраткоеОписание	 = ТекДанныеДиаграммы.КраткоеОписание;
		ТекИсполнитель		 = ТекДанныеДиаграммы.Исполнитель;
		ТекДатаНачала		 = ТекДанныеДиаграммы.ДатаНачала;
		ТекДатаОкончания 	 = ТекДанныеДиаграммы.ДатаОкончания;
		// Точка.
		Точка = Диаграмма.УстановитьТочку(ТекЗадача);
		ТекстТочки = Строка(ТекЗаДача) + " (" + Строка(ТекКраткоеОписание) + ")";
		Точка.Текст = ТекстТочки;
		// Серия.
		Серия = Диаграмма.УстановитьСерию(ТекИсполнитель);
		Серия.Текст = Строка(ТекИсполнитель);
		// Значение.
		Значение = Диаграмма.ПолучитьЗначение(Точка, Серия);
		// Интервал.
		Интервал = Значение.Добавить();
		Интервал.Начало	 = ТекДанныеДиаграммы.ДатаНачала;
		Интервал.Конец	 = ТекДатаОкончания + 24*60*60;			// Добавим сутки, чтобы интервал отображался до конца дня окончания.
	КонецЦикла;
КонецПроцедуры

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *