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




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

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

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

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

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

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

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

Шаблон для процедур и функций получил следующий: «#k8SjZc9DxkПроцедура([#k8SjZc9DxkКонецПроцедуры].*
+)+КонецПроцедуры
» и «#k8SjZc9DxkФункция([#k8SjZc9DxkКонецФункции].*
+)+КонецФункции
»
Шаблон для процедур и функций с параметрами такой: «#k8SjZc9DxkПроцедура([#k8SjZc9Dxk)])+)» и «#k8SjZc9DxkФункция([#k8SjZc9Dxk)])+)»
Шаблон для имени процедур и функций: «#k8SjZc9DxkПроцедура([#k8SjZc9Dxk(])+(» и «#k8SjZc9DxkФункция([#k8SjZc9Dxk(])+(»
Формат 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С"

7 Comments

  1. JohnConnor

    спаисбо

    Reply
  2. zenechka

    (1) пожалуйста 🙂

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

    Reply
  3. zekrus

    Добрый день!

    Тема весьма актуальная.

    А не пробовали вести анализ переменных и полей таблиц модулей?

    С уважением

    Reply
  4. zenechka

    (3) День добрый, Николай.

    Не совсем понял о чем речь. Что Вы имеете ввиду под «полей таблиц модулей»?

    Есть потребность, в частности, добавить анализ и вывод информации по фактическим и формальным параметрам процедур/функций.

    Но пока не доходят до этого руки.

    Reply
  5. zekrus

    (4) Это для реализации графической блок-схемы может пригодиться

    — в коде используются таблицы данных, а у таблиц поля (их и анализировать).

    Reply
  6. zenechka

    (5) нет, такой задачи не стояло пока

    Reply
  7. zekrus

    (6) пока да. но рано или поздно до этого дойдет.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *