Программная работа с графическими схемами. Готовое решение

0. Yashazz 3417 17.02.18 13:50 Сейчас в теме
Работоспособное, проверенное на практике, простое и удобное программное управление графическими схемами.

Перейти к публикации

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. genayo 18.02.18 17:48 Сейчас в теме
А можно рассказать о практическом применении, если не трудно?
2. triviumfan 22 18.02.18 18:36 Сейчас в теме
(1)
Концепцию взял у //infostart.ru/public/551576/ и допилил под свой извращённый вкус.

Вроде все понятно, любит извращения. А для рисования есть другое ПО :)
3. Yashazz 3417 18.02.18 20:17 Сейчас в теме
(1) Ну, одно из интересных применений, авось, в ближайшие недели 2-3 выложу как отдельную публикацию, а вообще, например, визуализация сценариев работы сотрудников колл-центра. Последовательности вопросов при общении с клиентами. А вот что стало самым главным заказом, я рассказать не смогу, т.к. заказчиком выступает ФНС и всё секретно)

(2) Для рисования таких схем есть Visio, но плюсы схем в 1С, думаю, очевидны. Какое ещё ПО вы знаете? Можете ли предложить готовое решение работы с ним?
4. pm74 179 18.02.18 20:45 Сейчас в теме
(0) тема интересная плюсанул , поразбираюсь на досуге
с визуализацией в 1с плохо - это факт
поэтому на ИС традиционно высок интерес к разным штуковинам на javascript или наподобие этой
мои 5 коп. на тему применимости см. рис. (до правильной программной компоновки тоже руки пока не дошли)
Прикрепленные файлы:
5. Yashazz 3417 19.02.18 11:18 Сейчас в теме
(4) А вот этот замечательный скриншот - он руками был сделан? Можно подробнее в личку?
6. pm74 179 19.02.18 11:48 Сейчас в теме
(5)
он руками был сделан

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

&НаСервере
Функция НоваяТочкаXDTO(x,y) 	Точка=СериализаторXDTO.Фабрика.Создать(СериализаторXDTO.Фабрика.Тип("http://v8.1c.ru/8.2/data/graphscheme","Point"));
	Точка.x=x;
	Точка.y=y;	
	Возврат Точка;
КонецФункции
&НаСервере
Функция НовыйОбъектXDTO(Тип,ИмяЭлемента,Верх,Лево,Высота,Ширина,Содержание,Фигура,Цвет=Неопределено,Шрифт=Неопределено,LastID=0)Экспорт
	НО=СериализаторXDTO.Фабрика.Создать(СериализаторXDTO.Фабрика.Тип("http://v8.1c.ru/8.2/data/graphscheme","GraphSchemeItem"));
	НО.itemType=Тип;
	НО.itemCode=ИмяЭлемента;
	НО.itemId=LastID;
	НО.zOrder=LastID;
	LastID=LastID+1;
	НО.itemTabOrder=1;
	НО.rectLeft=Лево;
	НО.rectRight=Лево+Ширина;
	НО.rectTop=Верх;
	НО.rectBottom=Верх+Высота;
	НО.Border=СериализаторXDTO.ЗаписатьXDTO(Новый Линия(ТипСоединительнойЛинии.Сплошная,1));
	НО.Point.Добавить(НоваяТочкаXDTO(НО.rectLeft,НО.rectTop));
	НО.Point.Добавить(НоваяТочкаXDTO(НО.rectRight-1,НО.rectTop));
	НО.Point.Добавить(НоваяТочкаXDTO(НО.rectRight-1,НО.rectBottom-1));
	НО.Point.Добавить(НоваяТочкаXDTO(НО.rectLeft,НО.rectBottom-1));
	Заголовки=СериализаторXDTO.Фабрика.Создать(СериализаторXDTO.Фабрика.Тип("http://v8.1c.ru/8.1/data/core","LocalStringType"));
	ЗаголовокЭлемента=СериализаторXDTO.Фабрика.Создать(СериализаторXDTO.Фабрика.Тип("http://v8.1c.ru/8.1/data/core","LocalStringItemType"));
	ЗаголовокЭлемента.lang="#";
	ЗаголовокЭлемента.content=Содержание;
	Заголовки.Item.Добавить(ЗаголовокЭлемента);
	НО.itemTitle=Заголовки;
	Примечания=СериализаторXDTO.Фабрика.Создать(СериализаторXDTO.Фабрика.Тип("http://v8.1c.ru/8.1/data/core","LocalStringType"));
	Примечание=СериализаторXDTO.Фабрика.Создать(СериализаторXDTO.Фабрика.Тип("http://v8.1c.ru/8.1/data/core","LocalStringItemType"));
	Примечание.lang="#";
	Примечание.content=Содержание;
	Примечания.Item.Добавить(Примечание);
	НО.tipText=Примечания;
	НО.currentLanguage="#";
	НО.shape=Фигура;
	Если Цвет=Неопределено Тогда
		НО.backColor=Новый Цвет;
	Иначе
		НО.backColor=Новый Цвет(Цвет[0],Цвет[1],Цвет[2]);
	КонецЕсли;
	
	Если Не Шрифт=Неопределено Тогда
		НО.textFont=СериализаторXDTO.ЗаписатьXDTO(Шрифт);
		
	КонецЕсли;	
	Возврат НО;
