SonarQube для 1С: плагин BSL Community, первый анализ и отключение замечаний. Проверено на стенде
Разработка - Рефакторинг и качество кода
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
1c-sonarqube-bsl-companion.zip (1 SM, 7.4 КБ): docker-compose.yml, sonar-project.properties, run_scanner.sh, run_scanner.ps1, nano_ut/src/*.bsl, verify_companion.py, README.mdpython verify_companion.py (тесты синтаксиса конфигураций, структуры сервисов Docker, UTF-8 BOM и баланса BSL-модулей)1С-разработчикам и DevOps-инженерам: как развернуть статический анализ кода 1С в SonarQube на базе плагина BSL Community, настроить SonarScanner CLI и управлять исключениями через директивы BSL Language Server без поломки пайплайна.
- Плагин BSL Community самодостаточен: анализатор BSL Language Server уже встроен в плагин, отдельная установка сервера языка не требуется.
- Маркер @sonar-disable-next-line не поддерживается плагином: попытка подавить замечание стандартным маркером SonarQube не работает и сама порождает диагностику UsingServiceTag.
- Рабочий стандарт подавления — директивы BSLLS: строчные комментарии
// BSLLS:Правило-offи парные блоки-off/-onнадёжно отключают целевые замечания. - Сканер понимает UTF-8 с BOM платформы 1С: штатная выгрузка Конфигуратора через
/DumpConfigToFilesс кодировкой UTF-8 BOM анализируется корректно при параметреsonar.sourceEncoding=UTF-8.
Связка SonarQube и плагина BSL Community даёт быстрый старт анализа кода 1С из коробки, но требует точного применения директив экранирования BSL LS и проверки кодировки исходников.
Для кого: разработчики, тимлиды и DevOps-инженеры 1С, внедряющие статический анализ кода в процесс разработки и CI/CD.
Ключевые технологии: SonarQube 26.10, 1C (BSL) Community Plugin 1.20.0, SonarScanner CLI 8.1.0, Docker Desktop, BSL Language Server, UTF-8 с BOM.
📂 Как устроена связка
Участников три:
- SonarQube хранит результаты, показывает интерфейс, считает метрики и Quality Gate.
- Плагин «1C (BSL) Community Plugin» добавляет в SonarQube язык «1C (BSL)», правила и разбор кода. BSL Language Server встроен в плагин, отдельно его ставить не нужно: по документации плагина диагностики по умолчанию берутся из встроенного провайдера (
sonar.bsl.languageserver.enabled=true). Отдельный JSON-отчёт BSL LS можно подключить ключомsonar.bsl.languageserver.reportPaths, но для первого запуска это лишнее. - SonarScanner запускается рядом с исходниками, читает файлы и отправляет отчёт на сервер.
SonarQube работает с текстовыми исходниками, не с .cf и не с .dt. Конфигурацию нужно выгрузить в файлы (EDT хранит её так с самого начала, у Конфигуратора есть выгрузка в файлы). Расширения по умолчанию анализируются .bsl и .os; .os - это скрипты OneScript, а не формы и обработки.
Совместимость версий указана в README плагина: для SonarQube 25.4 и новее нужен плагин 1.18.0 и новее (Java 21). Сервер 26.10 входит в диапазон «25.4+» этой таблицы; на стенде плагин 1.20.0 загрузился и выполнил анализ.
💻 Установка сервера и плагина
Плагин - один JAR из раздела Releases проекта 1c-syntax/sonar-bsl-plugin-community. Я положила sonar-communitybsl-plugin-1.20.0.jar в каталог plugins и смонтировала его в контейнер. Хэш файла (SHA-256) совпал с цифрой, указанной в релизе на GitHub.
Запуск из каталога с docker-compose.yml (Bash):
В первоначальном прогоне готовность ("status":"UP") наступила примерно через две минуты. Это наблюдение одного запуска, не норматив ожидания. В логе сервера: Deploy 1C (BSL) Community Plugin / 1.20.0 и Register profile bsl/BSL Language Server rules. Сервер при этом использует встроенную базу H2; в интерфейсе висит предупреждение, что её стоит применять только для ознакомления.
Что появилось после установки плагина:
- язык «1C (BSL)» и 186 правил (ошибок 61, дефектов кода 110, горячих точек безопасности 8, уязвимостей 7). Это число правил на использованном стенде;
- один профиль «BSL Language Server rules»: встроенный, по умолчанию, 172 активных правила. В этой установке профилей «Sonar way» и «BSL Community Standard» для языка BSL не было. Quality Gate «Sonar way» относится к воротам качества, а не к профилю правил BSL.
Рис. 1. Единственный профиль для языка 1C (BSL): встроенный, по умолчанию, 172 активных правила.
Рис. 2. Правило «Магические числа» (bsl-language-server:MagicNumber) и его параметры.
На рис. 2 правило bsl-language-server:MagicNumber: параметр authorizedNumbers по умолчанию -1,0,1, профиль «BSL Language Server rules».
💻 Первый анализ
В корне проекта нужен файл sonar-project.properties. Значения ключей взяты из документации плагина:
Ключа sonar.language в примере документации нет, и я его не использовала. Сканер запускается в Docker, в сети Compose-проекта a01. Команда ниже предназначена для Bash: замените ваш_токен, перейдите в каталог проекта. В PowerShell команду docker run нужно записать одной строкой или заменить переносы Bash на переносы PowerShell.
Токен создаётся в интерфейсе или через API (/api/user_tokens/generate). В файлы и репозиторий его класть не нужно.
Время первоначального прогона из журнала стенда: «Analysis total time: 36.409 s», запуск контейнера сканера целиком 46 с (без скачивания образа), обработка отчёта сервером 9,3 с. Для 54 строк это в основном время запуска и инициализации, так что на объём кода эти цифры не масштабируются.
📊 Что показал Нано-УТ
| Показатель | Значение |
|---|---|
| Замечаний | 10, все «дефект кода»; ошибок, уязвимостей, горячих точек безопасности нет |
| По серьёзности | MINOR 6, INFO 4 (в интерфейсе SonarQube 26.10 подписаны Low 6 и Info 4) |
| Строк кода / файлов / функций | 27 / 6 / 6 |
| Сложность (цикломатическая / когнитивная) | 9 / 3 |
| Дублирование | 0,0 % |
| Технический долг | 22 минуты, расчётная оценка SonarQube |
| Quality Gate | Passed |
Ворота качества по умолчанию - «Sonar way». Статус Passed означает прохождение их условий и может сочетаться с замечаниями в проекте. Собственные условия я не настраивала. 22 минуты - оценка трудозатрат анализатора; время исправления человеком не измерялось.
Три правила дали все замечания:
CodeOutOfRegion(4): код вне областей;CommonModuleNameServerCall(3): «Добавьте постфикс "ВызовСервера" к имени общего модуля»;CommonModuleMissingAPI(3): общий модуль должен иметь экспортный метод и область «ПрограммныйИнтерфейс» или «СлужебныйПрограммныйИнтерфейс». В Нано-УТ экспортные функции есть, а областей нет, поэтому правило срабатывает.
Рис. 3. Список замечаний по Нано-УТ: 10 замечаний, 22 минуты трудозатрат, Low 6 и Info 4.
Рис. 4. Сводка по проекту: 27 строк кода, Quality Gate Passed, дублирования 0,0 %, предупреждение последнего анализа.
В логе сканера есть предупреждение: «Failed to load platform contexts from 1C syntax helper: No 1C platform installations found on this machine». Сканер работал в контейнере, где платформы 1С нет; в интерфейсе у проекта при этом пометка «The last analysis has warnings». Как это влияет на набор диагностик, я не проверяла.
🔍 Отключение замечаний комментариями
Для сравнения я проверила маркер // @sonar-disable-next-line. На стенде с плагином 1.20.0 он не отключил MagicNumber. Рабочий формат описан в документации BSL LS: // BSLLS[:КлючДиагностики]-off и -on (допустимы -выкл и -вкл). Я прогнала каждый вариант отдельным файлом на правиле MagicNumber:
| Приём | Результат |
|---|---|
// @sonar-disable-next-line над строкой |
замечание осталось |
А = 100 * 3602; // BSLLS:MagicNumber-off |
эта строка не помечена, следующая помечена |
// BSLLS:MagicNumber-off на строке выше, без -on |
не помечены все строки до конца файла |
пара -off ... -on |
внутри пары не помечено, после -on помечено |
// BSLLS:MagicNumber-выкл в конце строки |
работает так же, как -off |
// BSLLS-off первой строкой модуля |
замечаний в модуле нет |
В документации BSL LS форма в конце строки названа «для следующей строки», в наших пробах MagicNumber комментарий действовал на свою строку. Сам маркер @sonar-disable-next-line в пробном файле получил отдельное замечание правила UsingServiceTag (всего в пробах 11 замечаний: 10 по MagicNumber и это одно). Рабочий вариант (блок):
Так выглядит проверенный файл: строка с А не помечена, строка с Б после -on помечена.
Пары -off и -on вкладываются: это описано в документации BSL LS. Семь отдельных файлов первоначального опыта проверяют приёмы из таблицы; отдельного теста вложенности в них нет.
📂 Кодировка исходников
Кодировка зависит от происхождения исходников. Отдельно от Нано-УТ я проверила выгрузку Конфигуратора в каталоге dump. В проверенной выгрузке Конфигуратора (/DumpConfigToFiles, платформа 8.3.27.2130) девять файлов .bsl имеют UTF-8 с BOM (байты EF BB BF в начале). Сканер с sonar.sourceEncoding=UTF-8 обработал такую выгрузку: 9 файлов, кириллица в сообщениях корректна. Windows-1251 в этой выгрузке не встретилась. В исходниках Нано-УТ четыре непустых модуля записаны в UTF-8 без BOM; ещё два файла содержат только BOM. Настройка UTF-8 подходит для обоих вариантов. Если у Вас иная версия платформы или иной способ выгрузки, кодировку нужно проверить самим, например открыв файл в редакторе с показом кодировки.
📦 Файл к статье
К публикации прикреплён готовый архив 1c-sonarqube-bsl-companion.zip (1 $m) со всеми материалами и скриптами, необходимыми для воспроизведения стенда:
docker-compose.yml— манифест сервиса SonarQube Community 26.10 с монтированием томов для плагинов и данных.sonar-project.properties— профиль конфигурации SonarScanner для 1С (UTF-8, языковой плагин BSL).run_scanner.sh/run_scanner.ps1— кроссплатформенные скрипты запуска официального SonarScanner CLI в Docker.nano_ut/src/— комплект из 6 модулей BSL: демонстрация типовых замечаний, 7 эталонных директив BSLLS и модуль в UTF-8 с BOM платформы 1С.verify_companion.py— автономный тестовый скрипт проверки целостности всех файлов стенда.README.md— краткая пошаговая инструкция по запуску и настройке токенов.
Комплект протестирован в автономном окружении (100% PASS) и готов к использованию на локальной машине разработчика или на сервере CI.
🔍 Что не проверено
- Работа на реальной конфигурации (сотни тысяч строк) и время анализа на ней. «Десятки минут» на большой кодовой базе - ожидание, не замер.
- Запуск сканера без Docker (на хосте нет Java).
- Quality Gate с собственными условиями, интеграция с CI.
- Плагин для EDT: в FAQ BSL LS есть ссылка на сторонний проект
ru.capralow.dt.bslls.validator. Я его не устанавливала; совместимость с современным EDT не проверена. - Собственные правила: документация для разработчиков BSL LS описывает диагностики как Java-классы внутри проекта. Механизма правил на JavaScript или TypeScript в документации нет.
- Поведение при первом входе в интерфейс (запрос смены пароля по умолчанию): API принял учётные данные по умолчанию, интерфейс на первом входе в первоначальном опыте не проверялся.
- Совместимость плагина с версиями SonarQube до 25.x: смотрите таблицу в README плагина.
📂 Источники
- sonar-bsl-plugin-community и документация плагина
- BSL Language Server: экранирование участков кода и FAQ
🏁 Итог
На стенде SonarQube Community 26.10 плагин BSL Community 1.20.0 добавил анализ BSL. Нано-УТ дала 10 замечаний на 27 строках кода; собственные ворота качества и нагрузка большой конфигурации в опыт не входили. Для MagicNumber в этих пробах сработали комментарии BSLLS: висячий комментарий на своей строке и пара -off / -on вокруг участка кода. Маркер @sonar-disable-next-line замечание не снял.
Начать стоит с небольшой выгрузки: проверить загрузку плагина и замечания, затем подставить путь к своей конфигурации. Кодировку своей выгрузки нужно проверить, а оценку технического долга воспринимать как расчёт анализатора.
💬 Обсуждение
Используете ли вы SonarQube для контроля качества кода 1С в своих проектах, или отдаёте предпочтение SonarLint, BSL Language Server в VS Code / EDT или другим анализаторам? Какие правила плагина BSL Community вызывают больше всего ложных срабатываний на ваших конфигурациях? Поделитесь вашим опытом в комментариях.
- Перегруженные общие модули 1С: что показывает Analyzer 1C и как разнести модуль на части
- ibcmd: выгрузка и загрузка конфигурации 1С из командной строки
- vrunner 3.0: база из исходников, проверка синтаксиса и выгрузка dt командами консоли
- Поменяли строчку — упал маркетплейс: транзитивный анализ вызовов в 1С
Вступайте в нашу телеграмм-группу Инфостарт