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

24.02.21

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

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

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

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

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

5000 руб.

14.01.2016    55301    17    23    

43

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

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

6000 руб.

16.01.2015    63692    44    59    

82

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

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

2400 руб.

29.06.2020    19546    27    6    

42

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

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

1500 руб.

06.10.2020    10762    7    7    

11

Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

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

20.08.2024    20800    mrXoxot    44    

128

Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.

27.05.2024    10282    smielka    37    

105

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

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

27.12.2023    17735    1223    elcoan    53    

125
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Scratch_sv 03.03.21 10:42 Сейчас в теме
Вопрос уже давно гуляет по форумам, никто ничего не отвечает:
Каким образом (какой внешней компонентой) можно реализовать перетаскивание диапазонов по вертикали (между точками). В Вашем случае, между этапами.
2. Константин С. 674 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 80 06.09.23 10:05 Сейчас в теме
(5) У меня такая же проблема. Удалось найти как изменить ширину?
7. frkbvfnjh 808 05.10.23 08:59 Сейчас в теме
(6) Насколько знаю, это интерактивно в конфигураторе регулируется, нужно мышкой попасть в нужную внутреннюю область, по крайней мере так было в обычном приложении. Наверняка можно и программно добраться до этих настроек, меня обычно устраивала разовая настройка через конфигуратор.
8. frkbvfnjh 808 05.10.23 11:41 Сейчас в теме
Хорошая статья, довольно развернутый пример. Получил ответ на все основные вопросы по формированию диаграммы Ганта. Я бы еще отдельно описал про создание иерархии, а то в примере родитель создается в отдельной процедуре и явно связи сначала не понимаешь, ну и про масштабируемость шкалы времени.
9. user991879 24.08.24 14:05 Сейчас в теме
Потому, что диаграмма Ганта 5-мерный объект, и не всем под силу это принять и понять.Потому все боятся его применять. Но это очень мощный визуальный объект. Начните с простых примеров, а потом постепенно расширяйтесь до 5Д.
Оставьте свое сообщение