Программное создание элементов графической схемы (через XSLT)

Программирование - Практика программирования

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

Естественно начал с анализа уже готовых решений, наткнулся на это и это, первый по сути работает с исходным форматом *.grs, разбирая и собирая его, второй пример использует XDTO. Первая у меня вообще отказалась работать мой коммент, вторая обработка мне показалась слишком усложнённой, черт ногу сломит. Стал писать свое и вышло очень даже компактно и красиво.

Если не вдаваться в нюансы, работает это так, кодом формируется некая структура, сериализуется в XDTO, сериализованная структура "скармливается" шаблону преобразования XSLT, на выходе получаем XDTO графической схемы, десериализуем и готово. Многие спросят, "почему XSLT?", это наглядно, можно по быстрому поправить, расширить, не лазя по 1000 строк чужого кода.

Вот пример кода, который выводит демо блок-схему

&НаСервере
Функция ПостроитьНаСервере()
	Обработка = РеквизитФормыВЗначение("Объект");
	СтруктураСхемы = Обработка.ИнициализироватьСтруктуру();
	
	Действие1 = Обработка.ДобавитьДействие(СтруктураСхемы,, "Выполняем что-то", "Действие 1", Новый Структура("Верх,Лево", 150, 500));
	Действие2 = Обработка.ДобавитьДействие(СтруктураСхемы,, "Действие 2",, Новый Структура("Верх,Лево", 350, 500),, Истина);
	ВложенныйПроцесс1 = Обработка.ДобавитьВложенныйПроцесс(СтруктураСхемы,, "Вложенный процесс", Новый Структура("Верх,Лево", Действие2.Координаты.Верх, Действие2.Координаты.Лево + Действие2.Размер.Ширина + 20));
	Действие3 = Обработка.ДобавитьДействие(СтруктураСхемы,, "Действие 3",,,, Истина);
	Условие1 = Обработка.ДобавитьУсловие(СтруктураСхемы, "Условие 1",,, Истина);
	Действие4 = Обработка.ДобавитьДействие(СтруктураСхемы,, "Действие 4");
	
	Обработка.СвязатьЭлементы(СтруктураСхемы, Условие1, Действие4, 3, 2, "Да");
	Обработка.СвязатьЭлементы(СтруктураСхемы, Действие2, ВложенныйПроцесс1, 3, 1);
	Обработка.СвязатьЭлементы(СтруктураСхемы, ВложенныйПроцесс1, Действие3, 4, 2);
	
	Возврат Обработка.ПостроитьСхему(СтруктураСхемы);
КонецФункции

Получается:

Хочу обратить внимание как осуществляется связка элементов. Элементы связываются методом

Обработка.СвязатьЭлементы(СтруктураСхемы, Действие2, ВложенныйПроцесс1, 3, 1);

Параметры 3 и 1, это есть номера т.н. портов элемента

Нумерация портов начинается с левой стороны по часовой стрелке.

Вот еще пример, что бы вывести такую примитивную схему:

Достаточно такого кода:

&НаСервере
Функция ПостроитьНаСервереПример2()
	Обработка = РеквизитФормыВЗначение("Объект");
	СтруктураСхемы = Обработка.ИнициализироватьСтруктуру();
	
	Обработка.ДобавитьДействие(СтруктураСхемы,, "Шаг 1", "Действие 1",,, Истина);
	Обработка.ДобавитьДействие(СтруктураСхемы,, "Шаг 2", "Действие 2",,, Истина);
	Обработка.ДобавитьДействие(СтруктураСхемы,, "Шаг 3", "Действие 3",,, Истина);
	Обработка.ДобавитьДействие(СтруктураСхемы,, "Шаг 4", "Действие 4",,, Истина);
	Обработка.ДобавитьДействие(СтруктураСхемы,, "Шаг 5", "Действие 5",,, Истина);
	
	Возврат Обработка.ПостроитьСхему(СтруктураСхемы);
КонецФункции

Автоматическая связь элементов осуществляется благодаря последнему параметру. Если не задан размер элемента, в таком случаи устанавливается размер по умолчанию 100х50. Если не заданы координаты, тогда первый элемент начинается с точки 10х10 от левого верхнего угла, последующие элементы автоматически располагаются под предыдущем на расстоянии 20px.

В данный момент поддерживается создание следующих элементов графической схемы:

  • Действие
  • Условие
  • Вложенный процесс