КонецФункции
&НаСервере
Функция НоваяЛинияXDTO(ГрафСхемаXDTO,ПервыйЭлемент,ВторойЭлемент,Содержание,Подсказка,ПортВыхода=Неопределено,ПортВхода=Неопределено,LastID=0,Цвет=Неопределено)Экспорт
	НО=СериализаторXDTO.Фабрика.Создать(СериализаторXDTO.Фабрика.Тип("http://v8.1c.ru/8.2/data/graphscheme","GraphSchemeItem"));
	НО.itemType=1;
	НО.itemId=LastID+100;
	//НО.zOrder=LastID+100;
	LastID=LastID+1;
	НО.itemTabOrder=2;
	НО.itemCode=Подсказка;
	Заголовки=СериализаторXDTO.Фабрика.Создать(СериализаторXDTO.Фабрика.Тип("http://v8.1c.ru/8.1/data/core","LocalStringType"));
	ЗаголовокЭлемента=СериализаторXDTO.Фабрика.Создать(СериализаторXDTO.Фабрика.Тип("http://v8.1c.ru/8.1/data/core","LocalStringItemType"));
	ЗаголовокЭлемента.lang="#";
	ЗаголовокЭлемента.content=Содержание;
	Заголовки.Item.Добавить(ЗаголовокЭлемента);
	НО.itemTitle=Заголовки;
	НО.currentLanguage="#";
	НО.textPos="Middle";
	НО.beginArrowStyle=СтильСтрелки.Нет;
	НО.endArrowStyle=СтильСтрелки.Незаполненная;
	НО.lineColor=Цвет;
	
	ДанныеПервый=ПортыЭлементаXDTO(ГрафСхемаXDTO,ПервыйЭлемент);
	ДанныеВторой=ПортыЭлементаXDTO(ГрафСхемаXDTO,ВторойЭлемент);
	
	НО.connectFromItemId=ДанныеПервый.itemId;
	НО.connectToItemId=ДанныеВторой.itemId;
	НО.connectFromPortIndex=0;
	
	Если ПортВыхода=Неопределено Или ПортВхода=Неопределено Тогда
		Если ДанныеПервый.itemId<ДанныеВторой.itemId Тогда
			ПортВыхода=2;ПортВхода=2;
		ИначеЕсли ДанныеПервый.itemId>ДанныеВторой.itemId Тогда 
			ПортВыхода=4; ПортВхода=4;
		Иначе 
			ПортВыхода=1; ПортВхода=2;
		КонецЕсли;
	КонецЕсли;	
	
	НО.portIndexFrom=ПортВыхода;
	НО.portIndexTo=ПортВхода;
	НО.backColor=новый Цвет;
	НО.decorativeLine=Истина;
	НО.textFont=СериализаторXDTO.ЗаписатьXDTO(новый Шрифт("Calibri",10,,Истина));
	НО.textColor=Цвет;
	НО.Border=СериализаторXDTO.ЗаписатьXDTO(новый Линия(ТипСоединительнойЛинии.Сплошная,1));
	НО.Point.Добавить(НоваяТочкаXDTO(ДанныеПервый["port"+ПортВыхода+"x"],ДанныеПервый["port"+ПортВыхода+"y"]));
	НО.Point.Добавить(НоваяТочкаXDTO(ДанныеВторой["port"+ПортВхода+"x"],ДанныеВторой["port"+ПортВхода+"y"]));	
	Возврат НО;
КонецФункции
&НаСервере
Функция ПортыЭлементаXDTO(ГрафСхемаXDTO,itemCode)Экспорт
	Данные=Новый Структура;
	Данные.Вставить("itemId",0);
	Данные.Вставить("port1x",0);
	Данные.Вставить("port1y",0);
	Данные.Вставить("port2x",0);
	Данные.Вставить("port2y",0);
	Данные.Вставить("port3x",0);
	Данные.Вставить("port3y",0);
	Данные.Вставить("port4x",0);
	Данные.Вставить("port4y",0);
	Для Каждого Элемент Из ГрафСхемаXDTO.item Цикл
		Если СокрЛП(НРег(Элемент.itemCode))=СокрЛП(НРег(itemCode)) Тогда
			Данные.Вставить("itemId",Элемент.itemId);
			Данные.Вставить("port1x",Элемент.rectLeft);
			Данные.Вставить("port1y",Элемент.rectTop+(Элемент.rectBottom-Элемент.rectTop)/2);
			Данные.Вставить("port2x",Элемент.rectLeft+(Элемент.rectRight-Элемент.rectLeft)/2);
			Данные.Вставить("port2y",Элемент.rectTop);
			Данные.Вставить("port3x",Элемент.rectRight);
			Данные.Вставить("port3y",Элемент.rectTop+(Элемент.rectBottom-Элемент.rectTop)/2);
			Данные.Вставить("port4x",Элемент.rectLeft+(Элемент.rectRight-Элемент.rectLeft)/2);
			Данные.Вставить("port4y",Элемент.rectBottom);
			Прервать;
		КонецЕсли;	  
	КонецЦикла;
	Возврат Данные;
