Как визуализировать структуру кода 1С и взаимосвязи функций и процедур?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием IT и автоматизация бизнеса
← На главную

При работе с крупными и сложными конфигурациями 1С, особенно с теми, которые имеют долгую историю или написаны без строгих стандартов, понимание взаимосвязей между процедурами и функциями может стать настоящим вызовом. Мы часто сталкиваемся с ситуацией, когда требуется быстро разобраться, какой метод вызывает другой, или кто является потребителем определенной функции. Построение наглядного дерева вызовов позволяет существенно упростить этот процесс и повысить эффективность работы программиста. Рассмотрим различные подходы и инструменты, которые помогут нам в этом.

1. Использование сторонних обработок для построения графов вызовов

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

Например, существует обработка с Infostart, предназначенная для построения графа вызовов функций и процедур. Она анализирует исходный код 1С и генерирует данные, которые затем можно импортировать в визуализатор, такой как YeD.

  1. Загрузка обработки: Первым шагом нам потребуется найти и загрузить соответствующую обработку, которая выполняет парсинг кода 1С.
  2. Подготовка кода: Иногда для корректной работы обработки требуется небольшая предварительная подготовка исходного кода. Мы можем столкнуться с необходимостью временного удаления или комментирования определенных участков кода, на которые обработка может ругаться (как было упомянуто в обсуждении, "Удалил из кода процедуру, на которую ругалась программа"). Это позволяет обойти синтаксические особенности или ошибки, которые мешают парсеру.
  3. Генерация данных: После подготовки кода запускаем обработку. Она проанализирует выбранный модуль и сгенерирует файл (например, в формате GraphML), содержащий информацию о вызовах.
  4. Визуализация в YeD: Импортируем сгенерированный файл в редактор графов YeD (или аналогичный). YeD позволяет наглядно представить дерево вызовов, где узлы — это процедуры и функции, а рёбра — связи между ними. Мы можем перемещать узлы, изменять их расположение, масштабировать граф, чтобы получить наиболее удобное для анализа представление.

Преимущества: Этот подход особенно полезен для "исторического копрокода" или для детального анализа отдельных "монстров" на 10 экранов, где необходимо точно понять, куда может "сигануть" выполнение программы. Мы получаем точную, автоматически построенную схему взаимосвязей, которая избавляет нас от необходимости вручную вспоминать структуру модуля при возвращении к задаче.

Ограничения: Для всей конфигурации, особенно для таких масштабных систем как 1С:ERP, подобный подход становится нецелесообразным. Полученный граф будет слишком огромен и сложен для восприятия, превращаясь в "эксель на 100500 строк". Также, из-за широкого использования рефлексии и оповещений в 1С (например, Оповестить(), НачатьОткрытиеФормы()), любой инструмент, основанный на статическом анализе, будет неполноценным, поскольку он не сможет отследить динамические вызовы.

2. Использование встроенных инструментов 1С

Платформа 1С:Предприятие и среда разработки EDT предлагают базовые, но очень полезные инструменты для анализа вызовов методов, которые всегда должны быть в нашем арсенале.

2.1. Конфигуратор 1С:Предприятие (Alt-F12)

Встроенный конфигуратор предоставляет простой, но эффективный способ для просмотра иерархии вызовов. Мы можем выделить имя процедуры или функции в модуле и нажать комбинацию клавиш Alt-F12. Конфигуратор покажет нам, кто вызывает этот метод и какие методы вызываются из него. Это незаменимый инструмент для быстрого погружения в контекст отдельного метода и понимания его роли в локальной структуре кода.

Как это работает:

  1. Открываем нужный модуль в конфигураторе.
  2. Устанавливаем курсор на имя процедуры или функции, которую хотим проанализировать.
  3. Нажимаем Alt-F12.
  4. Откроется окно или панель, демонстрирующая "Дерево вызовов" или "Взаимосвязи процедур/функций". Мы увидим, какие методы вызывают текущий и какие методы вызываются из текущего.

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

2.2. 1C:Enterprise Development Tools (EDT)

Если мы используем 1C:Enterprise Development Tools (EDT) как основную среду разработки, то у нас есть еще более мощные и интегрированные возможности для анализа кода. EDT предоставляет специализированную панель "Иерархия вызовов" (Call Hierarchy), которая работает аналогично Alt-F12 в конфигураторе, но с большей наглядностью и удобством, характерным для современных IDE. Мы можем легко переключаться между вызывающей и вызываемой иерархией, что делает навигацию по коду более интуитивной.

Преимущества EDT:

  1. Интеграция: Панель "Иерархия вызовов" глубоко интегрирована в среду разработки, что обеспечивает более плавный процесс анализа.
  2. Расширенные возможности: EDT, как современная IDE, предлагает дополнительные функции для рефакторинга и навигации, которые дополняют анализ вызовов. Например, мы можем быстро перейти к определению вызывающего или вызываемого метода.

