Запустил SonarQube, спасибо Олег Тымко и его статье https://infostart.ru/1c/articles/1089670/ Все сработало, все показало. Но два момента не могу даже понять.
1. Критическая ошибка Общий модуль недопустимого типа (CommonModuleInvalidType). Модуля два: серверный и клиентский, ругается на оба. Как надо оформить модуль, чтобы ругаться перестало? На ИТС прочитал, все вроде так, но тем не менее "Недопустимый тип". Как-то напрягает.
2. Когнитивная сложность (CognitiveComplexity). Это не ошибка, а Дефект кода, но так же критический.
Уменьшите когнитивную сложность "ПередЗаписью" с 64 до 15. Это она хочет чтобы я одну процедуру разбил на кучу мелких? Да, там много проверок, но если их тупо дробить, то лучше не станет, как мне кажется. С этим вообще кто-то заморачивается или забивает? В типовых очень любят дробить. Пока до сути доберешься, вспотеешь. Или так и надо?
2 вопрос - это так, недоумение. А вот 1 реально напрягает.
Может кто чего подскажет умного.
Со вторым вопросом реальный напряг. Ладно бы он ругался на сложные вложенные условия. Но он же тупо ругается даже на количество последовательных "Если..."
Реально есть люди, для которых сложно понять 15 последовательных одиночных Если?
Причем, по нормальным правилам записи объекта через Попытку и проверку активности транзакции - уже тратится порядка 4-х пунктов "когнитивной сложности". И как теперь записывать объекты?
Это какая-то паранойя.
Это все ведь вроде настраивается. Можете увеличить когнитивную сложность
Выделять нужные действия в разные функции это норм. Так легче читать, и понимать что делает та или иная процедура.
(3) Да, согласен, надо и верно выделять куски кода в отдельные процедуры, сам за это ратую!
Но как доказать что-то заказчику, который твой код прогоняет через Сонар и не принимает работу из-за "когнитивная сложность > 15"?
Народ, не дайте зачахнуть.
Общий модуль недопустимого типа. Так ругается и Сонар и АПК.
Как сделать общий модуль допустимого типа? Модуль клиентский. Обозвал его "канонически" ОбщегоНазначенияГлобальный. Внутри ОДНА процедура и все. Оно все работает, а вот проверку не проходит. Куда копать?
(10) Из ИТС Пример наименования модуля ОбщегоНазначенияКлиент (или ОбщегоНазначенияГлобальный)
Делал Общие.ОбщиеМодули.ОбщегоНазначенияКлиентГлобальный, пофиг. Та же ошибка: Общий модуль недопустимого типа. Т.е. дело не в названии, судя по всему. А вот в чем, не догоняю :-(
(6) Сонар считает, что предел 15. Каждое условие (включая И или ИЛИ) прибавляет +1. Цикл аналогично. Каждый вложенное условие прибавляет +2. Максимальный уровень вложенности - 4.
Если в итоге больше 15, то типа это плохо. Дефект когда, причем критический.
(14) Правила проработал самым тщательным образом. Но так и не догнал, почему мои общие модули не проходят проверку. Ни клиентский, ни серверный. Как еще определяется тип, кроме как галочками. Галочки стоят.
По когнитивной сложности скажу лишь, что идеальная функция это 3-5 строк. Она понимается почти мгновенно.
Но с большим числом вызовов тоже есть засада. Во первых, их будет чуть меньше чем тех самых одиночных "Если". Во-вторых, мало кто утруждает себя придумыванием осмысленных названий соответствующих содержимому.
Проблема сонара и вообще всех автоматических статических анализаторов кода, что они пока не могут адекватно оценить когнитивную сложность при использовании неудачных наименований вызываемых функций.
Сложность где "сложно добраться до сути" тоже не всегда сложна. Бывает там 3-5 вызовов, необходимых для проброса с клиента, до системного модуля. Непривычно тут бывает только семерочникам, и тем кто пишет функции на клиенте в 2к+ строк. Случаи неоправданного усложнения встречаются, но частенько "неоправданность" это "нашей компании это не нужно, зачем это в тиражной типовой?".
(15) Наверно не соглашусь про идеальную функцию. Понимается мгновенно? Так кода не видно. Т.е. что должно делаться видно, а вот что реально делается, надо проваливаться, проваливаться и проваливаться.
(18) Название соответствует действию. Но действие делается неверно. И вот тут-то и начинается танец с бубном. Потому как реально выполняемый код появляется на третьем, а то и четвертом уровне вложения. А все выше правильно названные функции. Когнитивная сложность низкая, все хорошо, но искать ошибку вдруг оказывается очень тяжело. Сам с таким сталкивался.
(19) А в чем сложность? В незнании архитектуры решения? Так это до первого раза. Потом наоборот уже станет ясно, где локализована ошибка. "Проваливание" ведь не в пустоту идет, а в модуль который выполняет какой-то специфический расчет или иные действия. Вот туда и надо идти в первую голову, если проблема есть.
(20) В принципе да. Зная архитектуру решения, все наверно проще. Но по той же типовой бух от 1С есть документация разработчика? И тогда ситуация несколько иная. В процедуре 3 строки, в каждой функция. проваливаешься в qeyrwb.? а там тоже три строки из функций, проваливаешься дальше, а там тоже только вызов функций. И все названы красиво и правильно, но до кода добраться - это небольшой квест. А с учетом того что функций сотни, однозначно определить визуально без "проваливания", что надо именно тут смотреть, несколько затруднительно. Хотя конечно сваливать весь код в одну функцию тоже неправильно, но и выделять одно условие в функцию, которая существует только локально - тоже наверно перебор.
Но этот вопрос как-то больше технологический.
Может уважаемый Артано подскажет, что у меня не так с общими модулями? Стоит одна галка "Клиент", внутри буквально три функции. И Сонар и АПК дают "Общий модуль недопустимого типа". Уже всю голову сломал.
(21) Здесь вопрос в методике поиска. Сначала чтением логов или глазами в отладчике ошибка локализуется, а потом, зная где она может воспроизвестись, или хотя бы зная например свойство объекта, которое должно поменяться, можно легко зайти в нужную функцию.
по сабжу топика. Галки должно быть две (обычное и управляемое приложение). В названии модуля должно быть слов Клиент (например ОбщегоНазначенияИмениНуралиеваБорисаГеоргиевичаКлиент). Может быть еще директивы компиляции проверяются внутри модуля. Но чтобы сказать точно лучше найти в справочнике того же АПК эту проверку и посмотреть код проверки.
(22) Согласен. Когда ошибка локализована, уже есть от чего оттолкнуться. Хуже, когда ошибки не идентифицируется, просто неправильно считает. Вот тогда можно потанцевать с бубном от души.
Блин. Про заглянуть в код в АПК я даже не подумал :-). Спасибо за наводку. По коду уж соображу что ей не нравится.
(22) Спасибо Артано. Залез в код и расковырял ошибку "Недопустимый тип". Надо переключить в Параметрах Управляемое и обычное приложение. И появятся галочки, которые не видны в режиме Управляемое приложение. Проставить галочки напротив Обычное приложение, потом можно переключится обратно и проверки проходят. С учетом того, что у меня нет форм для обычного приложение и работает исключительно в режиме управляемого, то как-то смахивает на бред. Но ... мучавший меня вопрос наконец-то решился.