Для конкретно моей задачи этого было достаточно, но на самом деле добавление новых элементов много труда не составит. Единственное могут возникнуть не большие трудности если захотите добавить поддержку не прямоугольных элементов, т.к. отрисовывать форму придется самим по точкам (пример можно посмотреть как сделан элемент условия). Если забить и не отрисовывать по точкам, то получится так:

т.е. при первой отрисовки элемент будет прямоугольный, а при изменении чего-то на схеме, элемент перересуется, перересовывает его сама платформа. На самом деле, если бы можно было как-то вызвать эту перересовку программно, это сильно облегчила б жизнь и кода стало бы еще меньше )

Доработал обработку, теперь есть поддержка элемента ВыборВарианта.

Единственное, так и не удалось побороть, то как отрисовываются линии

После перетаскивания элементов, платформа отрисовавает их нормально

Так же хочу обратить внимание, что порты для вариантов начинаются с 6 (уж не знаю почему), учитывайте при связке элементов

Скачать файлы

Наименование Файл Версия Размер
Программное создание элементов графической схемы (через XSLT):
.epf 12,30Kb
20.07.17
15
.epf 1.0 12,30Kb 15 Скачать
Программное создание элементов графической схемы (через XSLT): Поддержка ВыборВарианта
.epf 14,96Kb
01.08.17
3
.epf 1.1 14,96Kb 3 Скачать

См. также

Комментарии
1. Sergey Andreev (starik-2005) 1191 22.07.17 11:16 Сейчас в теме
Хорошая статья, только слова "перересовку", "перересуется" и прочее режут глаз ))) ИТ-шники вообще с языком не дружат. У Гилева есть классная статья об образовании, но там столько ошибок, что я не смог ее до конца дочитать )))
Артано; +1 Ответить
2. Александр Быков (Alxby) 229 24.07.17 09:05 Сейчас в теме
3. Сергей Вититнев (SVititnev) 14 24.07.17 12:28 Сейчас в теме
Имхо, через XDTO делать удобнее всего (то бишь как в (2))
4. Артем Лазаренко (lazarenko) 54 24.07.17 13:37 Сейчас в теме
(3) так мой пример это тоже XDTO, отличия только в том как формировать XDTO, в примере (2) кодом 1С, в моем через XSLT
5. Виктор Петрянкин (ВикторП) 47 24.07.17 16:41 Сейчас в теме
Процесс свой как Вы в итоге визуализируете?

Программно рисуете графическую схему? Чем это лучше визуального ручного составления схемы?

Программную схему еще как то используете?
6. Артем Лазаренко (lazarenko) 54 24.07.17 17:22 Сейчас в теме
(5) просто процесс который визуализируется может меняться в режиме предприятия. Могу аналогию привести с workflow документа, какие статусы и переходы у конкретного документа можно настроить динамически, не будешь же ты перерисовывать каждый раз руками схему.
7. Сергей Болбачан (sergbsv) 60 26.07.17 02:09 Сейчас в теме
Сделай пожалуйста еще выбор вариантов, и уже получится класно
9. Артем Лазаренко (lazarenko) 54 26.07.17 12:11 Сейчас в теме
(7) о выборе каких вариантов речь?
8. Дмитрий Сорока (soroka) 26.07.17 10:19 Сейчас в теме
Кто нибудь проверял работу данных компонент в веб клиенте? В свое время писал подобное, но при работе через веб клиент очень странно ведут себя соединительные линии в случае если схема выглядет как несколько рядов действий уходящих по горизонтали на 4 блока. В этом случае соединительные линии обязательно проходят через координату х=1 и у=1. В обычном режим (тонкий клиент) работает нормально.
10. Артем Лазаренко (lazarenko) 54 26.07.17 15:33 Сейчас в теме
(8) сейчас попробовал, да, коряво все ((
13. Дмитрий Сорока (soroka) 27.07.17 14:53 Сейчас в теме
(10) значит это не мой косяк был, а косяк 1с)))
11. Сергей Болбачан (sergbsv) 60 27.07.17 14:33 Сейчас в теме
Точка выбора варианта.
в иконках редактора стоит после условия
12. Артем Лазаренко (lazarenko) 54 27.07.17 14:44 Сейчас в теме
(11) ааа, понял, речь о поддержке нового элемента. Сделаю в ближайшее время
Оставьте свое сообщение