Перейти к содержанию

ИИ-агенты: проверка после правки

Агент, который правит код 1С (Claude Code, Codex, Cursor, агентный фреймворк), обычно проверяет себя анализатором BSL после каждой правки и синтаксическим контролем Конфигуратора (/CheckModules) перед коммитом. Синтаксический контроль не ловит опечатку в поле запроса, лишний параметр в вызове экспортного метода, переименованный обработчик события формы, ошибку при открытии формы и метод платформы новее режима совместимости той же линейки — каждый случай доказан контрольным дефектом («ОТК и проверка Конфигуратором»). ОТК ловит их и отвечает в виде, удобном агенту: код выхода, строки «файл(строка,колонка)» и JSON с находками.

Цикл

агент правит код → otk gate … → код выхода → 0: дальше / 1: исправить находки / 2: сообщить человеку
Когда Команда Время
после каждой правки otk gate --base HEAD --worktree --static-only --quiet --problems секунды, без базы и лицензии 1С
перед коммитом или PR otk gate --base HEAD --worktree --quiet --problems минуты: пробы в своей копии ИБ
ветка целиком otk gate --base origin/master --quiet --problems то же по всем коммитам ветки
без git otk gate --dir <выгрузка> --base-dir <было> --quiet --problems как выше

--worktree проверяет незакоммиченные правки рабочего дерева, --static-only — только статику. Ключи и настройки — «Команды».

Что читать агенту

Код выхода — главное: 0 — можно двигаться дальше, 1 — найдены ошибки, 2 — сбой окружения (копия ИБ занята, платформа не запустилась) или ничего не проверено. При 2 править код бесполезно — это задача человека.

Строки --problems (с --quiet — только они и строка вердикта):

# ОТК: есть ошибки — не отправлять (код 1)
…\Catalogs\Номенклатура\Ext\ObjectModule.bsl(14,1): error common-method: Слишком много параметров: Ценообразование.ОкруглитьЦену принимает 1, передано 2 [Справочник.Номенклатура.ПередЗаписью; найдено: статика (common-method)]
…\Catalogs\Номенклатура\Forms\ФормаЭлемента\Ext\Form\Module.bsl(1,1): error handler: Обработчик из Form.xml не найден в модуле формы: ЦенаПриИзменении [Справочник.Номенклатура.Форма.ФормаЭлемента; найдено: статика (handler)]
…\CommonModules\Взаиморасчеты\Ext\Module.bsl(65,1): warning platform-api: Метод ЗаписатьЗначениеJSON доступен с 8.3.23 (режим совместимости 8.3.21): на платформе ниже 8.3.23 модуль не скомпилируется [ОбщийМодуль.Взаиморасчеты.КонтрагентВJSON; найдено: статика (platform-api)]
…\otk-1c-demo(1,1): warning not-checked/analyzers: проверка «новые замечания анализатора BSL» — не найдено: BSL LS (…) — теряется: замечания анализатора по правке
сводка: …\otk\otk-1c-demo-…\summary.md (HTML: …\summary.html)

Формат строки — <абсолютный путь>(<строка>,<колонка>): <error|warning> <правило>: <текст> [<объект.метод>; найдено: <проверки>]. Это вывод ветки defects демо-проекта, правки которой лежат в рабочем дереве незакоммиченными.

summary.json — рядом со summary.md (путь — в последней строке вывода), схема — src/otk_1c/schema/summary.schema.json:

{
  "schema": "otk.summary.v1", "version": "…",
  "code": 1,
  "verdict": "есть ошибки — не отправлять",
  "findings": [{
    "severity": "error", "step": "static", "rule": "common-method",
    "file": "src/cf/Catalogs/Номенклатура/Ext/ObjectModule.bsl", "line": 14, "column": 1,
    "message": "Слишком много параметров: Ценообразование.ОкруглитьЦену принимает 1, передано 2",
    "object": "Справочник.Номенклатура", "method": "ПередЗаписью",
    "place": "Справочник.Номенклатура.МодульОбъекта(14)",
    "text": "Цена = Ценообразование.ОкруглитьЦену(Цена, 2);",
    "sources": [{"step": "static", "rule": "common-method", "message": "…"}]
  }],
  "notChecked": [{"check": "analyzers", "what": "проверка «новые замечания анализатора BSL»",
                  "reason": "не найдено: BSL LS …", "reasonCode": "no-analyzer"}],
  "infra": []
}

text — строка кода, по которой сделана находка: агент находит место, даже если строки уже сдвинулись. Что значит каждое правило (rule) и как исправить — справочник находок (раздел — по правилу). notChecked — чего ОТК не проверил из-за окружения: это не «чисто», агенту стоит сказать об этом человеку. Тот же результат в SARIF — summary.sarif («Сводка и коды выхода»).

Итог в JSON: --json

Агенту, который разбирает вывод программой, удобнее один объект: otk gate … --json печатает в stdout только итог (схема src/otk_1c/schema/gate-result.schema.json, "schema": "otk.gate-result.v1"), журнал прогона уходит в stderr, код выхода тот же. Перед gate агент проверяет окружение: otk doctor --json (doctor-result.schema.json, otk.doctor-result.v1).

