Каталог решений - Пример работы с диаграммой Ганта в 1С

Пример работы с диаграммой Ганта в 1С

Пример работы с диаграммой Ганта в 1С

В наличии

Пример работы с очень нужным и важным, по моему мнению, объектом в 1С «Диаграммой Ганта».

Категория:

Описание

Статей по работе с этим объектом маловато, непонятно почему. Немного подправим ситуацию.

В пример я попытался рассказать возможности и методы построения диаграммы Ганта в 1С, создание, сохранение изображения, "экспорт импорт в XML", различные украшательства. Делается все это добро следующим образом:

Сначала создаются серии,  метод «Добавить()» свойства «Серии» у объекта «ДиаграммаГанта».

	СерияПлан = Диаграмма.Серии.Добавить();
	СерияПлан.Текст = "План";
	СерияПлан.Цвет = WebЦвета.СинеФиолетовый;
	
	СерияФакт = Диаграмма.Серии.Добавить();
	СерияФакт.Текст = "Факт";
	СерияФакт.Цвет = WebЦвета.КрасноФиолетовый;

Их может быть несколько или одна.  Далее начинам строить диаграмму — добавляется точка методом «УстановитьТочку()» объекта «ДиаграммаГанта».

		Точка = Диаграмма.УстановитьТочку(СтрокаТЧЗадачи.Этап, "Демо"); // Родитель = "Демо"
		Точка.Текст = СтрокаТЧЗадачи.Этап;
		Точка.Картинка = БиблиотекаКартинок.Реквизит;

 Точка это некий список задач, например – «Разработка».

С помощью метода «ПолучитьЗначение(Точка, Серия)» объекта «ДиаграммаГанта» получаем значение, это, если так можно выразиться, некоторое значение на пересечении серии и точки (Задачи).

		Значение = Диаграмма.ПолучитьЗначение(Точка, СерияПлан);
		Значение.Редактирование = Истина;

Значение представляет собой коллекцию интервалов. Добавляем интервал «Добавить()».

		Интервал = Значение.Добавить();
		Интервал.Начало = СтрокаТЧЗадачи.ДатаНачалаПлан;
		Интервал.Конец = СтрокаТЧЗадачи.ДатаОкончанияПлан;
		Интервал.Текст = "Интервал план";

У него есть  свойства «Начало» и «Конец», тип «Дата», а так же метод «Добавить(<Конец>)» с параметром ИнтервалДиаграммыГанта, который создаст связь и вернет значение с типом «СвязьДиаграммыГанта».

		Если СтрокаТЧЗадачи.Предшественник <> 0 Тогда 
			Отбор = Новый Структура("ПредшественникНомер", СтрокаТЧЗадачи.НомерСтроки);
			НайденныеСтроки = Связи.НайтиСтроки(Отбор);
			
			Для Каждого НайденненнаяСвязь Из НайденныеСтроки Цикл 
				НайденненнаяСвязь.Интервал.Добавить(Интервал);	
			КонецЦикла;
			
		КонецЕсли;

Для построения связей используется Таблица значений. Сейчас попытаюсь объяснить, почему так. Когда создается связь от А до В, нужно уже иметь два созданных интервала, как некие объекты с типом «ИнтервалДиаграммыГанта» на диаграмме Ганта, поэтому строить связь можно только в момент появления интервала В, а для этого нужно куда то временно сохранить значение с типом «ИнтервалДиаграммыГанта», ссылку на интервал А. Поэтому и используется таблица значений, она хранит связи, что бы их построить, когда появятся все нужные объекты  в диаграмме.

В публикацию добавлена обработка, демонстрирующая пример работы. Работает в любой конфигурации даже пустой на платформе 8.3. Тестировалась на версии 8.3.16.1359 и 8.3.18.1334

Добавляйте в комментарий, если я, что то упустил.

Всем добра.

