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

24.02.21

Разработка - Работа с интерфейсом

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

Скачать исходный код

Наименование Файл Версия Размер
Пример работы с Диаграммой Ганта в 1С:
.epf 12,16Kb
957
.epf 12,16Kb 957 Скачать бесплатно

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

В пример я попытался рассказать возможности и методы построения диаграммы Ганта в 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");	
КонецПроцедуры

 

Диаграмма Ганта

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработка предназначена для редактирования картинок в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Также обработка может быть использована из встроенного языка как объект для редактирования картинок. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Данная обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    61973    43    59    

81

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    54600    16    21    

42

Управление дашбордами

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

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

2400 руб.

29.06.2020    16849    21    4    

35

Новогоднее оформление для 1С

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    11037    757    elcoan    45    

106

Конструктор HTML, CSS и javascript

Инструментарий разработчика Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.

2 стартмани

10.04.2023    9809    153    acces969    31    

119

Модель состояния для MVC

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    3867    kalyaka    4    

29

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12228    1    5    

10

Условное оформление элементов форм в пользовательском режиме 1С (управление видимостью и доступностью элементов форм)

Работа с интерфейсом Платформа 1С v8.3 Платные (руб)

Подсистема условного оформления элементов форм (далее подсистема) предназначена для настройки оформления элементов форм (видимость, доступность, цвет фона, цвет текста и прочее) в пользовательском режиме 1С. Также подсистему возможно использовать для ограничения доступа к реквизитам формы для определенных пользователей (или групп пользователей).

6000 руб.

18.01.2022    8901    1    2    

6
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Scratch_sv 03.03.21 10:42 Сейчас в теме
Вопрос уже давно гуляет по форумам, никто ничего не отвечает:
Каким образом (какой внешней компонентой) можно реализовать перетаскивание диапазонов по вертикали (между точками). В Вашем случае, между этапами.
+
2. Константин С. 667 07.03.21 15:52 Сейчас в теме
(1)
ожно реализовать перетаскивание диапазонов по вертикали

https://infostart.ru/1c/articles/894080/
https://infostart.ru/1c/articles/991938/
+
3. bekar@rambler.ru 04.05.22 11:42 Сейчас в теме
В 8.3.21 появилась возможность добавлять свои реквизиты Новые возможности.
Вопрос как заполнить данными эти добавленные реквизиты ...
+
4. AleksLukin 4 10.07.22 12:24 Сейчас в теме
(3)

Вот пример заполнения данными:

		Значение = Диаграмма.ПолучитьЗначение(ТочкаВторогоУровня, СерияПлан);
		Значение.Текст = ЭлементДанных.ДлительностьПредставление;
		Значение.Редактирование = Истина;
		Значение.Расшифровка = ЭлементДанных.ЗаказНаПроизводство;
		
		Значение.Данные.ЗаказПокупателяНомер = ЭлементДанных.ЗаказПокупателяНомер;
		Значение.Данные.СтатусЗаказаПокупателия = ЭлементДанных.СтатусЗаказаПокупателия;
		Значение.Данные.ЗаказПокупателяДата = ЭлементДанных.ЗаказПокупателяДата;
		Значение.Данные.ЗаказПокупателяДатаОтгрузки = ЭлементДанных.ЗаказПокупателяДатаОтгрузки;
		Значение.Данные.Уровень = 2;
Показать
devtelscargo; +1
5. toofatalex 2 22.05.23 15:30 Сейчас в теме
Подскажите, в Диаграмме Ганта на шкале времени оставил только "Год" и "Месяц", "Дни" убрал. Проблема в том, что ширина колонок не меняется. Как можно уменьшить ширину "Месяцев"?
Прикрепленные файлы:
+
6. azazana 71 06.09.23 10:05 Сейчас в теме
(5) У меня такая же проблема. Удалось найти как изменить ширину?
+
7. frkbvfnjh 787 05.10.23 08:59 Сейчас в теме
(6) Насколько знаю, это интерактивно в конфигураторе регулируется, нужно мышкой попасть в нужную внутреннюю область, по крайней мере так было в обычном приложении. Наверняка можно и программно добраться до этих настроек, меня обычно устраивала разовая настройка через конфигуратор.
+
8. frkbvfnjh 787 05.10.23 11:41 Сейчас в теме
Хорошая статья, довольно развернутый пример. Получил ответ на все основные вопросы по формированию диаграммы Ганта. Я бы еще отдельно описал про создание иерархии, а то в примере родитель создается в отдельной процедуре и явно связи сначала не понимаешь, ну и про масштабируемость шкалы времени.
+
Оставьте свое сообщение