В целом, встроенные средства платформы и EDT являются нашими первыми помощниками для понимания локальных взаимосвязей и отслеживания потока выполнения в конкретных, обособленных фрагментах кода.

3. Обработка "ГенерацияОписанияПрограммногоИнтерфейса.epf" из БСП

Для разработчиков, использующих сторонние системы разработки и стремящихся к созданию структурированной документации, в состав Библиотеки стандартных подсистем (БСП) начиная с версии 2.4 включена специальная обработка ГенерацияОписанияПрограммногоИнтерфейса.epf.

Назначение: Эта обработка предназначена для автоматического формирования html-файла с описанием программного интерфейса (API) произвольной библиотеки или конфигурации. Она является отличным инструментом для понимания высокоуровневой архитектуры подсистем, если разработчики следовали определенным стандартам при написании кода.

Расположение: Мы найдем эту обработку в папке с шаблоном конфигураций БСП по пути ...\ExtFiles\Инструменты разработчика\ГенерацияОписанияПрограммногоИнтерфейса.epf.

Механизм работы:

  1. Обработка анализирует программные модули.
  2. Она извлекает комментарии к экспортным процедурам и функциям, которые размещены в специально выделенных областях, чаще всего в области ПрограммныйИнтерфейс.
  3. При этом, она учитывает ряд исключений, специально отмеченных в коде с помощью области ДляВызоваИзДругихПодсистем.
  4. На основе собранной информации формируется структурированный html-документ, который описывает API. Также для быстрой навигации по методам можно использовать MCP сервер для работы с экспортными процедурами — для этого подойдёт анализ кода 1С с помощью LLM.

Польза: Если кодеры адекватно писали код, используя правильные области и детальные комментарии, то в результате мы можем получить более или менее адекватное и понятное описание подсистемы. Это не прямая визуализация дерева вызовов, но это мощный инструмент для понимания функционального назначения методов и их роли в общей архитектуре, что является важной частью декомпозиции.

4. Инструменты статического анализа и AST-деревья

Для глубокой и автоматизированной декомпозиции кода мы обращаемся к инструментам статического анализа и даже ИИ-решениям, таким как специальный Skill для отладки и разбора кода (поможет отладка и анализ стека вызовов кода). Фундаментом для классических инструментов является построение Абстрактного Синтаксического Дерева (AST).

Что такое AST? AST представляет собой древовидную структуру кода, которая лишена "лишних" деталей (например, пробелов, комментариев). В AST вершины соответствуют операторам языка (например, условиям, циклам, вызовам методов), а листья — операндам (переменным, константам). Построение AST — это первый этап любого статического анализа кода.

Как AST помогает в декомпозиции? На основе AST мы можем программно анализировать структуру кода, выявлять взаимосвязи, находить вызовы методов, определять область видимости переменных и многое другое — для этого есть анализ архитектуры и графа связей конфигурации. Для 1С существуют парсеры, способные преобразовывать исходный код модулей (.bsl файлы) в синтаксическое дерево. Это дерево затем используется для различных целей, включая поиск переменных и методов, находящихся в экспортных процедурах.

Инструменты статического анализа для 1С:

  1. SonarQube с плагинами для 1С (BSL Community Plugin): Это мощное бесплатное решение для комплексного статического анализа кода. SonarQube способен анализировать код 1С на предмет:
    • Ошибок и потенциальных уязвимостей.
    • Отклонений от стандартов разработки.
    • Дублирования кода.
    • Сложности и поддерживаемости кода.
    SonarQube позволяет автоматизировать оценку качества кода и интегрировать ее в процессы непрерывной интеграции/непрерывного развертывания (CI/CD). Это не просто инструмент для дерева вызовов, а комплексная система контроля качества.
  2. 1С:Автоматизированная проверка конфигураций (АПК): Продукт от фирмы "1С", разработанный для проверки конфигураций и расширений на соответствие внутренним стандартам разработки "1С". АПК выполняет статический анализ технического качества конфигураций, существенно расширяя встроенную платформенную проверку. Он позволяет:
  3. 1CCodeAnalyze: Программа для автоматического анализа кода 1С, которая фокусируется на выявлении специфических проблем и антипаттернов программирования:
    • Поиск запросов в циклах.
    • Выявление неиспользуемых переменных.
    • Обнаружение неявных и неоптимальных запросов.
    • Поиск других антипаттернов, которые могут влиять на производительность и поддерживаемость кода.

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

