При внедрении инструментов статического анализа кода, таких как SonarQube с плагином для 1С или АПК (Автоматизированная проверка конфигураций), разработчики часто сталкиваются с критическими замечаниями, которые на первый взгляд кажутся необоснованными. Рассмотрим две наиболее острые проблемы: ошибку CommonModuleInvalidType (недопустимый тип модуля) и превышение порога CognitiveComplexity (когнитивная сложность). Разберем по шагам, как привести код и метаданные в соответствие со стандартами, не потеряв при этом в читаемости и логике приложения.
Ситуация, когда модуль имеет корректное имя, например ОбщегоНазначенияКлиент, но анализатор выдает ошибку Общий модуль недопустимого типа, часто ставит в тупик. Выясним причину этого поведения. Анализаторы проверяют не только имя модуля, но и его свойства в дереве метаданных в сочетании с настройками всей конфигурации.
Проанализируем алгоритм решения этой проблемы, который был найден опытным путем. Проблема часто кроется в несоответствии флагов контекста (Клиент, Сервер, Внешнее соединение) и режимов запуска конфигурации. Рассмотрим шаги для исправления:
Клиент (обычное приложение)). Установим галочки так, чтобы модуль был доступен во всех клиентских контекстах, которые разрешены для всей базы в целом.Клиент, а в свойствах должен стоять флаг Клиент (управляемое приложение).Важно помнить: если вы используете свойство Глобальный, это накладывает дополнительные строгие ограничения. Современные стандарты 1С рекомендуют минимизировать использование глобальных модулей, так как они замедляют запуск системы. Проверьте, действительно ли вашему модулю необходимо быть глобальным.
Второе частое замечание SonarQube — высокая когнитивная сложность процедур и функций. В отличие от цикломатической сложности, которая просто считает количество ветвлений, когнитивная сложность оценивает, насколько трудно человеку понять логику кода. Порог в 15 баллов часто кажется заниженным для бизнес-логики 1С, но его соблюдение делает код значительно надежнее.
Рассмотрим, что именно увеличивает «вес» функции:
Если, цикл Для каждого или Пока добавляет баллы.Если находится внутри другого, его вес увеличивается прогрессивно (1 за само условие + 1 за уровень вложения).И, ИЛИ, НЕ внутри одного условия также повышают сложность, так как заставляют разработчика удерживать в памяти сразу несколько состояний.Самый эффективный способ снизить сложность, не прибегая к избыточному дроблению на мелкие функции, — это использование методики «раннего возврата». Проанализируем пример кода с высокой вложенностью:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если НЕ ОбменДанными.Загрузка Тогда
Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
Если ПроверитьЗаполнениеДокумента() Тогда
// Основная логика на 50 строк
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Такой код заставляет нас «входить» во вложенные блоки, увеличивая когнитивную нагрузку. Перепишем этот фрагмент, используя инверсию условий:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Если РежимЗаписи <> РежимЗаписиДокумента.Проведение Тогда
Возврат;
КонецЕсли;
Если НЕ ПроверитьЗаполнениеДокумента() Тогда
Возврат;
КонецЕсли;
// Основная логика (теперь она на верхнем уровне вложенности)
ВыполнитьОсновнуюЛогику();
КонецПроцедуры
В данном примере мы «выпрямили» код. Теперь каждое условие проверяет негативный сценарий и завершает выполнение процедуры. Когнитивная сложность такой структуры значительно ниже, хотя логика осталась прежней.
Существует проблема «избыточного дробления», когда для понимания одной операции приходится проваливаться на 5-10 уровней вложенности функций. Это также считается плохой практикой. Рассмотрим принципы правильной декомпозиции:
РассчитатьСкидку(), в ней не должно быть кода, меняющего ответственного в документе. Несоответствие названия содержанию — главный враг читаемости при низкой когнитивной сложности.Выясним, стоит ли менять настройки SonarQube под реалии 1С. Для типовых конфигураций (например, ERP или УТ), где бизнес-логика объективно сложна, допустимо поднять порог когнитивной сложности до 20-25. Однако стремиться к стандартным 15 баллам — это отличный способ научиться писать «плоский» и понятный код, который будет легко поддерживать вашим коллегам.
Таким образом, решение проблем с проверками кода в 1С требует комплексного подхода: правильной настройки метаданных (флаги контекста в общих модулях) и качественного рефакторинга алгоритмов с использованием инверсии условий и грамотной декомпозиции.