SonarQube. Как писать код 1С?

1. serg33rus 28 17.01.21 13:58 Сейчас в теме
Запустил SonarQube, спасибо Олег Тымко и его статье https://infostart.ru/1c/articles/1089670/
Все сработало, все показало. Но два момента не могу даже понять.
1. Критическая ошибка Общий модуль недопустимого типа (CommonModuleInvalidType). Модуля два: серверный и клиентский, ругается на оба. Как надо оформить модуль, чтобы ругаться перестало? На ИТС прочитал, все вроде так, но тем не менее "Недопустимый тип". Как-то напрягает.
2. Когнитивная сложность (CognitiveComplexity). Это не ошибка, а Дефект кода, но так же критический.
Уменьшите когнитивную сложность "ПередЗаписью" с 64 до 15. Это она хочет чтобы я одну процедуру разбил на кучу мелких? Да, там много проверок, но если их тупо дробить, то лучше не станет, как мне кажется. С этим вообще кто-то заморачивается или забивает? В типовых очень любят дробить. Пока до сути доберешься, вспотеешь. Или так и надо?

2 вопрос - это так, недоумение. А вот 1 реально напрягает.
Может кто чего подскажет умного.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. FatPanzer 17.01.21 14:06 Сейчас в теме
Со вторым вопросом реальный напряг. Ладно бы он ругался на сложные вложенные условия. Но он же тупо ругается даже на количество последовательных "Если..."
Реально есть люди, для которых сложно понять 15 последовательных одиночных Если?
Причем, по нормальным правилам записи объекта через Попытку и проверку активности транзакции - уже тратится порядка 4-х пунктов "когнитивной сложности". И как теперь записывать объекты?
Это какая-то паранойя.
3. platonov.e 159 17.01.21 14:40 Сейчас в теме
Это все ведь вроде настраивается. Можете увеличить когнитивную сложность
Выделять нужные действия в разные функции это норм. Так легче читать, и понимать что делает та или иная процедура.
4. FatPanzer 17.01.21 14:44 Сейчас в теме
(3) Да, согласен, надо и верно выделять куски кода в отдельные процедуры, сам за это ратую!
Но как доказать что-то заказчику, который твой код прогоняет через Сонар и не принимает работу из-за "когнитивная сложность > 15"?
user1503726; +1 Ответить
5. serg33rus 28 17.01.21 14:57 Сейчас в теме
Народ, не дайте зачахнуть.
Общий модуль недопустимого типа. Так ругается и Сонар и АПК.
Как сделать общий модуль допустимого типа? Модуль клиентский. Обозвал его "канонически" ОбщегоНазначенияГлобальный. Внутри ОДНА процедура и все. Оно все работает, а вот проверку не проходит. Куда копать?
8. FatPanzer 17.01.21 15:23 Сейчас в теме
(5) Так вы так и не рассказали - какие галочки у вас стоят и какие директивы препроцессора используются в коде модулей. А догадываться мы не умеем.
9. serg33rus 28 17.01.21 15:53 Сейчас в теме
(8) Галочка Клиент и Глобальный. Директив нет никаких. Пробовал Глобальный снимать, не помогает.
10. FatPanzer 17.01.21 15:56 Сейчас в теме
(9) Где тогда слово Клиент в наименовании модуля? Кто-то утверждал, что все сделано согласно рекомендаций ИТС...
12. serg33rus 28 17.01.21 16:03 Сейчас в теме
(10) Из ИТС Пример наименования модуля ОбщегоНазначенияКлиент (или ОбщегоНазначенияГлобальный)
Делал Общие.ОбщиеМодули.ОбщегоНазначенияКлиентГлобальный, пофиг. Та же ошибка: Общий модуль недопустимого типа. Т.е. дело не в названии, судя по всему. А вот в чем, не догоняю :-(
13. Sakhatyr_Vitaliy 17.01.21 23:00 Сейчас в теме
6. user1503726 17.01.21 15:00 Сейчас в теме
Простите, а какова когнитивная сложность модуля расходной накладной в ут 11.4? Так чтобы понимать примерно каков эталон...
7. FatPanzer 17.01.21 15:20 Сейчас в теме
(6) Когнитивная сложность оценивается не у модулей, а у отдельных процедур и функций.
user1503726; +1 Ответить
11. serg33rus 28 17.01.21 15:58 Сейчас в теме
(6) Сонар считает, что предел 15. Каждое условие (включая И или ИЛИ) прибавляет +1. Цикл аналогично. Каждый вложенное условие прибавляет +2. Максимальный уровень вложенности - 4.
Если в итоге больше 15, то типа это плохо. Дефект когда, причем критический.
user1503726; +1 Ответить
14. Sakhatyr_Vitaliy 17.01.21 23:07 Сейчас в теме
16. serg33rus 28 18.01.21 09:46 Сейчас в теме
(14) Правила проработал самым тщательным образом. Но так и не догнал, почему мои общие модули не проходят проверку. Ни клиентский, ни серверный. Как еще определяется тип, кроме как галочками. Галочки стоят.
15. Артано 764 18.01.21 04:49 Сейчас в теме
По когнитивной сложности скажу лишь, что идеальная функция это 3-5 строк. Она понимается почти мгновенно.

Но с большим числом вызовов тоже есть засада. Во первых, их будет чуть меньше чем тех самых одиночных "Если". Во-вторых, мало кто утруждает себя придумыванием осмысленных названий соответствующих содержимому.
Проблема сонара и вообще всех автоматических статических анализаторов кода, что они пока не могут адекватно оценить когнитивную сложность при использовании неудачных наименований вызываемых функций.

Сложность где "сложно добраться до сути" тоже не всегда сложна. Бывает там 3-5 вызовов, необходимых для проброса с клиента, до системного модуля. Непривычно тут бывает только семерочникам, и тем кто пишет функции на клиенте в 2к+ строк. Случаи неоправданного усложнения встречаются, но частенько "неоправданность" это "нашей компании это не нужно, зачем это в тиражной типовой?".
17. serg33rus 28 18.01.21 09:51 Сейчас в теме
(15) Наверно не соглашусь про идеальную функцию. Понимается мгновенно? Так кода не видно. Т.е. что должно делаться видно, а вот что реально делается, надо проваливаться, проваливаться и проваливаться.
NataliaZh; +1 Ответить
18. Артано 764 18.01.21 11:12 Сейчас в теме
(17) Если надо "проваливаться", то значит это плохая функция. Либо название не соответствует действию, либо действие не соответствует названию.
19. serg33rus 28 18.01.21 18:57 Сейчас в теме
(18) Название соответствует действию. Но действие делается неверно. И вот тут-то и начинается танец с бубном. Потому как реально выполняемый код появляется на третьем, а то и четвертом уровне вложения. А все выше правильно названные функции. Когнитивная сложность низкая, все хорошо, но искать ошибку вдруг оказывается очень тяжело. Сам с таким сталкивался.
NataliaZh; FatPanzer; +2 Ответить
20. Артано 764 19.01.21 06:03 Сейчас в теме
(19) А в чем сложность? В незнании архитектуры решения? Так это до первого раза. Потом наоборот уже станет ясно, где локализована ошибка. "Проваливание" ведь не в пустоту идет, а в модуль который выполняет какой-то специфический расчет или иные действия. Вот туда и надо идти в первую голову, если проблема есть.
21. serg33rus 28 19.01.21 10:43 Сейчас в теме
(20) В принципе да. Зная архитектуру решения, все наверно проще. Но по той же типовой бух от 1С есть документация разработчика? И тогда ситуация несколько иная. В процедуре 3 строки, в каждой функция. проваливаешься в qeyrwb.? а там тоже три строки из функций, проваливаешься дальше, а там тоже только вызов функций. И все названы красиво и правильно, но до кода добраться - это небольшой квест. А с учетом того что функций сотни, однозначно определить визуально без "проваливания", что надо именно тут смотреть, несколько затруднительно. Хотя конечно сваливать весь код в одну функцию тоже неправильно, но и выделять одно условие в функцию, которая существует только локально - тоже наверно перебор.
Но этот вопрос как-то больше технологический.
Может уважаемый Артано подскажет, что у меня не так с общими модулями? Стоит одна галка "Клиент", внутри буквально три функции. И Сонар и АПК дают "Общий модуль недопустимого типа". Уже всю голову сломал.
22. Артано 764 19.01.21 11:10 Сейчас в теме
(21) Здесь вопрос в методике поиска. Сначала чтением логов или глазами в отладчике ошибка локализуется, а потом, зная где она может воспроизвестись, или хотя бы зная например свойство объекта, которое должно поменяться, можно легко зайти в нужную функцию.

по сабжу топика. Галки должно быть две (обычное и управляемое приложение). В названии модуля должно быть слов Клиент (например ОбщегоНазначенияИмениНуралиеваБорисаГеоргиевичаКлиент). Может быть еще директивы компиляции проверяются внутри модуля. Но чтобы сказать точно лучше найти в справочнике того же АПК эту проверку и посмотреть код проверки.
zyama; serg33rus; +2 Ответить
23. serg33rus 28 19.01.21 15:13 Сейчас в теме
(22) Согласен. Когда ошибка локализована, уже есть от чего оттолкнуться. Хуже, когда ошибки не идентифицируется, просто неправильно считает. Вот тогда можно потанцевать с бубном от души.

Блин. Про заглянуть в код в АПК я даже не подумал :-). Спасибо за наводку. По коду уж соображу что ей не нравится.
24. serg33rus 28 20.01.21 12:17 Сейчас в теме
(22) Спасибо Артано. Залез в код и расковырял ошибку "Недопустимый тип". Надо переключить в Параметрах Управляемое и обычное приложение. И появятся галочки, которые не видны в режиме Управляемое приложение. Проставить галочки напротив Обычное приложение, потом можно переключится обратно и проверки проходят. С учетом того, что у меня нет форм для обычного приложение и работает исключительно в режиме управляемого, то как-то смахивает на бред. Но ... мучавший меня вопрос наконец-то решился.
improg; zyama; Jekka84; bigma; +4 Ответить
25. improg 667 03.01.24 20:58 Сейчас в теме
(24) Спасибо помогло была такая же ситуация.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот