Как выполнить частичную выгрузку и фильтрацию кода конфигурации 1С для SonarQube?

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

При внедрении статического анализа кода с помощью SonarQube в проектах на платформе 1С:Предприятие разработчики часто сталкиваются с техническими ограничениями. Типовые конфигурации (например, 1С:ERP, 1С:Комплексная автоматизация или 1С:Управление холдингом) содержат миллионы строк кода. Полный анализ такой конфигурации требует колоссальных ресурсов сервера, часто падает по ошибке нехватки памяти (OutOfMemory) и занимает часы времени, что совершенно неприемлемо для процессов CI/CD. К тому же, проверять типовой код вендора обычно нет практического смысла — фокус внимания команды сосредоточен исключительно на собственных доработках.

В этой статье мы подробно разберем, как решить проблему избыточного анализа. Мы изучим как простые скриптовые методы быстрой фильтрации файлов "на коленке", так и профессиональные подходы, используемые в современных DevOps-процессах 1С-разработки.

Решение 1: Фильтрация файлов средствами PowerShell («на коленке»)

Рассмотрим ситуацию, когда конфигурация уже выгружена в файлы (например, стандартным способом "Выгрузить конфигурацию в файлы" через Конфигуратор или утилиту gitsync), и перед нами стоит задача отобрать только те файлы модулей (*.bsl), которые относятся к нашим доработкам.

Разберем по шагам два сценария фильтрации с помощью скриптов PowerShell.

Вариант А: Фильтрация по префиксу в имени каталога

Если все ваши доработки складываются в объекты с определенным префиксом (например, МояДоработка_), то их исходные файлы будут находиться в соответствующих подпапках. Нам необходимо скопировать только эти файлы, сохранив исходную структуру каталогов для корректной работы анализатора.

Проанализируем следующий PowerShell-скрипт, который решает эту задачу:


$src = "C:\UnpackedConfig\src"
$dst = "C:\FilteredConfig\src"

# Очищаем папку-приемник перед копированием
Get-ChildItem -path $dst | Remove-Item -Recurse -Confirm:$false -Force

