В справочнике дополнительных отчётов и обработок любой базы, которая живёт больше трёх лет, лежит два-три десятка файлов. Часть писали вы, часть предыдущий разработчик, часть прислал подрядчик. Все они запускаются с правами пользователя, пишут документы, ходят по HTTP, и код в них никто не открывал.
Обработка читает исходники других внешних обработок и отчётов и отвечает на два вопроса: с какой из них начинать смотреть и что именно в ней смотреть. На выходе HTML-отчёт: индекс качества от 0 до 100, светофор, оценка технического долга и список находок с номером строки, фрагментом кода и подсветкой синтаксиса.
Весь анализ идёт внутри 1С
Обработка написана на чистом BSL. Ни интернета, ни внешних компонент, ни Java, ни Python, ни отдельного сервиса рядом. Ничего не устанавливается, ничего не настраивается, никуда не отправляется: скачали файл, открыли в базе, нажали кнопку.
Практическое следствие важнее самого факта. Анализируемый код не покидает машину, на которой вы работаете, поэтому инструмент применим там, где облачный анализатор применить нельзя: обработка подрядчика, купленный на площадке файл, наследство от прошлой команды. Согласовывать со службой безопасности нечего, наружу не уходит ни строки.
Два режима
Одиночный файл
Указали путь к .epf или .erf - получили отчёт по нему. Основной сценарий приёмки чужой работы: подрядчик прислал обработку, надо понять за десять минут, можно ли это ставить в продуктив.
Пакетный анализ
Источником может быть каталог на диске либо справочник "Дополнительные отчёты и обработки" текущей базы. Инструмент разбирает всё подряд, показывает прогресс с именем текущей обработки и строит сводный рейтинг по индексу качества, худшие сверху.
Это и есть ответ на вопрос "с чего начинать", которого нет у анализаторов, работающих по одному файлу. Двадцать обработок в базе, три из них красные - начинать с них, про остальные семнадцать можно спокойно не думать.
Кнопка "Остановить" прерывает прогон в любой момент: уже разобранное остаётся в результатах и никуда не пропадает.
Внешние отчёты разбираются отдельно
У внешнего отчёта главный запрос живёт не в модуле, а в схеме компоновки данных, и анализ одних модулей по такому файлу молчит. Поэтому для отчётов есть отдельная кнопка "Разобрать отчёт": схема выгружается, тексты запросов наборов данных проверяются своими правилами, результат приходит отдельным HTML по схемам. Кнопка работает по одному файлу.
Что в отчёте
Индекс качества, 0-100, и светофор
Считается по взвешенной плотности находок на тысячу строк кода, шкала логарифмическая. Плотность нужна, чтобы модуль на двадцать тысяч строк с пятью замечаниями не выглядел хуже, чем модуль на двести строк с тремя.
| Светофор | Индекс | Смысл |
|---|---|---|
| Зелёный | 80-100 | замечаний мало или нет |
| Жёлтый | 50-79 | есть что посмотреть |
| Красный | 0-49 | требует внимания |
Поверх плотности стоят два жёстких потолка, и они важнее арифметики: хотя бы один блокирующий дефект - индекс не поднимется выше 49 и светофор красный всегда; хотя бы один критичный - потолок 79, зелёным не станет. Иначе захардкоженный пароль в модуле на двадцать тысяч строк дал бы зелёный светофор.
Технический долг
Сумма нормативных трудозатрат на исправление всех находок. В сводной таблице показан в минутах, в карточке отдельной обработки в часах. Это не обещание уложиться, а порядок величины для планирования: с такой цифрой можно идти к руководителю и просить время.
Три бейджа вместо пяти уровней
| Бейдж | Что делать |
|---|---|
| Критично | переделать: утечка секрета, транзакция без отката, запрос в цикле |
| Не критично | можно оставить: косметика и мелкие несоответствия |
| На проверку | правило не уверено, посмотрите глазами |
Третий бейдж честнее всего. "На проверку" означает не "мелочь", а "я не знаю": например, запрос в цикле, где число итераций определить не удалось. На десятке записей это норма, на десятках тысяч беда, и решить может только человек.
Метрики по каждой процедуре
Отдельной таблицей: строки кода, цикломатическая сложность, глубина вложенности и номер строки, с которой процедура начинается. Отсортировано по сложности, сверху то, что тяжелее всего читать и менять. Строками кода считаются только значимые строки внутри тел процедур: пустые, комментарии и код вне процедур не учитываются, и по этому же числу считается индекс.
Находки с кодом, а не со ссылками на номера строк
Каждая находка показана фрагментом исходника с подсветкой синтаксиса как в конфигураторе, проблемная строка выделена. Под фрагментом три блока: комментарий анализатора одной строкой, "Почему это проблема" и "Как исправить" с примером было / стало. Не приходится открывать обработку в конфигураторе, чтобы понять, о чём речь.
Что именно проверяется
Правил двадцать одно по модулям и семь по схемам компоновки. Число небольшое и названо честно: у больших анализаторов их сотни. Каждое из этих правил отобрано по одному критерию - частота на живом коде и отсутствие ложных срабатываний.
Как устроен движок под этими правилами, откуда берутся веса и почему часть правил помечена как сломанные - разобрано в статье Код внешних обработок не читал никто, мой в том числе.
Производительность, 7 правил
- запрос к СУБД внутри цикла;
ПолучитьОбъект()илиЗаписать()внутри цикла;- точечное чтение из СУБД внутри цикла:
НайтиПоКоду,СрезПоследнихи родня; Выбрать()без отбора, то есть чтение всей таблицы;- накопление строки конкатенацией в цикле;
ОткрытьФорму()внутри цикла;Сообщить()внутри цикла.
Надёжность, 3 правила
- пустой блок
Исключение: ошибка проглатывается молча; НачатьТранзакциюбезОтменитьТранзакциюв обработчике исключения;- функция возвращает значения разных типов в разных ветках.
Безопасность, 6 правил
- пароль или токен захардкожен в коде;
Выполнить()иВычислить()с кодом из переменной, то есть исполнение данных;- данные подставляются во внешний запрос (OData, HTTP) без экранирования;
УстановитьПривилегированныйРежим(Истина);- GUID ссылки захардкожен в коде;
Выполнить()иВычислить()с константной строкой кода.
Запросы и метрики, 5 правил
- соединение с вложенным подзапросом;
ВЫБРАТЬ *в тексте запроса;- процедура длиннее 125 строк;
- цикломатическая сложность выше 20;
- вложенность глубже 5 уровней.
Пороги метрик не из книжки: они выставлены по перцентилям большого набора реального кода, поэтому ловят действительно выбивающиеся процедуры, а не каждую вторую.
Схемы компоновки, 7 правил
- соединение с вложенным подзапросом в запросе схемы;
- соединение с виртуальной таблицей;
ИЛИв условии соединения;- обращение через точку на три и более уровня;
ПОДОБНОс ведущим процентом;- условие
В ИЕРАРХИИ; - отрицание (
НЕ,<>) в условииГДЕ.
Почему находкам можно верить
Первая версия искала антипаттерны поиском по тексту и оказалась мусором: на контрольном наборе из 32 срабатываний настоящими дефектами были семь. Двадцать - ложные, потому что поиск по тексту не отличает код от комментария и от строкового литерала, не знает, находится строка внутри цикла или нет, и не понимает, что цикл выполняется ровно один раз.
Поэтому внутри полноценный разбор: лексер, дерево блоков процедуры, вывод типа переменной в пределах процедуры. Результат на том же контрольном наборе: все 20 ложных срабатываний замолчали, все 7 настоящих дефектов найдены, точность выросла с 22 процентов до 97.
Движок закрыт 272 автотестами, ошибок ноль: лексер 45, парсер 38, вывод типов 40, правила 67, отчёт 53, схемы компоновки 29.
Что вышло на нашем собственном коде
Прогон по семнадцати обработкам, которые мы сами написали и выложили на Инфостарт:
| Обработок | 17 |
|---|---|
| Строк кода | 24 142 |
| Находок | 239 |
| Из них критичных | 186 |
| Технический долг | 7 070 минут |
Хуже всех в этом рейтинге оказалась наша же "Выгрузка структуры метаданных для нейросетей": индекс 20 из 100, красный светофор, 30 замечаний на 857 строк кода. Показываю это специально, а не прячу: инструмент, который на коде автора выдаёт зелёное, не стоит десяти стартмани.
Порядок работы
- Открыть обработку через "Файл - Открыть" либо через справочник дополнительных обработок.
- Выбрать источник: файл, каталог или справочник допобработок.
- Указать логин и пароль к базе, если аутентификация не Windows. Они нужны только для запуска конфигуратора при распаковке
.epf. Поле можно оставить пустым, тогда платформа спросит сама. - Нажать "Проанализировать" и смотреть прогресс.
- Читать отчёт прямо в форме. Активизация строки в таблице переключает показываемый отчёт, кнопка "Сводный отчёт" возвращает к рейтингу.
- "Сохранить отчёт" пишет обычный HTML-файл: открывается любым браузером, отправляется письмом, прикладывается к задаче.
Про пароль честно. Он живёт только в памяти формы, нигде не сохраняется и очищается по завершении. Но пока работает конфигуратор, он виден в списке процессов машины - это цена автоматизации. Если такое неприемлемо, оставьте поле пустым и вводите пароль в окне платформы либо распакуйте обработки заранее: режим *.bsl берёт готовые модули и конфигуратор не запускает вообще.
Что нужно для запуска
| Платформа | 8.3.27.1606 и выше. На более старых файл не откроется |
|---|---|
| Клиент | Толстый или тонкий, Windows. Веб-клиент не поддерживается: там нет запуска конфигуратора |
| Конфигурация | Любая. Для режима "из справочника" нужен справочник "Дополнительные отчёты и обработки" |
| Права | Запуск внешних обработок. Для распаковки .epf нужен доступ в конфигуратор базы |
| Входные форматы | *.epf, *.erf, а также готовые *.bsl, если исходники уже выгружены |
Скорость: модуль на двадцать тысяч строк разбирается около десяти секунд. Дольше идёт не анализ, а распаковка: каждый запуск конфигуратора занимает клиентскую лицензию, и на десятке обработок это десять последовательных запусков.
Чего инструмент не делает
Границы написаны здесь и продублированы в подвале каждого отчёта.
- Видит паттерны, а не смысл. Скажет "запрос в цикле по выборке - тысячи обращений к СУБД". Не скажет "бизнес-логика неверна".
- Не знает реальную кардинальность. Сколько строк вернёт запрос, из текста не следует.
- Не отслеживает данные между процедурами. Запрос в процедуре, которую вызвали в цикле через три уровня, не увидит.
- Не анализирует блокировки - для этого нужен рантайм, а не текст.
- Не проверяет индексы СУБД под условия запросов.
- Обычные формы внутри
.epfне анализируются. Их модули лежат вForm.bin, и конфигуратор при выгрузке не отдаёт их как*.bsl. Разбираются модуль объекта и управляемые формы. - Разбор схем компоновки идёт отдельной кнопкой по одному файлу и в пакетный проход не вшит. Шаблоны
ПОДОБНОв параметрах не проверяются.
Что в файле
Одна внешняя обработка .epf. Без внешних компонент, без подключаемых библиотек, без обращений в сеть. В информационную базу ничего не пишет: читает справочник допобработок и файлы с диска, всё остальное держит в памяти.
Совет по первому запуску: не начинайте со всей базы. Возьмите две-три обработки, которые вы хорошо знаете, и посмотрите, совпадают ли находки с тем, что вы про них и так думали. За десять минут станет понятно, где инструмент прав, а где шумит на вашем стиле кода, и дальше сводный рейтинг будет читаться с правильными ожиданиями.
Другие наши инструменты для разработчика 1С:
- Помощник перехода на 1С:Предприятие 8.5 - что в коде сломается при смене версии платформы.
- Трансформатор SQL в 1С - что на самом деле делает конкретный запрос.
- Оптимизатор временных таблиц - как переписать то, что нашли.
- Выгрузка метаданных для нейросети - структура базы в формате, который понимает LLM.
- Чек-ап СУБД под 1С - правильно ли база стоит на сервере баз данных.
Проверено на следующих конфигурациях и релизах:
- Бухгалтерия предприятия, редакция 3.0, релизы 3.0.43.208
Вступайте в нашу телеграмм-группу Инфостарт