Анализ процедур и функций (структура кода)

Программирование - Инструментарий

20
Глубокая переработка своей консоли запросов подтолкнула меня к поиску, а затем и созданию, инструмента для анализа взаимосвязей процедур и функций модуля и различных форм обработки.

Глубокая переработка своей консоли запросов подтолкнула меня к поиску, а затем и созданию, инструмента для анализа взаимосвязей процедур и функций модуля и различных форм обработки.

Я лучше воспринимаю графическое представление и для целей анализа структуры кода мне изначально подошла следующая обработка «Граф вызовов для модулей 1С…», которая парсит предложенный текст на процедуры и функции, строит дерево взаимосвязей и рисует по полученным данным связанный граф в виде картинки.
Все прекрасно, но при большом объеме кода граф получается перегружен и не всегда удачно формируется с точки зрения визуализации.
Затем указанную обработку доработал Павел Заяш (Pavl0), добавив возможность выгрузки в формате gml. Это значительно повысило возможности визуализации полученного графа.

Но хотелось еще большего удобства :)

Так, было бы не плохо анализировать выбранный список функций и процедур, анализировать асинхронные вызовы, выводить граф используемых и/или использующих процедуры и/или функции из списка.

В итоге я решил создать свой велосипед, учитывающий эти хотелки, а заодно и ознакомиться с замечательным форматом yml.

Парсить код решил с помощью regexp. Для детального синтаксического разбора языка — это вряд ли лучший вариант, но для реализации моей задачи вполне походящее решение.

Шаблон для процедур и функций получил следующий: «^Процедура([^КонецПроцедуры].*\n+)+КонецПроцедуры» и «^Функция([^КонецФункции].*\n+)+КонецФункции»
Шаблон для процедур и функций с параметрами такой: «^Процедура([^\)])+\)» и «^Функция([^\)])+\)»
Шаблон для имени процедур и функций: «^Процедура([^\(])+\(» и «^Функция([^\(])+\(»
Формат gml достаточно хорошо описан здесь у разработчика программы yEd, читающей этот формат.

Для моих целей на текущий момент оказалось достаточно следующих блоков gml:

//Описание: http://docs.yworks.com/yfiles/doc/developers-guide/gml.html#HierarchyExtension.graph.interedge_level
// node: type                     - "ellipse"/"oval"/"circle", "rectangle", "triangle", "parallelogram", "hexagon", "diamond", "octagon", "roundrectangle", "rectangle3d", "trapezoid", "trapezoid2"
// edge: type                     - "arc", "spline", "bezier", or "quadCurve"
// edge: targetArrow, sourceArrow - "delta", "standard", "diamond", "short", "white_delta", "white_diamond", or "none"
// edge: arrow                    - "last", "first", or "both"
Если ИмяШаблона = "СвязиСекции" Тогда 
	Возврат 
		"	edge
		|	[
		|		source ""%source%""
		|		target ""%target%""
		|		label ""%label%""
		|		graphics
		|		[
		|		fill ""#000000""
		|		targetArrow	""standard""
		|		]
		|	]
		|";
ИначеЕсли ИмяШаблона = "СодержимоеСекции" Тогда 
	Возврат 
		"	node
		|	[
		|		id	""%id%""
		|		label	""%label%""
		|		graphics
		|		[
		|			type	""%type%""
		|			fill	""%fill%""
		|			outline	""#000000""
		|			outlineWidth %outlineWidth%
		|			h %height%
		|			w %width%
		|		]
		|		%gid%
		|	]
		|";
ИначеЕсли ИмяШаблона = "ГруппаМодуль" Тогда 
	Возврат 
		"	node
		|	[
		|		id	""%id%""
		|		label	""%label%""
		|		isGroup 1
		|	]
		|";		
ИначеЕсли ИмяШаблона = "Общий" Тогда 
	Возврат
	"Creator ""lavelin.ru/code_structure""
	|Version 0.1
	|graph
	|[
	|	hierarchic 1
	|	label """"
	|	directed 1
	|%СодержимоеСекций%
	|%СвязиСекций%
	|]";
Иначе
	Возврат ""
КонецЕсли;

В итоге получил следующий инструмент  «АнализПроцедурИФункций»:

 

Это нельзя назвать законченным решение, но первичный анализ он проводить уже позволяет.

Вы можете поучаствовать в развитие разработки на github.

Разработка велась на платформе: 8.3.11.2954.

Ограничения и обнаруженные ошибки можно посмотреть здесь

 

Новое:  

- добавлена загрузка модулей из файлов, выгруженных с помощью функционала платформы 1с «Выгрузить в файлы»
- добавлена выгрузка обработки в файлы (через пакетный вызов конфигуратора)

Подробнее добавленный функционал описан в статье "Извлечение текстов модулей из внешней обработки 1С"

20

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

Наименование Файл Версия Размер
Анализ процедур и функций
.epf 18,98Kb
28.03.18
3
.epf 18,98Kb 3 Скачать

См. также

Комментарии
Сортировка: Древо
1. JohnConnor 24 27.04.18 09:29 Сейчас в теме
2. zenechka 439 27.04.18 09:41 Сейчас в теме
(1) пожалуйста :)
На выходных постараюсь выложить обновление обработки с загрузкой текстов модулей из файлов(полученных через функционал "Выгрузить в файлы") включая парсинг "bin" файлов (бинарные файлы с данными не управляемых форм)
3. zekrus 154 16.08.18 10:06 Сейчас в теме
Добрый день!
Тема весьма актуальная.
А не пробовали вести анализ переменных и полей таблиц модулей?
С уважением
4. zenechka 439 16.08.18 11:23 Сейчас в теме
(3) День добрый, Николай.
Не совсем понял о чем речь. Что Вы имеете ввиду под "полей таблиц модулей"?
Есть потребность, в частности, добавить анализ и вывод информации по фактическим и формальным параметрам процедур/функций.
Но пока не доходят до этого руки.
5. zekrus 154 16.08.18 14:57 Сейчас в теме
(4) Это для реализации графической блок-схемы может пригодиться
- в коде используются таблицы данных, а у таблиц поля (их и анализировать).
6. zenechka 439 17.08.18 09:16 Сейчас в теме
(5) нет, такой задачи не стояло пока
7. zekrus 154 17.08.18 13:04 Сейчас в теме
(6) пока да. но рано или поздно до этого дойдет.
Оставьте свое сообщение