# Находим все директории, содержащие префикс, и копируем файлы .bsl из них
foreach ($dirname in Get-ChildItem -Path $src -Recurse -Name -Directory | Select-String -pattern "МояДоработка_") {
    foreach ($filename in Get-Item -Path "$src\$dirname\*" -Filter "*.bsl") {
        echo F | xcopy "$filename" ("$dst\$dirname\" + $filename.name) /Y | out-null
    }
}

В этом скрипте мы сначала определяем пути к исходной папке $src и целевой папке $dst. С помощью командлета Get-ChildItem с флагом -Directory и фильтра Select-String мы находим только те папки, в названии которых есть наша подстрока. Затем во вложенном цикле мы копируем только файлы с расширением .bsl, используя утилиту xcopy, перенаправляя вывод в out-null для подавления лишнего вывода в консоль.

Вариант Б: Фильтрация по комментариям в коде

Иногда доработки делаются непосредственно внутри типовых модулей, и программисты помечают свои изменения специальными комментариями (например, // Иванов++). В этом случае нам нужно проанализировать содержимое самих bsl-файлов и скопировать только те, которые содержат такие маркеры.

Посмотрим на пример реализации такого отбора:


$src = "C:\UnpackedConfig\src"
$dst = "C:\FilteredConfig\src"

# Ищем уникальные файлы, содержащие маркер доработки, и копируем их с сохранением путей
foreach ($filename in Get-ChildItem -Path $src -Recurse -Filter "*.bsl" | Select-String -pattern "Иванов\+\+" -List) {
    echo F | xcopy $filename.path ($filename.path -replace [regex]::Escape($src), $dst) /Y | out-null
}

Обратите внимание на важный параметр -List у командлета Select-String. Он указывает, что при первом же совпадении шаблона в файле поиск в нем прекращается, и возвращается только одна запись для этого файла. Это предотвращает многократное копирование одного и того же файла (исключает задвоение). Регулярное выражение Иванов\+\+ экранирует символы плюса, так как в регулярных выражениях плюс является спецсимволом.

Решение 2: Встроенный механизм фильтрации по «поддержке» (Skip Support)

Если вы используете официальный плагин SonarQube 1C (BSL) Community Plugin или непосредственно BSL Language Server, то у вас есть возможность задействовать встроенный штатный механизм игнорирования типового кода.

Анализатор умеет автоматически считывать статус поддержки объектов 1С (анализируя служебный файл метаданных ParentConfigurations.bin, который выгружается вместе с конфигурацией). Для включения этой функции в настройках анализа достаточно указать специальный параметр:

Параметр sonar.bsl.languageserver.skipSupport поддерживает следующие ключевые настройки:

  1. with support locked — анализатор полностью проигнорирует все модули и объекты, которые стоят на поддержке без возможности редактирования (то есть те, на которых отображается значок "замочка").
  2. with support — анализатор пропустит абсолютно все файлы, имеющие отношение к конфигурации поставщика, даже если для них в настройках поддержки разрешено редактирование с сохранением поддержки.

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

Решение 3: Использование параметров sonar.inclusions и sonar.exclusions

Вместо физического разделения и копирования файлов, мы можем заставить SonarScanner сканировать всю папку с исходным кодом, но анализировать только строго заданные объекты. Для этого в файле настроек проекта sonar-project.properties используются параметры включения и исключения.

Рассмотрим пример настройки файла свойств:


# Указываем маски файлов, которые ДОЛЖНЫ быть включены в анализ
sonar.inclusions=**/МояДоработка_*/**/*.bsl, **/МояДоработка_*.bsl

# Указываем маски файлов, которые нужно ИСКЛЮЧИТЬ из анализа (тяжелые файлы, макеты, справка)
sonar.exclusions=**/Help.xml, **/Template.xml, **/БиблиотекаСтандартныхПодсистем/**/*.*

Использование масок позволяет гибко управлять областью анализа. SonarScanner сам отсечет ненужные файлы еще на этапе чтения с диска, что значительно сократит потребление оперативной памяти сервером SonarQube и ускорит процесс проверки в разы.

Решение 4: Выборочная выгрузка объектов из Конфигуратора (Selective Export)

Если конфигурация огромная (например, ERP), то даже полная выгрузка всей структуры метаданных в файлы на сервере сборки может занимать до получаса. Чтобы избежать этих временных затрат, можно настроить выборочную выгрузку из 1С.

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


ОбщийМодуль.МояДоработка_Служебный
Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента

Запуск конфигуратора 1С с передачей этого списка позволяет выполнить экспорт только измененных объектов метаданных за считанные секунды. Полученные файлы помещаются в Git-репозиторий и уходят на анализ в SonarQube.

Решение 5: Фильтрация по подсистемам через Vanessa-Sonar

Для статического анализа решений на 1С часто применяется вспомогательная утилита Vanessa-Sonar. Она позволяет описывать правила группировки и фильтрации объектов через конфигурационный JSON-файл.

Вы можете настроить утилиту так, чтобы она анализировала только объекты, принадлежащие вашей кастомной подсистеме (например, подсистеме МояДоработка). Vanessa-Sonar сама отсканирует метаданные, отсечет все стандартные модули конфигурации и передаст в SonarScanner готовый отфильтрованный проект.

Решение 6: Анализ только измененных файлов через Git в CI/CD

В современных конвейерах непрерывной интеграции (GitLab CI, Jenkins, GitHub Actions) наиболее эффективным подходом является анализ "дельта-изменений". То есть проверяется только тот код, который разработчик изменил в рамках текущего коммита или Pull Request.

Алгоритм настройки выглядит следующим образом:

  1. Конфигурация синхронизируется с Git-репозиторием (например, с помощью утилиты gitsync или при использовании EDT).
  2. В процессе сборки (CI/CD pipeline) запускается shell-скрипт, который с помощью команды git diff получает список измененных файлов относительно целевой ветки (например, master или develop): git diff --name-only origin/master...HEAD | grep '\.bsl$' > changed_files.txt
  3. Полученный список файлов динамически преобразуется в строку через запятую и передается в параметр sonar.inclusions при запуске SonarScanner: sonar-scanner -Dsonar.inclusions=$(paste -sd, changed_files.txt)

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

← На главную