Внешняя компонента Native API для построения графов (на основе GraphViz)

12.04.16

Разработка - Разработка внешних компонент

Данная публикация представляет собой внешнюю компоненту «GraphViz NAPIC», выполненную по технологии native API, предоставляющую методы библиотеки GraphViz для построения графа по его описанию в текстовом формате на языке dot. Приложена обработка с примером вызова компоненты ОФ+УФ.

Скачать файл

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

Наименование По подписке [?] Купить один файл
GraphVizNAPIC
.zip 1,15Mb ver:1.0
30
30 Скачать (1 SM) Купить за 1 850 руб.

Сравнение с WinGraphViz

На инфостарте есть несколько публикаций, посвященных визуализации связей на основе учетных или любых других данных в 1С. Большая часть этих публикаций использует внешнюю COM-компоненту под названием WinGraphViz.dll. Рассмотрим,  что представляет собой эта компонента. Первоначально она засветилась на форуме мисты в одной из рассылок: http://www.mista.ru/subscribe/56.htm за авторством уважаемого С. Митичкина. Статья из рассылки все еще актуальна, но ссылки нерабочие, так как изменилась домашняя страница проекта GraphViz, рабочие ссылки приведу в конце статьи. Компоненте присущи некоторые недостатки:

  1. Компонента выполнена по технологии COM, что вызывает необходимость регистрировать компоненту перед использованием. Регистрация не сложная, выполняется одной командой «regsvr32 путьККомппоненте\WinGraphviz.dll», но требует прав администратора на выполнение регистрации, что вызывает кучу проблем с правами, если требуется сделать регистрацию на сервере.
  2. У компоненты наблюдаются некоторые проблемы с кодировкой входного файла, поэтому приходится совершать ритуальные движения, чтобы заставить её корректно работать с русским языком (в рассылке расписано как это сделать; если вкратце, нужно сохраняя и загружая файл, принудительно сконвертировать его в другую кодировку).
  3. Самое важное – компонента устарела и на сайте нет построенной свежей версии (последняя версия на основе GraphViz 1.8.10 от 28.04.2004)

Чтобы избавиться от перечисленных недостатков я решил сделать свой билд компоненты, на основе последней версии библиотеки на дату публикации (2.38.0). В этом мне очень помог c-make порт библиотеки GraphViz за авторством пользователя гитхаба krf https://github.com/krf/graphviz/tree/cmake-integration.

Что умеет мой билд компоненты:

- строить граф с помощью движков dot и neato

- выводить граф в формате png, bmp, jpg, svg, emf, gif, tiff и dot

- принимать граф в виде файла или строки в кодировке cp1251 или UTF-8

- выдавать результат в файл или сразу в переменную 1с с типом ДвоичныеДанные

Описание использования

Использование компоненты:

Компонента предоставляет всего 4 функции для построения графов:

ПостроитьИзСтрокиВФайл(ВходнаяСтрока, ПутьКФайлуВывода, ДвижокРазмещения, ФорматРендеринга)

ПостроитьИзСтрокиВДД(ВходнаяСтрока, ДвоичныеДанныеВывода, ДвижокРазмещения, ФорматРендеринга)

ПостроитьИзФайлаВФайл(ПутьКФайлуОписанияГрафа, ПутьКФайлуВывода, ДвижокРазмещения, ФорматРендеринга, Кодировка)

ПостроитьИзФайлаВДД (ПутьКФайлуОписанияГрафа, ДвоичныеДанныеВывода, ДвижокРазмещения, ФорматРендеринга, Кодировка)

Описание параметров:

Входная строка – строка с описанием графа на языке dot,

ПутьКФайлуОписанияГрафа – полный путь к файлу с описанием графа на языке dot,

ПутьКФайлуВывода – полный путь к файлу для сохранения результата построения графа,

ДвоичныеДанныеВывода – переменная 1с в которую будет выгружен результат с типом ДвоичныеДанные,

ДвижокРазмещения – передается имя движка «dot» или «neato», значение по умолчанию «dot»,

ФорматРендеринга – передается расширение графического формата, поддерживаются следующие варианты: «bmp», «emf», «emfplus», «gif», «jpg», «tif», «tiff», «ps», «png», «svg», «dot» значение по умолчанию «png».

