Сравнение с WinGraphViz
На инфостарте есть несколько публикаций, посвященных визуализации связей на основе учетных или любых других данных в 1С. Большая часть этих публикаций использует внешнюю COM-компоненту под названием WinGraphViz.dll. Рассмотрим, что представляет собой эта компонента. Первоначально она засветилась на форуме мисты в одной из рассылок: http://www.mista.ru/subscribe/56.htm за авторством уважаемого С. Митичкина. Статья из рассылки все еще актуальна, но ссылки нерабочие, так как изменилась домашняя страница проекта GraphViz, рабочие ссылки приведу в конце статьи. Компоненте присущи некоторые недостатки:
- Компонента выполнена по технологии COM, что вызывает необходимость регистрировать компоненту перед использованием. Регистрация не сложная, выполняется одной командой «regsvr32 путьККомппоненте\WinGraphviz.dll», но требует прав администратора на выполнение регистрации, что вызывает кучу проблем с правами, если требуется сделать регистрацию на сервере.
- У компоненты наблюдаются некоторые проблемы с кодировкой входного файла, поэтому приходится совершать ритуальные движения, чтобы заставить её корректно работать с русским языком (в рассылке расписано как это сделать; если вкратце, нужно сохраняя и загружая файл, принудительно сконвертировать его в другую кодировку).
- Самое важное – компонента устарела и на сайте нет построенной свежей версии (последняя версия на основе 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 толстый и тонкий клиент (толстый клиент на ОФ)