При внедрении статического анализа кода с помощью SonarQube в проектах на платформе 1С:Предприятие разработчики часто сталкиваются с техническими ограничениями. Типовые конфигурации (например, 1С:ERP, 1С:Комплексная автоматизация или 1С:Управление холдингом) содержат миллионы строк кода. Полный анализ такой конфигурации требует колоссальных ресурсов сервера, часто падает по ошибке нехватки памяти (OutOfMemory) и занимает часы времени, что совершенно неприемлемо для процессов CI/CD. К тому же, проверять типовой код вендора обычно нет практического смысла — фокус внимания команды сосредоточен исключительно на собственных доработках.
В этой статье мы подробно разберем, как решить проблему избыточного анализа. Мы изучим как простые скриптовые методы быстрой фильтрации файлов "на коленке", так и профессиональные подходы, используемые в современных DevOps-процессах 1С-разработки.
Рассмотрим ситуацию, когда конфигурация уже выгружена в файлы (например, стандартным способом "Выгрузить конфигурацию в файлы" через Конфигуратор или утилиту 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. Он указывает, что при первом же совпадении шаблона в файле поиск в нем прекращается, и возвращается только одна запись для этого файла. Это предотвращает многократное копирование одного и того же файла (исключает задвоение). Регулярное выражение Иванов\+\+ экранирует символы плюса, так как в регулярных выражениях плюс является спецсимволом.
Если вы используете официальный плагин SonarQube 1C (BSL) Community Plugin или непосредственно BSL Language Server, то у вас есть возможность задействовать встроенный штатный механизм игнорирования типового кода.
Анализатор умеет автоматически считывать статус поддержки объектов 1С (анализируя служебный файл метаданных ParentConfigurations.bin, который выгружается вместе с конфигурацией). Для включения этой функции в настройках анализа достаточно указать специальный параметр:
sonar.bsl.languageserver.skipSupportsonar.bsl.skipVendorSupportedObjects=trueПараметр sonar.bsl.languageserver.skipSupport поддерживает следующие ключевые настройки:
with support locked — анализатор полностью проигнорирует все модули и объекты, которые стоят на поддержке без возможности редактирования (то есть те, на которых отображается значок "замочка").with support — анализатор пропустит абсолютно все файлы, имеющие отношение к конфигурации поставщика, даже если для них в настройках поддержки разрешено редактирование с сохранением поддержки.Этот метод является наиболее предпочтительным, так как он не требует написания сторонних скриптов и работает автоматически "из коробки".
Вместо физического разделения и копирования файлов, мы можем заставить SonarScanner сканировать всю папку с исходным кодом, но анализировать только строго заданные объекты. Для этого в файле настроек проекта sonar-project.properties используются параметры включения и исключения.
Рассмотрим пример настройки файла свойств:
# Указываем маски файлов, которые ДОЛЖНЫ быть включены в анализ
sonar.inclusions=**/МояДоработка_*/**/*.bsl, **/МояДоработка_*.bsl
# Указываем маски файлов, которые нужно ИСКЛЮЧИТЬ из анализа (тяжелые файлы, макеты, справка)
sonar.exclusions=**/Help.xml, **/Template.xml, **/БиблиотекаСтандартныхПодсистем/**/*.*
Использование масок позволяет гибко управлять областью анализа. SonarScanner сам отсечет ненужные файлы еще на этапе чтения с диска, что значительно сократит потребление оперативной памяти сервером SonarQube и ускорит процесс проверки в разы.
Если конфигурация огромная (например, ERP), то даже полная выгрузка всей структуры метаданных в файлы на сервере сборки может занимать до получаса. Чтобы избежать этих временных затрат, можно настроить выборочную выгрузку из 1С.
Платформа 1С:Предприятие поддерживает выгрузку конкретных объектов через командную строку с помощью параметров запуска конфигуратора. Скрипты автоматизации на языке OneScript могут динамически формировать текстовый список только тех объектов, над которыми ведется активная работа в текущий момент времени. Например:
ОбщийМодуль.МояДоработка_Служебный
Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента
Запуск конфигуратора 1С с передачей этого списка позволяет выполнить экспорт только измененных объектов метаданных за считанные секунды. Полученные файлы помещаются в Git-репозиторий и уходят на анализ в SonarQube.
Для статического анализа решений на 1С часто применяется вспомогательная утилита Vanessa-Sonar. Она позволяет описывать правила группировки и фильтрации объектов через конфигурационный JSON-файл.
Вы можете настроить утилиту так, чтобы она анализировала только объекты, принадлежащие вашей кастомной подсистеме (например, подсистеме МояДоработка). Vanessa-Sonar сама отсканирует метаданные, отсечет все стандартные модули конфигурации и передаст в SonarScanner готовый отфильтрованный проект.
В современных конвейерах непрерывной интеграции (GitLab CI, Jenkins, GitHub Actions) наиболее эффективным подходом является анализ "дельта-изменений". То есть проверяется только тот код, который разработчик изменил в рамках текущего коммита или Pull Request.
Алгоритм настройки выглядит следующим образом:
gitsync или при использовании EDT).git diff получает список измененных файлов относительно целевой ветки (например, master или develop):
git diff --name-only origin/master...HEAD | grep '\.bsl$' > changed_files.txt
sonar.inclusions при запуске SonarScanner:
sonar-scanner -Dsonar.inclusions=$(paste -sd, changed_files.txt)
При таком подходе SonarQube проверяет только несколько измененных файлов bsl за считанные секунды, что позволяет программисту мгновенно получать обратную связь по качеству своего кода при каждом коммите.