Кодировка – поддерживаются значения «ACP» для кодировки cp-1251 и «UTF8» для кодировки UTF-8, значение по умолчанию «ACP».

Все 4 функции не вызывают исключений, а возвращают значение Истина, если построение графа было выполнено. Если возникли какие-либо ошибки, то результатом выполнения функции будет строка с сообщением об ошибке, обработка которой остается на усмотрение программиста (сообщить пользователю или проигнорировать).

Примеры

Пример работы с компонентой (предполагаем, что описание графа сформировано в переменной «входнаяСтрока» и на форме есть «ПолеКартинки1»):

ПодключитьВнешнююКомпоненту(ПутьККомпоненте, "GraphViz", ТипВнешнейКомпоненты.Native);
GraphViz = Новый("AddIn.GraphViz.Ext");
картинкаРезультат = Неопределено;
рез = GraphViz.ПостроитьИзСтрокиВДД(входнаяСтрока,картинкаРезультат,"dot","png");
Если рез<>Истина Тогда 
   Сообщить(рез); 
КонецЕсли;
картинка = Новый Картинка(картинкаРезультат);
ЭлементыФормы.ПолеКартинки1.Картинка = картинка;

Пример описания графа на языке dot:

digraph graphname {
    a;
    b;
    c;
    d;
    a -> b;
    b -> c;
    b -> d;
}

Построенный граф будет выглядеть таким образом:

пример простого графа

Полезные ссылки

Сайт проекта GraphViz: http://graphviz.org/

Сайт библиотеки с COM-интерфейсом WinGrahViz: http://wingraphviz.sourceforge.net/wingraphviz/

Статьи использующие COM-компоненту WinGraphViz:

Графический анализ счета: //infostart.ru/public/146469/

Построение графа затрат РАУЗ: //infostart.ru/public/294967/

Универсальный граф подчиненности документов: //infostart.ru/public/20309/

Скачать

Для загрузки предоставлен архив, в котором находится сама компонента «GraphViz NAPIC.dll», а также демо обработка, показывающая пример работы со всеми 4-мя функциями компоненты (в демо-обработке компонента внедрена в макет, для демонстрации способа подключения внешних компонент на лету).

Демо обработка

UPD 15.04.2016

Добавил формат рендеринга «dot», это пригодится для формирования размещения графа в текстовом виде, как описано в комментарии (3).

UPD 02.01.2017

  • в демо обработку добавил управляемую форму

  • исправил ошибку с памятью и протестировал на следующих версиях платформы: 8.3.9 толстый и тонкий клиент (УФ), 8.2.19 толстый и тонкий клиент (толстый клиент на ОФ)

Внешняя компонента граф визуализация

См. также

Разработка внешних компонент Программист Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

Позволяет автоматизировать работу с картинками. С помощью компоненты можно измерять размер изображений, поворачивать их, наносить водяные знаки, конвертировать из одного формата в другой. Будет очень полезна для интернет-магазинов и всех, кому постоянно требуется работать с различными графическими форматами. Выполнена по технологии NativeAPI. Работает с форматами: jpg (jpeg), png, bmp, gif, tif

3600 руб.

02.09.2010    77938    73    277    

191

Разработка внешних компонент Программист Платформа 1С v8.3 1C:Бухгалтерия 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 Платные (руб)

Внешняя компонента позволяет работать c TWAIN-совместимым оборудованием (сканерами, камерами) . Полностью совместима со стандартной TWAIN-компонентой из БСП и может применяться как ее замена без изменения вызовов, при этом может работать с 64-разрядной платформой, а так же имеет расширенную функциональность, например, сохранение результата непосредственно в PDF без использования сторонних утилит. Прекрасно работает на сервере, тонком клиенте и веб-клиенте (проверена работа в браузерах Google Chrome, Mozilla Firefox и Microsoft Internet Explorer).

3000 руб.

12.05.2020    29225    139    100    

92

Разработка внешних компонент Программист Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

Внешняя компонента позволяет печатать PDF файлы непосредственно из 1С, не используя при этом сторонних программ. Прекрасно работает на сервере, тонком клиенте и веб-клиенте. Основана на проекте PDFium из состава проекта Chromium/Chrome

1500 руб.

17.09.2018    37206    115    128    

116

Разработка внешних компонент Телефония, SIP Программист Платформа 1С v8.3 1C:Бухгалтерия Россия Платные (руб)