otk doctor --json → чинить по reasonCode (или сказать человеку) → otk gate --base HEAD --worktree --json
{
  "schema": "otk.gate-result.v1", "version": "…", "code": 2, "status": "infra",
  "verdict": "сбой инфраструктуры", "summaryPath": "…/otk/проект-…/summary.json",
  "findings": [],
  "notChecked": [{"status": "not-checked", "reasonCode": "no-yaxunit", "check": "smoke",
                  "what": "проверка «открытие изменённых форм»",
                  "message": "не найдено: YAxUnit (--yaxunit; environment.yaxunit) — теряется: ошибки при открытии форм",
                  "remediation": "укажите YAxUnit (.cfe): --yaxunit, environment.yaxunit"}],
  "infra": [{"status": "infra", "reasonCode": "ib-busy",
             "message": "база D:\\ib\\копия занята (заблокированы 1Cv8.cfl); …",
             "remediation": "закройте Конфигуратор и сеансы 1С:Предприятия с этой базой и повторите gate"}]
}

status итога: ok — можно отправлять, nothing — нечего проверять, errors — есть ошибки (код 1), infra — сбой инфраструктуры, not-checked — ничего не проверено (оба — код 2). findings, uncovered, notes — как в summary.json. Прогон оборвался до сводки (нет выгрузки, ошибка git или настройки) — тот же объект с кодом 2, runDir и summaryPath — null. С --json объект печатается всегда, в том числе при исключении в самой ОТК (reasonCode — internal, трассировка — в stderr).

doctor --json не дошёл до окружения (битый otk.toml, сбой ОТК) — код 2 и поле error с reasonCode. В doctor --json недоступная проверка (checks[].state = "unavailable") несёт reasonCodes и remediation недостающих зависимостей, fatal — режим on: gate завершится сбоем. environment[] без зависимости тоже несёт reasonCode, но важна она, только если её ждёт доступная иначе проверка. Занятость копии ИБ doctor не проверяет (не трогает блокировки) — её сообщает gate (ib-busy).

Коды причин

Список стабилен: новые коды добавляются, существующие не переименовываются. Нераспознанная причина — other; незнакомый агенту код (из новой версии ОТК) читайте как other и действуйте по remediation («Контракт»).

Код Причина Что делать агенту
ib-busy копия ИБ занята (.cfl, сеанс 1С) сказать человеку; повторить после закрытия сеансов
ib-auth в ИБ есть пользователи, вход не задан --user, OTK_PASSWORD — у человека
ib-invalid каталог копии ИБ не пуст и не файловая ИБ; нет копии с основной конфигурацией сказать человеку
no-ib копия ИБ не задана --ib своей копии или --static-only и сказать, что не проверено
no-platform платформа 1С не найдена --platform или --static-only
no-ibcmd нет ibcmd при environment.ibTool = ibcmd ibTool = designer или сказать человеку
no-license нет лицензии 1С --static-only, сказать человеку
no-yaxunit YAxUnit не задан --yaxunit, если путь известен
no-com нет COM (не Windows, нет pywin32) YAxUnit или pip install "otk-1c[com]"
no-display Linux без Xvfb и DISPLAY сказать человеку
no-analyzer нет BSL LS и bsl-analyzer сказать человеку (проверку не выключать)
no-edtcli нет 1cedtcli для исходников EDT --edtcli или сказать человеку
no-help нет справки платформы --platform на полную установку
no-availability нет точной таблицы доступности методов (только doctor) otk availability build — по согласию человека
no-git нет git (только doctor) gate --dir
no-python Python ниже 3.11 (только doctor) сказать человеку
no-source нет файла конфигурации в каталоге выгрузки --dir или --source
no-parent у расширения нет выгрузки основной конфигурации --parent, если путь известен
no-plan нет плана otk.json (report, static) сначала collect или gate
timeout платформа не завершилась за тайм-аут повторить один раз; снова — сказать человеку
platform-failed Конфигуратор или ibcmd завершился ошибкой сказать человеку; код не править
restore-failed ОТК не вернула базу к виду до проверки (расширения — в сохранённых .cfe) сразу сказать человеку; повторно не запускать
edt-failed экспорт EDT завершился ошибкой сказать человеку
config-invalid ошибка настройки или ключей исправить ключ из сообщения
probe-failed исполнитель проб не запустился (COM, сеанс YAxUnit) повторить; снова — otk doctor --json
query-incomplete текст запроса собран из переменных частей сказать, что запрос не проверен
internal исключение в самой ОТК (не в проверяемом коде) повторить; снова — сказать человеку, код не править
other прочее сказать человеку текст message

Правило для агента

Вставьте в инструкции агента проекта (AGENTS.md, CLAUDE.md и т. п.) и поправьте под себя:

## Проверка кода 1С (ОТК)
- После каждой правки модулей: `otk gate --base HEAD --worktree --static-only --quiet --problems`.
- Перед коммитом: `otk gate --base HEAD --worktree --quiet --problems`.
- Код 1 — исправь находки `error` и запусти снова; `warning` — оцени, исправь или объясни, почему оставил.
- Код 2 — не правь код: сообщи человеку строку вердикта.
- Строки `not-checked` — перечисли человеку, что не проверено.
- Не отключай проверки и не меняй otk.toml, чтобы получить код 0.

Агенту, которому нужны данные копии ИБ (проверить запрос на живых данных, посмотреть метаданные, журнал регистрации), — MCP-сервер otk mcp («Дополнительные инструменты»).