КонецФункции
&НаСервере
Функция ИндексЭлементаXDTO(ГрафСхемаXDTO,itemCode)Экспорт
	Для Й=0 По ГрафСхемаXDTO.item.Количество()-1 Цикл
		Если СокрЛП(НРег(ГрафСхемаXDTO.item[Й].itemCode))=СокрЛП(НРег(itemCode)) Тогда
			Возврат Й;
		КонецЕсли;	  
	КонецЦикла;
	Возврат -1;
КонецФункции
&НаСервере
Функция НайтиЭлементXDTO(ГрафСхемаXDTO,itemCode)Экспорт
	Для Каждого Элемент Из ГрафСхемаXDTO.item Цикл
		Если СокрЛП(НРег(Элемент.itemCode))=СокрЛП(НРег(itemCode)) Тогда
			Возврат Элемент;
		КонецЕсли;	  
	КонецЦикла;
	Возврат Неопределено;
КонецФункции
&НаСервере
Процедура УдалитьЭлементXDTO(ГрафСхемаXDTO,itemCode)Экспорт
	ГрафСхемаXDTO.item.Удалить(ИндексЭлементаXDTO(ГрафСхемаXDTO,itemCode));
КонецПроцедуры
&НаСервере
Функция ПолучитьТекстЭлементаXDTO(ГрафСхемаXDTO,itemCode)Экспорт
	Элемент=НайтиЭлементXDTO(ГрафСхемаXDTO,itemCode);
	Возврат Элемент.itemTitle.item[0].content;
КонецФункции
&НаСервере
Процедура ИзменитьТекстЭлементаXDTO(ГрафСхемаXDTO,itemCode,НовыйТекст)Экспорт
	Элемент=НайтиЭлементXDTO(ГрафСхемаXDTO,itemCode);
	Элемент.itemTitle.item[0].content=НовыйТекст;
КонецПроцедуры


Показать


к сожалению работает не идеально , порты линий нужно проставить вручную , линии переходов иногда "склеиваются " , чтобы их разделить нужно немного "пошевелить " элемент
7. pm74 179 19.02.18 12:14 Сейчас в теме
(5)с графической схемой работать удобно , единственный минус(имо) - нет расшифровки , поэтому сделать полностью интеракивной (например как рис.) сложновато
Прикрепленные файлы:
8. Yashazz 3417 19.02.18 12:50 Сейчас в теме
В предложенной публикации порты управляются программно, их можно перевешивать как угодно. А что линии склеиваются, так это штатная манера самой 1С, для созданных вручную всё так же.
нет расшифровки

Это почему? Есть расшифровка, у меня часть бизнес-логики именно на ней основана. Очень даже есть.
9. pm74 179 19.02.18 12:57 Сейчас в теме
(8)
Есть расшифровка

интересненько , я пока внимательно не прочитал (имел в виду "родную" расшифровку как в ТД )
интерфейс наподобие обработки расшифровки тоже есть ?

(8)
управляются программно
т.е. есть алгоритм для "красивого" расположения входных и выходных портов ?
10. Yashazz 3417 19.02.18 17:49 Сейчас в теме
(9) Конечно есть. Роднее некуда. Собственно, это штатная возможность граф.схем, я ею пользовался, но ничего сверхъестественного не делал, чтобы она работала, она как раз и сама по себе в платформе очень даже.

Алгоритма нет, есть параметр, который этим управляет. Свойство с типом, как в платформе. Делать алгоритм для красоты, скажу честно, было тупо некогда)
11. pm74 179 19.02.18 19:43 Сейчас в теме
(10)
Собственно, это штатная возможность граф.схем, я ею пользовался, но ничего сверхъестественного не делал

Я и впрямь что-то упустил. (связанную с элементами ГС какую- то коллекцию-реквизит пока не рассматриваем) , вроде в ГС нет параметров из которых можно напрямую извлечь ссылку на объект базы данных.
Не могли бы пояснить , а то чего-то недопонимаю.
(10)
есть параметр, который этим управляет
это понятно , имел в виду вручную (либо по умолчанию) назначение номеров входов / выходов

Под "красивой" расстановкой подразумевалось полностью программное расположение элементов , обеспечивающее наилучшую компактность и читабельность схемы при наименьшем пересечении линий.
12. Serg O. 189 21.02.18 07:00 Сейчас в теме
Листинг на 5 стр. Зачем? Читать код тут...никто не будет.
Сами же пишете, что у Вас готовое для допила решение
13. Yashazz 3417 21.02.18 19:23 Сейчас в теме
(12) Читать не будут. Копипастить будут) Особенно те, у кого стартманей нету)) Читайте внимательнее: обработка - для допила, а код - уже боевой.
Зеленоград; XelOla; +2 Ответить
Оставьте свое сообщение
Вопросы с вознаграждением