Внешняя компонента выполнена по технологии Native API для 1С 8.х, обеспечивает доступ к программным АТС Asterisk (FreePBX, Elastix) через AMI интерфейс. Через него можно управлять многими функциями Asterisk (определение номеров, перевод звонков, набор телефона и т. д.)

2400 руб.

04.05.2018    47741    125    66    

68

Разработка внешних компонент Системный администратор Программист Стажер Бесплатно (free)

Библиотека для работы с базами SQLite из 1С на основе внешней компоненты. Для Linux и Windows, бесплатно и с открытым исходным кодом!

14.01.2025    2782    bayselonarrend    14    

48

Разработка внешних компонент Программист Платформа 1С v8.3 1C:Бухгалтерия Россия Бесплатно (free)

В статье описывается приложение-конструктор внешних компонент (native API). Конструктор упрощает процесс разработки за счет удобного добавления всех нужных функций и процедур в графическом режиме, с указанием их параметров и типов параметров. На выходе приложение генерирует готовый код на С++ и Rust и позволяет сразу приступить к реализации, без настройки API компоненты вручную.

04.12.2024    5580    kovalevdmv    26    

77

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

Внешняя компонента для конвертации PDF файлов в картинки без использования дополнительных программ. Работает на сервере и в тонком клиенте.

2400 руб.

25.06.2024    1348    3    4    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. awk 745 12.04.16 15:08 Сейчас в теме
2. graphbuh 262 14.04.16 11:41 Сейчас в теме
Хотелось бы спросить у автора этой замечательной статьи, а есть ли возможность на основе этой библиотеки (или может быть есть какие-то готовые продукты),сделать доработку, позволяющую инициировать событие при клике на узел и / или ядро графа...1С уже учится рисовать деревья в типовых (например, ЗУП 3.0), организационная структура. Там макет разбивается на кучу мелких клеток и каждая вершина графа / ребро состоит из большого их числа. Т.е. по идее расшифровку надо привязывать к каждому такому квадратику - куда мышь попадет...Рассчитать узлы и дуги произвольного графа - большая и сложная задача, graphviz ее делает успешно, если бы научиться эти промежуточные результаты выбрасывать в макет (с той или иной степенью точности) это был бы прорыв в визуализации я думаю.
RomanRomans; dabu-dabu; +2 Ответить
3. Synoecium 787 14.04.16 12:50 Сейчас в теме
(2) graphbuh, как мне кажется это возможно сделать без каких-либо дополнительных внешних компонент и изменения библиотеки GraphViz.
1) Определяем координаты и размеры вершин и ребер графа. Это можно сделать, если получить результат построения графа в формате "dot", вот пример простого графа из статьи:
digraph graphname {
graph [bb="0,0,126,197.01"];
node [label="\N"];
a [height=0.57874,
pos="63,176.17",
width=0.75];
b [height=0.57874,
pos="63,98.504",
width=0.75];
a -> b [pos="e,63,119.52 63,155.29 63,147.45 63,138.26 63,129.63"];
c [height=0.57874,
pos="27,20.835",
width=0.75];
b -> c [pos="e,35.921,40.587 54.101,78.8 49.947,70.068 44.916,59.493 40.321,49.835"];
d [height=0.57874,
pos="99,20.835",
width=0.75];
b -> d [pos="e,90.079,40.587 71.899,78.8 76.053,70.068 81.084,59.493 85.679,49.835"];
}
*Кстати, похоже я пропустил формат построения dot, надо будет добавить, так как такая возможность у библиотеки есть и в статье она указана.
2) Определяем координаты мыши при нажатии на поле картинки в 1с. Это можно сделать например так: http://aitika.ru/otvety/1645-1c-Opredelyaem-koordinati-kursora-mishi-v-1S-bez-VK
3) перебираем все вершины и узлы и смотрим, попала ли мышка в какой нибудь из них. Если попала, то делаем что нам надо, это и будет событие клика на элемент графа.
RomanRomans; graphbuh; +2 Ответить
4. graphbuh 262 14.04.16 16:02 Сейчас в теме
Здорово! надо будет попробовать. я тут как раз не мог успокоиться было интересно есть ли интерактивные графы
вот нашел пример:
http://jaredforsyth.com/treed/



5. Steelvan 307 15.04.16 13:02 Сейчас в теме
http://схемы1с.рф/int_graphs.html