5. Инструменты для автоматической документации и рефакторинга

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

  1. Autodocgen: Инструмент, предназначенный для генерации документации на основе файлов исходных кодов конфигурации 1С:Предприятие. Мы можем использовать его для:
    • Автоматического формирования документации.
    • Проверки корректности разбора информации, которая является исходными данными для документации.
    Autodocgen поддерживает общие модули и модули менеджеров объектов, а также использует комментарии-описания методов. Эти комментарии могут быть использованы для создания древовидной структуры документации с глобальным поиском, что значительно упрощает навигацию и понимание архитектуры.
  2. bsl2jsdoc: Ещё один генератор документации, работающий с файлами исходных текстов конфигурации (или расширения) 1С:Предприятие 8.3. Он выполняет схожие функции, помогая нам поддерживать актуальную и понятную документацию.
  3. Встроенные инструменты рефакторинга в Конфигураторе и EDT: Платформа 1С предлагает ряд инструментов для рефакторинга кода, доступных через подменю "Рефакторинг". Эти инструменты не визуализируют, но активно помогают в создании более чистой и понятной структуры:
    • Выделение фрагментов кода: Мы можем выделить любой фрагмент кода и быстро преобразовать его в отдельную процедуру или функцию.
    • Переименование: Возможность переименовывать переменные и методы с автоматической заменой по всему коду.
    • Создание описаний методов: Быстрое добавление структурированных комментариев для процедур и функций.
    • Обработка оповещений: Автоматическое создание обработчиков оповещений.
    • Преобразование вызовов: Мы можем преобразовывать синхронные вызовы в асинхронные, что важно для оптимизации производительности управляемых форм.

Эти инструменты позволяют нам не только документировать, но и активно улучшать структуру кода, делая его более модульным и легким для понимания.

6. Визуализация структуры кода с помощью Graphviz и UML

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

  1. Graphviz и JS-библиотеки: После получения структурированных данных о вызовах (например, с помощью парсеров AST или специализированных обработок), мы можем использовать мощные библиотеки для построения графов, такие как Graphviz. Graphviz позволяет создавать высококачественные статические или интерактивные диаграммы. Если требуется интерактивность, существуют JS-библиотеки, которые могут визуализировать графы прямо в браузере, создавая интерактивные дашборды, что очень удобно для навигации по большим структурам.
  2. Преобразование в UML-модель: Разрабатываются идеи по преобразованию конфигурации 1С в UML-модель. UML (Unified Modeling Language) — это стандартный язык для визуализации, спецификации, конструирования и документирования компонентов программных систем. Поскольку конфигурация 1С может быть выгружена в XML-файлы, теоретически мы можем:
    • Парсить эти XML-файлы, извлекая метаданные и структуру кода.
    • Преобразовывать полученные данные в UML-модель формата XMI.
    Это позволяет графически представить архитектуру системы, взаимосвязи объектов метаданных (справочников, документов) и даже на высоком уровне отразить структуру модулей. Такой подход особенно ценен для архитекторов и руководителей проектов, которым необходимо понимать общую структуру системы, а не только детальные вызовы функций.

Ограничения и рекомендации по применению

Хотя инструментов для декомпозиции кода 1С существует немало, важно понимать их ограничения и применять их осознанно:

  1. Рефлексия и оповещения: Как уже было упомянуто, широкое использование рефлексии (например, ПолучитьОбъект(), Выполнить()) и механизма оповещений (Оповестить(), ОповещениеОЗавершении()) делает любой статический анализ неполноценным. Динамические вызовы, определяемые во время выполнения, крайне сложно отследить заранее, что искажает полноту графа вызовов.
  2. Сложность ERP: Попытки декомпозировать всю конфигурацию 1С:ERP, как правило, бесполезны. Результат будет настолько масштабным и запутанным, что разобраться в нем будет сложнее, чем в исходном коде. Для ERP систем мы должны фокусироваться на конкретных подсистемах или даже отдельных функциях.
  3. "Мозг" и ручная работа: Несмотря на все инструменты, наш "мозг" остается самым мощным инструментом декомпозиции. Для понимания сложных алгоритмов иногда эффективнее взять ручку и листок бумаги, чтобы вручную нарисовать ключевые этапы и взаимосвязи. Это позволяет сфокусироваться на логике, а не на синтаксических деталях.
  4. Целенаправленный анализ: Вместо попыток объять необъятное, мы должны "протоптать себе дорогу" только там, где это действительно нужно. Если стоит задача понять, куда "вот этот, сука, монстр" на 10 экранов может сигануть, то целенаправленное использование обработки для графов вызовов будет полезным.
  5. Качество кода: Эффективность многих инструментов, особенно тех, что генерируют документацию, напрямую зависит от качества исходного кода и соблюдения стандартов. Наличие структурированных областей (ПрограммныйИнтерфейс) и подробных комментариев значительно повышает полезность таких средств.

В заключение, декомпозиция кода 1С — это не единичное действие, а комплексный процесс, требующий использования различных инструментов и подходов. Комбинируя статический анализ, визуализацию, автоматическую документацию и собственные аналитические способности, мы можем эффективно разбираться в самых сложных участках кода, повышая качество и поддерживаемость наших разработок.

← На главную