&НаСервере
Процедура ПостроитьДиаграммуГанта() 
	
	// ТЗ для связей
	Связи = Новый ТаблицаЗначений;
	Связи.Колонки.Добавить("ПредшественникНомер");
	Связи.Колонки.Добавить("Интервал");	
	
	Диаграмма.Очистить();
	
	// Будет 2 серии - план, факт
	СерияПлан = Диаграмма.Серии.Добавить();
	СерияПлан.Текст = "План";
	СерияПлан.Цвет = WebЦвета.СинеФиолетовый;
	
	СерияФакт = Диаграмма.Серии.Добавить();
	СерияФакт.Текст = "Факт";
	СерияФакт.Цвет = WebЦвета.КрасноФиолетовый;
	
	
	// Пример иерархии, создаем верхний уровень "Демо"
	ДобавитьДемоИнтервалы(СерияПлан);
	

	Для Каждого СтрокаТЧЗадачи Из ТЗЗадачи Цикл 
		
		Точка = Диаграмма.УстановитьТочку(СтрокаТЧЗадачи.Этап, "Демо"); // Родитель = "Демо"
		Точка.Текст = СтрокаТЧЗадачи.Этап;
		Точка.Картинка = БиблиотекаКартинок.Реквизит;
		
		
		// *****************************
		// Добавляем интервал серии план				
		
		Значение = Диаграмма.ПолучитьЗначение(Точка, СерияПлан);
		Значение.Редактирование = Истина;
		
		Интервал = Значение.Добавить();
		Интервал.Начало = СтрокаТЧЗадачи.ДатаНачалаПлан;
		Интервал.Конец = СтрокаТЧЗадачи.ДатаОкончанияПлан;
		Интервал.Текст = "Интервал план";
		
		УстановитьТекстЗначения(Значение.Текст, СтрокаТЧЗадачи.ДатаНачалаПлан, СтрокаТЧЗадачи.ДатаОкончанияПлан);   

		// Строить связи будем только по серии план
		
		// Создаем заранее сохраненную связь в ТЗ связи (ищем интервал предшесвенник в ТЗ)
		Если СтрокаТЧЗадачи.Предшественник <> 0 Тогда 
			Отбор = Новый Структура("ПредшественникНомер", СтрокаТЧЗадачи.НомерСтроки);
			НайденныеСтроки = Связи.НайтиСтроки(Отбор);
			
			Для Каждого НайденненнаяСвязь Из НайденныеСтроки Цикл 
				НайденненнаяСвязь.Интервал.Добавить(Интервал);	
			КонецЦикла;
			
		КонецЕсли;

		// Если текущий интервал является предшественником для добавленных в будущем в цикле интервалов
		// тогда сохраняем связь в ТЗ связи
		Отбор = Новый Структура("Предшественник", СтрокаТЧЗадачи.НомерСтроки);
		НайденныеСтроки = ТЗЗадачи.НайтиСтроки(Отбор);
		
		Если НайденныеСтроки <> 0 Тогда 
			Для Каждого НайденненнаяСвязь Из НайденныеСтроки Цикл 
				НоваяСвязь = Связи.Добавить();
				НоваяСвязь.ПредшественникНомер = НайденненнаяСвязь.НомерСтроки;
				НоваяСвязь.Интервал = Интервал;
			КонецЦикла;
		КонецЕсли;
		
		
		// *****************************
		// Добавляем интервал серии факт
				
		Значение = Диаграмма.ПолучитьЗначение(Точка, СерияФакт);	
		Интервал = Значение.Добавить();
		Интервал.Начало = СтрокаТЧЗадачи.ДатаНачалаФакт;
		Интервал.Конец = СтрокаТЧЗадачи.ДатаОкончанияФакт;
		Интервал.Текст = "Интервал факт";
		
	КонецЦикла;
	

	// Метки времени. Добавляем метку времени их можно добавлять несколько на разные шкалы времени
	
	Шкала = Диаграмма.ОбластьПостроения.ШкалаВремени.Элементы[1];
	
	МеткаВремени = Шкала.Метки.Добавить(НачалоДня(ТекущаяДата()));
	МеткаВремени.Текст = "Текущая дата " + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
	МеткаВремени.ЦветТекста = WebЦвета.Красный;				
	МеткаВремени.ЦветЛинии = WebЦвета.Красный;
	
	
	// Фон, выделяем выходные	
	ТекущийПериод = НачалоМесяца(Диаграмма.НачалоПолногоИнтервала - 1);
	КонечныйПериода = Диаграмма.КонецПолногоИнтервала;
	
	Пока ТекущийПериод < КонечныйПериода Цикл 
		Если КонецНедели(ТекущийПериод) = КонецДня(ТекущийПериод) Тогда 
			ИнтервалФона = Диаграмма.ИнтервалыФона.Добавить(НачалоДня(ТекущийПериод - 86400), КонецДня(ТекущийПериод));
			ИнтервалФона.Цвет = WebЦвета.БледноЛиловый;
		КонецЕсли;
		
		ТекущийПериод = КонецДня(ТекущийПериод) + 1;	
	КонецЦикла;
	
	
	
	
	// Получаем верхнюю точку "Демо" и разворачиваем иерархию
	Точка = Диаграмма.УстановитьТочку("Демо");
	Диаграмма.РазвернутьТочку(Точка, Истина);
КонецПроцедуры

&НаСервере
Процедура ДобавитьДемоИнтервалы(Серия)
		
	Точка = Диаграмма.Точки.Добавить();
	Точка.Текст = "Демо";
	Точка.Значение = "Демо";
	Точка.Картинка = БиблиотекаКартинок.СводнаяДиаграмма;
	
	
	Значение = Диаграмма.ПолучитьЗначение(Точка, Серия);
		
	ТекущийПериод = НачалоГода(ТекущаяДата());
	
	Для Итерация = 1 По 25 Цикл 
		
		ЦветИнтервала = Новый Цвет(Итерация * 10, Итерация * 10, Итерация * 10);
		
		Интервал = Значение.Добавить();
		Интервал.Цвет = ЦветИнтервала;
		Интервал.Начало = НачалоДня(ТекущийПериод);
		Интервал.Конец = КонецДня(ТекущийПериод);
			
		
		ТекущийПериод = КонецДня(ТекущийПериод) + 1;
	КонецЦикла;
	
	
	Палира = Новый Массив;
	Палира.Добавить(WebЦвета.Красный);
	Палира.Добавить(WebЦвета.Оранжевый);
	Палира.Добавить(WebЦвета.Желтый);
	Палира.Добавить(WebЦвета.Зеленый);
	Палира.Добавить(WebЦвета.Голубой);
	Палира.Добавить(WebЦвета.Синий);
	Палира.Добавить(WebЦвета.Фиолетовый);
	
	
	Для Итерация = 0 По 6 Цикл 
		
		Интервал = Значение.Добавить();
		Интервал.Цвет = Палира[Итерация];
		Интервал.Начало = НачалоДня(ТекущийПериод);
		Интервал.Конец = КонецДня(ТекущийПериод);
				
		
		ТекущийПериод = КонецДня(ТекущийПериод) + 1;
	КонецЦикла;
		
			
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьТекстЗначения(Текст, ДатаНачала, ДатаОкончания)
	Текст = Формат(ДатаНачала, "ДЛФ=DDT") + " - " + Формат(ДатаОкончания, "ДЛФ=DDT");	
КонецПроцедуры

 

has been added to your cart:
Оформление заказа