Интерактивный граф в 1С.
Только проект авторами уже закрыт.
Хотя за бабки можно и поделиться, наверное.
6. ildarovich 7953 15.04.16 15:59 Сейчас в теме
Вот тут тоже говорится об отображении графов в программе 1С: Как нарисовать граф на 1С. В обсуждении есть интересные ссылки на тему использования графов в экономических и других интересных задачах. Особенно интересны комментарии Polav62, который является автором объемной монографии на тему применения теории графов в экономических задачах.
7. GregRusakov 16.04.16 09:07 Сейчас в теме
Работает ли в веб-клиенте, тонком клиенте, на платформе Linux?
8. Synoecium 787 17.04.16 11:56 Сейчас в теме
(7) GregRusakov, Должно работать во всех клиентах, так как это внешняя компонента Native API. Насчет Linux, понятно, что именно эта dll не будет работать, но теоретически возможно скомпилировать GraphViz под Linux, так как библиотека кроссплатформенная. В моем билде я принудительно использую GDI+ для отрисовки графа в растровых форматах, поэтому еще придется повозиться чтобы подключить другие рендереры. В общем, не так просто, но при желании можно)
Есть еще один вариант использования библиотеки GraphViz. Можно взять пакет скомпилированных бинарных файлов на сайте и использовать их из командной строки. Если интересно, могу в демо-обработке добавить такой вариант. Недостатком такого метода будет необходимость внедрять в обработку весь пакет файлов или держать их где-то на жестком диске. Плюс возможны проблемы с правами на запуск исполняемых файлов из 1с.
9. Yashazz 4836 19.04.16 16:13 Сейчас в теме
И снова внешняя приблуда, которая лажанётся в самый ответственный момент. Впрочем, это беда любой внешней компоненты.
10. Synoecium 787 19.04.16 18:57 Сейчас в теме
(9) Yashazz, Попробуй, про лажу отпишешься :) Пока проблем с компонентой не наблюдал.
Кстати насчет стабильности, я специально обернул весь код в компоненте в попытку, так что в худшем случае вернет сообщение о неизвестной ошибке, но 1с не обрушит.
11. Yashazz 4836 19.04.16 19:21 Сейчас в теме
(10) так ведь лажа не сейчас случится. А годика через полтора, или раньше, если очередной новый релиз платформы так захочет. И где я тебя тогда буду искать, если поставлю твою фишку в коммерческое решение, а оно однажды прекрасным утром не заработает? Или если клиент винду/сеть/политику безопасности обновит, а компонента этого юмора не поймёт? Были, были уже у меня такие случаи. До автора фиг достучишься, а крайний - тот, кто поставил это клиенту.
RomanRomans; +1 Ответить
12. RainyAugust22 265 29.12.16 07:53 Сейчас в теме
При нажатии кнопки "Построить из строки в ДД" пишет ошибку - "Некорректная работа компоненты с памятью" - как победить? Платформа 8.3.9
13. Synoecium 787 29.12.16 14:55 Сейчас в теме
(12) В тонком клиенте? я находил ошибку, но в толстом клиенте она не возникала, поэтому обновлять на инфостарте не стал. Вышлю обновленную и если в этом дело, тогда обновлю и в публикации.
14. RainyAugust22 265 29.12.16 15:42 Сейчас в теме
(13)
дело, тогда обновлю и в публикации

Толстый клиент обычное приложение платформа 8.3.9.1818
15. RainyAugust22 265 05.03.18 09:30 Сейчас в теме
В 8.3.9 ошибка с памятью исправилась, хорошая работа!
Подскажите пожалуйста, возможно ли отключить сообщение "Внешняя компонента успешно установлена" при запуске обработки?
16. Synoecium 787 05.03.18 22:01 Сейчас в теме
(15) думаю, что в обработке ошибка и не срабатывает ветка с попыткой подключения компоненты без установки. Вышлю вам исправленную версию и если дело в этом, обновлю в публикации.
17. Aphanas 92 21.07.18 16:03 Сейчас в теме
При попытке вызвать "ПостроитьИзСтрокиВДД" появляется ошибка:
"Использование синхронных методов на клиенте запрещено!"
18. Aphanas 92 23.07.18 05:54 Сейчас в теме
Подскажите,как её запустить.
Система - Win 2012 Server x64, в терминале.

ПодключитьВнешнююКомпоненту всегда возвращает Ложь, и на клиенте, и на сервере.
УстановитьВнешнююКомпоненту выдает ошибку "Возможно, отсутствует компонента для используемого клиентского приложения".
RegSvr32 пишет "entry-point DLLRegisterServer was not found".
19. Synoecium 787 23.07.18 07:17 Сейчас в теме
(18) Проблему воспроизвести удалось, пока я думаю, что с определенной версии платформы перестало работать подключение внешней компоненты (на версии 8.3.7.2027 работает без проблем, на нескольких базах на УФ проверял, и файловые и клиент серверные, а вот на версии 8.3.11.2954 работать не хочет).
20. Gmix 417 01.12.20 11:32 Сейчас в теме
Сергей отлично дано это искал.
Можно ли реализовать вывод в формат cmap ?
В исходных библиотеках это поддерживалось.

1) graphviz: cmap Client-side imagemap (deprecated)
2) WinGrahViz: ToTextGraph(String Source,Integer Type) as String convert fomr -language to text-format output.(dot,ps,svg,plain,plain_ext,canon.........)
23. Synoecium 787 02.12.20 21:17 Сейчас в теме
(20) думаю да, надо будет добавить и проверить работоспособность компоненты с этим форматом
21. Gmix 417 02.12.20 21:11 Сейчас в теме
Сергей на 64 разрядной не работает. Что нибудь удалось прояснить?
22. Synoecium 787 02.12.20 21:16 Сейчас в теме
(21) Да, я как то разбирался с этой проблемой, просто скомпилировано под 32 бита, надо перекомпилировать)
Планирую выложить на гитхаб исходники, чтобы разделить груз ответственности за компоненту, возможно популярность ее несколько вырастет (за все время скачали всего 26 раз, что не слишком мотивирует тратить на нее время).
У меня есть планы перейти в c++ разработку, так что этой публикации хорошие шансы не остаться заброшенной в будущем.
26. kandr 208 04.12.20 21:29 Сейчас в теме
(22) Добрый день, Сергей! Пожалуйста, выложите исходники на гитхаб, чтобы можно было самостоятельно собрать 64-битную версию
24. Gmix 417 03.12.20 13:18 Сейчас в теме
Очень надеюсь на это.
Популярность добавиться если будет рабочий вариант на 64 платформе. Сейчас многие именно на ней уже.
28. kandr 208 12.12.20 10:59 Сейчас в теме
(24) Рредлагаю собственную реализацию компоненты с аналогичным функционалом:
https://github.com/lintest/GraphViz1C
25. CLLlAgOB 04.12.20 15:35 Сейчас в теме
Очень нужна такая же но под x64
27. kandr 208 07.12.20 17:40 Сейчас в теме
Поскольку автор не отвечает в течение длительного времени, придется сделать собственную версию компоненты. Планирую закончить до конца текущей недели. В настоящий момент уже разобрался со статистикой сборкой библиотеки GraphViz посредством CMake.
CLLlAgOB; +1 Ответить
29. Gmix 417 07.02.21 22:18 Сейчас в теме
(27) Доброго времени суток.
Есть успехи?
30. kandr 208 07.02.21 23:50 Сейчас в теме
(29) Альтернативная компонента с исходными кодами опубликована на github.com/lintest/GraphViz1C
Выше есть ссылка и опубликована статья на Инфорстарте
31. Synoecium 787 09.02.21 15:09 Сейчас в теме
(30) не засоряйте комментарии в моей статье. Ссылки на проект, указанной выше, достаточно
32. Synoecium 787 09.02.21 15:11 Сейчас в теме
(29) я недавно вновь занялся этим проектом, думаю в ближайшее время выйдет свежая версия с билдами под Win32 и Win64 плафтормы
33. Andreeei 50 31.05.21 17:59 Сейчас в теме
Windows Server 2012 64 bit, 1С:Предприятие 8.3 (8.3.17.2127)

Вот такая ошибка при запуске:

Тип не определен (AddIn.GraphViz.Ext)
{ВнешняяОбработка.ДемоGraphVizNAPIC.Форма.ФормаУпр.Форма(148)}: ДемоКомп = Новый("AddIn.GraphViz.Ext");
Оставьте свое сообщение