Merge pull request 'Гайд тестировщика: единая нормализация ББ/ОФР (контракт 2.0) (#128)' (#129) from feat/128-qa-normalization-v2 into main

This commit is contained in:
aep 2026-10-19 08:01:07 +03:00
commit 1865874c83
3 changed files with 464 additions and 40 deletions

View File

@ -5,7 +5,8 @@
`tabular-parser`, `scan-gateway` и эмулятор ИС Сканирование `scan-emulator` (см. «Профиль `services`»). Без профиля
поднимается только инфраструктура, а сервисы можно запускать из venv (см. «Запуск сервисов из venv»).
Для ручного тестирования стенда (установка ПО, запуск, чек-лист сценариев по ролям) — [`qa-guide.md`](qa-guide.md).
Для ручного тестирования стенда (установка ПО, запуск, чек-лист сценариев по ролям) — [`qa-guide.md`](qa-guide.md);
тестирование единой нормализации ББ/ОФР (контракт 2.0) на стенде контура — [`qa-statements-v2.md`](qa-statements-v2.md).
Инструкция пользователя по экранам прототипа со скриншотами (для передачи в тестирование) — [`../user/user-guide.md`](../user/user-guide.md).
Разработчику фронта: **начинать с [`frontend-api-guide.md`](frontend-api-guide.md)** — единый гайд по API `arm-core` (подключение,
общие правила, все маршруты, ошибки, сценарии экранов, что недавно изменилось и что изменится); как устроены вход и права `arm-core`, какие ручки когда дёргать, семантика 401/403/404 —
@ -250,10 +251,10 @@ new_job image PDF ocr/aep_6.pdf && poll 60
```
Ожидание (по спеке и README `scan-gateway`; вывод не прогонялся): `aep_3.pdf` — результат `needs_check` с двумя документами
(`BALANCE`, `INCOME`), в `metrics.warnings` — предупреждения нормализации и строка
`<job_id>_ofr.json: INVALID_DOCUMENT: Не удалось определить тип документа.` (второй файл набора — ответ-ошибка, штатно);
`aep_6.pdf` — `needs_check` с двумя документами, в предупреждениях «редакция fsbu4 не заполнена». Маппинг результата в формы в
ядре — Срез 3b; что именно ядро делает с конвертом `needs_check` до этого, на стенде не проверялось.
(`BALANCE`, `INCOME`), с контрактом 2.0 в `metrics.warnings` — структура `JSON_FAILED` (`error`) с сообщением
`INVALID_DOCUMENT: Не удалось определить тип документа.` по `<job_id>_ofr.json` (второй файл набора — ответ-ошибка, штатно);
`aep_6.pdf` — `needs_check` с двумя документами (ФСБУ 4), у документов `INN_NOT_FOUND` и `REPORT_DATE_UNPARSED` (`info`).
Формы в ядре — `qa-guide.md` §6.9 и [`qa-statements-v2.md`](qa-statements-v2.md).
Подробности и все ожидания — `qa-guide.md` §6.8.
**3. Сервис недоступен → три повторные публикации → `dlq` / `NO_ACK`:**

View File

@ -7,6 +7,9 @@ macOS (Docker 28, compose 2.34, Node 24, uv 0.10): от пустого ката
Как читать: раздел 4 — поднять стенд, раздел 8 — пройти основной путь аналитика в браузере, разделы 6–7 — то же и
глубже через API (Swagger/curl): там проверяются права, коды ошибок и граничные случаи, до которых UI не доходит.
Инструкция пользователя по экранам со скриншотами (без стенда и API) — [`../user/user-guide.md`](../user/user-guide.md).
Единая нормализация ББ/ОФР (контракт результата распознавания 2.0, выкладка 19.10.2026): что изменилось, справка по
предупреждениям, чек-лист N1–N66 и известные замечания — [`qa-statements-v2.md`](qa-statements-v2.md); разделы 6.8, 6.9,
8.5 ниже приведены к этому поведению.
## 1. Что сейчас есть и чего нет
@ -37,6 +40,10 @@ macOS (Docker 28, compose 2.34, Node 24, uv 0.10): от пустого ката
- Парсер ОСВ после пакета ДКБ (arm-tabular-parser #13, #17): скользящие периоды, несколько корней без строки счёта, «Итого
развернутое», шапка без меток, ИНН в тексте названия и строкой выше (#15); тесты на 25 файлах `osv-dkb/**` по манифесту
ожиданий, golden — 113 файлов (раздел 6.7).
- Единая нормализация ББ/ОФР (arm-ka-docs#116, DBML v5.19, контракт результата 2.0): Excel и PDF разбираются одним общим
кодом `arm_statements`; строки без кода и с нечитаемым кодом сохраняются со статусами, повторы кода законны, подсветка
только «требует внимания», предупреждения у места, правка кодов строк и дат колонок, новые блокировки подтверждения —
[`qa-statements-v2.md`](qa-statements-v2.md).
**Нет (это не баги):**
@ -437,11 +444,16 @@ ENV_FILE=.env.test .venv/bin/python -m src.parser.cli "/путь/к/файлу.x
(`document_type` = `BALANCE` / `INCOME` / `DISCLOSURE`, ОСВ идут первыми), с `header`, `columns[]`, `lines[]`, `checks`.
Что смотреть: `document_type` соответствует форме на листе; `columns[].period_date` — даты колонок слева направо (для ОФР —
конец периода); `checks.relations_failed` (жёсткие соотношения §7 с `expected`/`actual` по колонкам — причина `needs_check`),
`checks.soft_relations_failed` и `duplicate_line_codes`; в `metrics.warnings` — предупреждение об единицах («значений с
дробной частью при единице тыс. руб.: N из M»: значения ББ/ОФР из Excel берутся как показывает числовой формат ячейки, OQ-138, #42; для xlsb — как в файле плюс предупреждение «формат чисел xlsb не читается», для неразобранных форматов — «формат чисел не разобран»), «колонка кодов не найдена»,
«страница-продолжение без шапки». Ожидания по реальным файлам — `../tabular-parser/api/tests/statements_manifest.yaml` и
`checks.soft_relations_failed` (с контрактом 2.0 `duplicate_line_codes` нет: повтор кода законен, все строки в `lines[]`);
у строк — `line_status` (`ok` / `detail` / `unreadable` / `missing`), `row_index`, `ref`, `needs_review`; у документа — `status`
и `warnings[]`, у файла — `metrics.warnings[]`: предупреждения — структуры `{code, severity, message, …}` (коды и тексты —
[`qa-statements-v2.md`](qa-statements-v2.md) §4.2), например `FRACTIONAL_IN_THOUSANDS` («единицы «тыс. руб.», но N из M значений
с дробной частью»: значения ББ/ОФР из Excel берутся как показывает числовой формат ячейки, OQ-138, #42; для xlsb — как в файле
плюс `XLSB_NO_FORMATS`, для неразобранных форматов — `NUMBER_FORMAT_UNPARSED`), `CODE_COLUMN_NOT_FOUND`, `NO_ORGANIZATION_NO_INN`
(страница-продолжение без шапки), `NUMBERS_OUTSIDE_TABLE` (числа правее таблицы, Р-44). Ожидания по реальным файлам — `../tabular-parser/api/tests/statements_manifest.yaml` и
таблица «файл → статус» в README `tabular-parser`; файлы — `../fixtures/statements-xlsx/` (синтетика `st01…st07`).
Постраничные xls из 1С (страница 2 отдельным файлом, ББ только актив) дают `needs_check` — это штатно (OQ-138, OQ-140), не баг.
Постраничные xls из 1С (страница 2 отдельным файлом, ББ только актив) дают `needs_check` — это штатно (OQ-138, OQ-140), не баг:
с контрактом 2.0 соотношение с пустой стороной считается (`1600 = 1700` при отсутствующей 1700 или 1600 — нарушение).
`done` получают формы, где жёсткие соотношения §7 сходятся: Межениновская, НПЗ, ОФР Унагранде (страница 1); мягкие расхождения
(в пределах допуска) статус не меняют. Для xlsb числовой формат не читается (значения как в файле), поэтому при шапке «тыс. руб.»
и рублёвых значениях возможно `needs_check` или расхождение в пределах допуска округления — это следствие правила, не баг.
@ -503,22 +515,31 @@ PDF и изображения обрабатывает `scan-gateway`; ядро
| Файл | Ожидание |
|---|---|
| `aep_3.pdf` | `needs_check`, два документа (`BALANCE`, `INCOME`). В `metrics.warnings` (по эталону `fixtures/ocr/expected_normalize/aep_3.json`): файл — `ИНН распознан неуверенно`; таблица 0 — `шапка синтезирована: колонки без дат`, `строк с нечисловым кодом пропущено: 8`, `строк без кода с суммами пропущено: 2`, повторы кодов 1320/1350/1360/1370; таблица 1 — шапка синтезирована, пропущено 2 и 2; строка `<job_id>_ofr.json: INVALID_DOCUMENT: …` (второй файл набора — ответ-ошибка, штатно; понижает статус до `needs_check`) |
| `aep_6.pdf` | `needs_check`, два документа. Предупреждения: файл — `ИНН не распознан`, `дата отчёта не разобрана`; таблица 0 — пропущено 2 (нечисловой код) и 19 (без кода с суммами), `редакция fsbu4 не заполнена` (форма 2025 года, `fsbu4` пока пуста — OQ-150), повторы кодов 1220/1520; таблица 1 — пропущено 1 и 2, `fsbu4` не заполнена, повтор кода 2410 (OQ-152) |
| `aep_3.pdf` | `needs_check`, два документа (`BALANCE`, `INCOME`), контракт 2.0 (эталон `fixtures/ocr/expected_normalize/aep_3.json`). `metrics.warnings` — `JSON_FAILED` (`error`: второй файл набора `<job_id>_ofr.json` — ответ-ошибка ИС, штатно). ББ (66н): 42 строки — 34 `ok`, 4 `unreadable`, 1 `missing`, 3 `detail`; 24 нарушения §7; предупреждения `HEADER_ROW_NOT_FOUND`, `REPORT_DATE_UNCERTAIN` (`error`), `INN_UNCERTAIN`, `ORGANIZATION_UNCERTAIN` (`info`). ОФР: 17 строк (14 `ok`, 1 `unreadable`, 1 `missing`, 1 `detail`), 5 нарушений, те же предупреждения шапки |
| `aep_6.pdf` | `needs_check`, два документа (ФСБУ 4). ББ: 60 строк — 38 `ok`, 2 `unreadable` (без сумм), 20 `detail`; нарушений нет; `INN_NOT_FOUND`, `REPORT_DATE_UNPARSED` (`info`). ОФР: 28 строк (25 `ok`, 3 `detail`), одно нарушение `2300 = …`; те же предупреждения шапки. Повтор кода 2410 — обе строки `ok` (OQ-152 снят Р-4) |
| `БО 1 кв 2025.PDF`, `Бухгалтерская отчетность 1 кв.25.pdf` | `done`, два документа у каждого, нарушений нет; `ROW_SPLIT` (`info`, склеенная строка разделена); у «БО 1 кв 2025» ещё `REPORT_DATE_UNPARSED` |
| `aep_5.PDF`, `aep_8.pdf` | `error`, `INVALID_DOCUMENT` с сообщением ИС (в фикстурах лежат ответы-ошибки) |
| любой другой файл | `error`, `INVALID_DOCUMENT` эмулятора («нет пары по содержимому»), если не задан `SCAN_EMULATOR_DEFAULT`; PDF без JSON-набора — всегда (OQ-151) |
Что смотреть: `raw/<job_id>.json` (склейка всех файлов набора) и `results/<file_id>/<job_id>/result.json` в MinIO; подписи
колонок разобраны в даты, коды строк, суммы со скобками (минус), `is_recognized`, `string_value` только у неразобранных сумм.
`done` на реальных сканах почти не бывает — это ожидаемо. В dev-compose у шлюза `SCAN_CLEANUP=true`: после ответа
`Output/<job_id>/` и входящий файл удаляются. Что не считать багом: строки с мусорным или пустым кодом не попадают в документ, но есть предупреждения
`строк с нечисловым кодом пропущено` / `строк без кода с суммами пропущено` (OQ-149); при повторе кода остаётся первая
строка (OQ-152); минус не поставлен при `}` вместо `)` (OQ-147); `is_recognized = false` у прочерка «—» (OQ-148); сумма
с тремя знаками после запятой (`0,125`) — `amount = null`, текст в `string_value`; `4,200` и `1,234` — разделитель тысяч (4200, 1234).
колонок разобраны в даты, коды строк, суммы со скобками (минус), `is_recognized`, `string_value` только у неразобранных сумм,
`text` — сырой текст каждой ячейки, `needs_review` у значений, строк и полей шапки. Чистый скан, где все неуверенные значения
покрыты сошедшимися соотношениями §7, получает `done` (так у сканов РБ и Счастливочной за 1 кв. 2025). В dev-compose у шлюза
`SCAN_CLEANUP=true`: после ответа `Output/<job_id>/` и входящий файл удаляются. Что не считать багом: строки с мусорным кодом
и без кода не выбрасываются, а приходят со статусами `unreadable` / `missing` / `detail` (Р-8; восстановления кода по
наименованию нет — OQ-149); при повторе кода остаются все строки (Р-4); сумма с тремя знаками после запятой (`0,125`) —
`amount = null`, текст в `string_value`; `4,200` и `1,234` — разделитель тысяч (4200, 1234); `}` и `]` принимаются как
закрывающая скобка (минус), прочерк «—» — пустое значение. Поведение экрана для этих документов — [`qa-statements-v2.md`](qa-statements-v2.md).
### 6.9 Формы ББ/ОФР: просмотр, правка, акцепт, подтверждение (Срез 3b)
Предусловие (OQ-157): чистая форма после маппинга сразу `CONFIRMED` (`confirmed_by` пуст, `reviewed_by` NULL) и правке не поддаётся (`PATCH` — 409 `DOCUMENT_READONLY`). Поэтому F1–F2 — на чистой форме `1_Форма1_бух_09.xlsx`; затем удалите её (`DELETE /files/{file_id}`, 204) и загрузите копию с нарушением: в Excel сумма строки 1600 колонки 0 увеличена на 100 (`1600 = 1100 + 1200` нарушено). F3–F10 ведутся на этой копии (`file_id` новой формы); F3 увеличивает сумму от значения копии, F7 возвращает её на верную сумму `1100 + 1200`.
С выкладкой единой нормализации (контракт 2.0, DBML v5.19) ответ формы содержит строки со статусами, `issues[]`,
`edition_lines[]`, `needs_review`, а `PATCH` — части `lines` (код строки, расшифровка, подтверждение кода), `columns` (дата
колонки), `values[].confirmed` и `header.organization_name`; подтверждение — ещё 409 `LINES_UNRESOLVED` и `DUPLICATE_FORM`.
Поля и коды — `frontend-api-guide.md` §5.6.1, сценарии через экран — [`qa-statements-v2.md`](qa-statements-v2.md). F1–F21 ниже
остаются в силе; формы, загруженные до выкладки v5.19, удаляются очисткой (`arm-core/README.md`, «Выкладка v5.19: очистка форм»).
Предусловие (OQ-157): чистая форма после маппинга сразу `CONFIRMED` (`confirmed_by` пуст, `reviewed_by` NULL) и правке не поддаётся (`PATCH` — 409 `DOCUMENT_READONLY`). Поэтому F1–F2 — на чистой форме `1_Форма1_бух_09.xlsx`; затем удалите её (`DELETE /files/{file_id}`, 204) и загрузите копию с нарушением: в Excel сумма строки 1600 первой колонки (30.09.2025) увеличена на 100 (`1600 = 1100 + 1200` нарушено). F3–F10 ведутся на этой копии (`file_id` новой формы); F3 увеличивает сумму от значения копии, F7 возвращает её на верную сумму `1100 + 1200`.
Предусловия: раздел 4.2 (ядро с `NATS_ENABLED=true`, tabular-parser на `:8001`), `make seed-dev` (dev-ГК «Агрофирма Межениновская»,
ЮЛ с ИНН `7016006635`, Ростовский РФ — ИНН совпадает с ИНН шапок форм), пользователь `ka_go` (`DOCUMENT_EDIT`, `DOCUMENT_VIEW`,
@ -545,8 +566,8 @@ curl -s "localhost:8000/api/v1/documents/$DOC/statement" -H "$H" | python3 -m js
| № | Пользователь | Шаги | Ожидание |
|---|---|---|---|
| F1 | ka_go | загрузить `1_Форма1_бух_09.xlsx` для ЮЛ с ИНН 7016006635, дождаться `PROCESSED` | один документ: `document_type = BALANCE`, `osv_account_code` пуст, `period_year = 2025`, `period_quarter = Q3`, `counterparty_check = MATCH`, `comments_count = 0`, `status = CONFIRMED` (автоподтверждение: `confirmed_by` пуст, `reviewed_by` NULL) |
| F2 | ka_go | `GET /documents/{id}/statement` | 200; `edition = fsbu4`; `document.reporting_date = 2025-09-30`; `columns` — 3 (у колонки 0 `is_current = true`); `lines` — 37, отсортированы по `line_code`, у каждой `values` на все колонки; суммы — строки; `header.inn.value = "7016006635"`, `confidence = "100.00"`, `modified = false`; `checks.failed`, `soft_failed` пусты, `accepted = null` |
| F3 | ka_go | `PATCH …/statement` `{"values":[{"line_id":…,"column_id":…,"amount":"<сумма строки 1600, колонки 0, увеличенная на 100>"}]}` (`line_id`/`column_id` — из `GET …/statement` файла-копии, не из F2) | 200; у ячейки `amount` новая, `original_amount` = прежняя, `is_modified = true`, `modified_by` = пользователь; `checks.failed` непуст (нарушено `1600 = 1100 + 1200` и/или `1600 = 1700`), `document.status = NEEDS_CHECK`; в `audit_event` одно `RECOGNIZED_DATA_EDIT` (раздел `RECOGNITION`, `object_type = document`) с `before`/`after` ячейки (6.4) |
| F2 | ka_go | `GET /documents/{id}/statement` | 200; `edition = fsbu4`; `document.reporting_date = 2025-09-30`; `columns` — 3 (у первой, 30.09.2025, `is_current = true`; с контрактом 2.0 `column_index` — номер столбца листа: 12, 16, 18); `lines` — 37 строк из файла (`row_index` заполнен, `line_status = ok`) и 2 достроенные шаблонные (`id = null`, `origin = template`), по `line_code`, у каждой `values` на все колонки; суммы — строки; `header.inn.value = "7016006635"`, `confidence = "100.00"`, `modified = false`; `checks.failed`, `soft_failed` пусты, `accepted = null`; в `issues` одна запись `NUMBERS_OUTSIDE_TABLE` (`info`: числа в столбцах U–W правее таблицы не учитываются, Р-44) |
| F3 | ka_go | `PATCH …/statement` `{"values":[{"line_id":…,"column_id":…,"amount":"<сумма строки 1600 первой колонки, увеличенная на 100>"}]}` (`line_id`/`column_id` — из `GET …/statement` файла-копии, не из F2) | 200; у ячейки `amount` новая, `original_amount` = прежняя, `is_modified = true`, `modified_by` = пользователь; `checks.failed` непуст (нарушено `1600 = 1100 + 1200` и/или `1600 = 1700`), `document.status = NEEDS_CHECK`; в `audit_event` одно `RECOGNIZED_DATA_EDIT` (раздел `RECOGNITION`, `object_type = document`) с `before`/`after` ячейки (6.4) |
| F4 | ka_go | `POST …/confirm` | 409 `CHECKS_NOT_PASSED`, `detail.failures[]` — нарушения (`column_index`, `relation`, `expected`, `actual`) |
| F5 | ka_go | `POST …/statement/checks/accept` `{"comment":"округление в форме клиента"}` | 200; `checks.accepted = {by, at, comment}`, `checks.failed` по-прежнему непуст; статус документа пересчитан (`RECOGNIZED`, если других причин `NEEDS_CHECK` нет); `POST …/confirm` теперь проходит (но F11 делайте после возврата значений) |
| F6 | ka_go | снова `PATCH` той же ячейки другой суммой | 200; `checks.accepted = null` (акцепт сброшен правкой) |
@ -568,12 +589,15 @@ curl -s "localhost:8000/api/v1/documents/$DOC/statement" -H "$H" | python3 -m js
| F20 | ka_go | `GET …/statement` документа `OSV` (раздел 6.6) | 409 `DOCUMENT_NOT_STATEMENT` |
| F21 | ka_go | загрузить второй файл с формой ББ за тот же период (книга Form1, пересохранённая в Excel — другой sha256); `PATCH` по документу первого файла (это копия с нарушением из F3–F10; чистая F1 удалена по предусловию §6.9) | старый файл `SUPERSEDED`; в коде (`statements.py`) проверка `FILE_SUPERSEDED` идёт раньше `DOCUMENT_READONLY`, поэтому ответ — 409 `FILE_SUPERSEDED` даже для подтверждённой формы; `PATCH`/`accept` по его документу — 409 `FILE_SUPERSEDED`; чтение `GET …/statement` и комментарии работают |
Что не считать багом: формы из OCR (PDF) почти всегда `NEEDS_CHECK` — уверенность значений меньше 100, ИНН распознан неуверенно
(`aep_3.pdf`, `aep_6.pdf`, раздел 6.8), аналитик правит значения и подтверждает; у форм без колонки кодов документ создаётся без
строк (OQ-139); повтор одной формы в одном файле — вторая не создаётся, первая `NEEDS_CHECK`; страницы одной формы из разных файлов
не склеиваются (OQ-140); строк без кода в ответе нет (OQ-36); скачивание файла и CSV в журнал не пишутся (OQ-153); формулы §7 одни
для редакций `66n` и `fsbu4` (OQ-146); уже смапленные до Среза 3b файлы форм не получают — загрузите файл заново (раздел 10 — сброс
стенда).
Что не считать багом: формы из OCR (PDF) с неуверенными значениями, не покрытыми сошедшимися соотношениями §7, —
`NEEDS_CHECK` (`aep_3.pdf`, `aep_6.pdf`, раздел 6.8), а чистый скан может автоподтвердиться; у форм без колонки кодов документ
создаётся без строк из файла — только шаблонные пустые (OQ-139); две формы одного типа и периода в одном файле хранятся обе, ни
одна не автоподтверждается, подтверждение второй при подтверждённой первой — 409 `DUPLICATE_FORM` (Р-18); страницы одной формы из
разных файлов не склеиваются (OQ-140); строки без кода приходят со статусами `unreadable` / `missing` / `detail` (Р-8, OQ-36
закрыт), и при `unreadable` / `missing` с суммами подтверждение — 409 `LINES_UNRESOLVED`; скачивание файла и CSV в журнал не
пишутся (OQ-153); формулы §7 одни для редакций `66n` и `fsbu4` (OQ-146); формы, загруженные до выкладки v5.19, на локальном стенде
удаляются сбросом (раздел 10) или очисткой `scripts/purge_statements.py` — загрузите файл заново. Известные замечания по формам
2.0 (I-1…I-5, M-1…M-9, F-1, F-2) — [`qa-statements-v2.md`](qa-statements-v2.md) раздел 6.
## 7. Консолидация через API (Срез 4)
@ -683,7 +707,7 @@ Q3-only — `missing_quarters = ["Q1","Q2"]`.
| Поле | Ожидание |
|---|---|
| `rows_total` | 1385 |
| `unmapped_total` | 1260 до ручного сопоставления — строки без ЮЛ **и** без ИНН из файла (отмена П-1, arm-core #74): строки с ИНН, которого нет в справочнике, сюда не входят; 4 строки Счастливочной с ИНН 3528052718 (`60.01`, `60.02`, `62.01`, `62.02`) сопоставлены автоматически |
| `unmapped_total` | 1236 до ручного сопоставления — строки без ЮЛ **и** без ИНН из файла (отмена П-1, arm-core #74): строки с ИНН, которого нет в справочнике, сюда не входят; строки Счастливочной с ИНН 3528052718 (`60.01`, `60.02`, `62.01`, `62.02`, `76.06`, `76.АВ`) сопоставлены автоматически. Прежнее значение 1260 устарело: пересчитано по экспорту свода 19.10.2026 (вероятная причина — разбор строк ИНН в ОСВ, arm-tabular-parser #33, #35; не проверялась) |
| `documents_total` | 22 |
| `gaps` | ровно 7: РБ — `01`, `58.03`, `66`, `67`, `76`; Счастливочная — `01`, `02`; у всех `missing_quarters = ["Q1","Q2"]` |
@ -796,7 +820,7 @@ docker compose -f ../docs/dev/docker-compose.yml --profile services up -d --buil
| W10 | Кликнуть строку версии в «Консолидации» | строка подсвечена зелёным, адрес `?version=<id>`; блок «Организации»: колонки «Наименование», «Документы», «ОФР», «Бух.баланс», «ОСВ», «ИНН», «Тип»; меню «⋮» строки версии: «Добавить версию» → «Будет позже», «История изменений» → заглушка журнала |
| W11 | «Скачать чек-лист» | файл `checklist-Русский Бисквит-2024-Q3.csv`; содержимое — как в F17 (BOM, разделитель `;`, открывается в Excel) |
| W12 | Клик по строке «ПЕКАРНЯ СЧАСТЛИВОЧНАЯ, ООО» (или по кнопке «Документы») | справа панель «ПЕРВИЧНЫЕ ДОКУМЕНТЫ» [39]: имя ЮЛ, ИНН 3528104476, кнопка «Загрузить документы», «Документов нет»; крестик справа закрывает панель |
| W13 | «Загрузить документы» → «Выбрать документы» → пять файлов `../fixtures/osv/schastl/2024-Q3/*` → «Загрузить» | модалка «Загрузка документов» [40]: зелёный блок «Принято: 5» с именами, кнопка «Загрузить» сменилась на «Готово». В панели файлы сначала «Обработка», через 5–15 с у каждого документ: «ОСВ 60 · XLS · <дата загрузки>», период «2024 К3», проверка «Период —», «Контрагент ✓», статус «Загружен» (чистые ОСВ сразу, автоподтверждение, OQ-157; «Требуется проверка» — только с замечаниями, например шапка другой организации). Панель опрашивает сервер раз в 5 с, пока есть файлы в обработке |
| W13 | «Загрузить документы» → «Выбрать документы» → пять файлов `../fixtures/osv/schastl/2024-Q3/*` → «Загрузить» | модалка «Загрузка документов» [40]: зелёный блок «Принято: 5» с именами, кнопка «Загрузить» сменилась на «Готово». В панели файлы сначала «Обработка», через 5–15 с у каждого документ: «ОСВ 60 · XLS · <дата загрузки>», период «2024 К3», проверка «Период —», «Контрагент ✓», статус «Загружен» (чистые ОСВ сразу, автоподтверждение, OQ-157; «Требуется проверка» — только с замечаниями, например шапка другой организации). Под статусом у каждой ОСВ — синий значок «ⓘ 1»: по клику список «Предупреждения документа» с «Информация: иерархия строк — по группировке листа (outline)» (на статус не влияет; [`qa-statements-v2.md`](qa-statements-v2.md), O-2). Панель опрашивает сервер раз в 5 с, пока есть файлы в обработке |
| W14 | Загрузить ещё раз любой из этих файлов | красный блок «Отклонено: 1» со строкой «<имя> — файл «<имя>» уже загружен для этого ЮЛ» (`DUPLICATE_FILE`), уведомление «Ни один файл не принят» |
| W15 | Закрыть панель, обновить страницу (F5) | статус версии в таблице — «Обработка документов» (K8) |
@ -804,9 +828,9 @@ docker compose -f ../docs/dev/docker-compose.yml --profile services up -d --buil
| № | Шаги | Ожидание |
|---|---|---|
| W16 | В панели Счастливочной клик по «ОСВ 60» | экран «Просмотр ОСВ»: крошки «Отчётность › ПЕКАРНЯ СЧАСТЛИВОЧНАЯ, ООО › Проверка документа», подзаголовок «<имя файла> · XLS · <дата>», справа статус «Загружен», кнопка «✓ Подтвердить» неактивна; надпись «Суммы в рублях; строки ОСВ только для чтения»; дерево счёт → субсчёт → контрагент, колонки «Счёт / контрагент», «ИНН» и шесть сумм. Корневая строка `60`: «—», «27 923 002,09», «107 554 149,33», «99 188 100,32», «—», «19 556 953,08» (сальдо нач. Кт + обороты Кт − обороты Дт = сальдо кон. Кт) |
| W16 | В панели Счастливочной клик по «ОСВ 60» | экран «Просмотр ОСВ»: крошки «Отчётность › ПЕКАРНЯ СЧАСТЛИВОЧНАЯ, ООО › Проверка документа», подзаголовок «<имя файла> · XLS · <дата>», справа статус «Загружен», кнопка «✓ Подтвердить» неактивна; надпись «Суммы в рублях; строки ОСВ только для чтения»; поиск «Контрагент или ИНН», фильтр «Субсчёт», справа «Строк: 73»; над таблицей «Предупреждения (1)» — «Информация: иерархия строк — по группировке листа (outline)». **Плоская** таблица (arm-web #13): строка на контрагента, колонки «Субсчёт», «Контрагент», «ИНН» и шесть сумм (сальдо на начало, обороты, сальдо на конец — Дебет / Кредит). Строка «Итого по документу» внизу (сумма корневых строк счёта, как «Итого» файла): «—», «27 923 002,09», «107 554 149,33», «99 188 100,32», «—», «19 556 953,08» (сальдо нач. Кт + обороты Кт − обороты Дт = сальдо кон. Кт) |
| W17 | ka_go, через API (в UI не воспроизводится: загрузка только из панели ЮЛ внутри версии, см. раздел 8.7). Загрузить один файл из `../fixtures/osv/schastl/2024-Q3/` в QA-ЮЛ `$LE_QA` (id ЮЛ, заведённого для QA, не входящего в ГСК демо; без консолидации — маршрутом ЮЛ): `curl -s -X POST "localhost:8000/api/v1/legal-entities/$LE_QA/files" -H "$H" -F "files=@<файл>"`; дождаться `PROCESSED` (`GET /files/{file_id}`); `POST /documents/{id}/confirm` | документ `NEEDS_CHECK` («Контрагент ✗», шапка другой организации) до подтверждения; после — 200 `CONFIRMED`, `confirmed_by` заполнен; повтор — 409 `ALREADY_CONFIRMED`. Файл остаётся на стенде вне версий демо: счётчики W18 не затрагивает; `DELETE` после ручного подтверждения даёт 409; в панели [39] версии этот файл виден только по переключателю «Все документы организации» с подписью «вне консолидации» |
| W18 | Остальные файлы РБ и Счастливочной 2024 Q1–Q3 (всего 22, список — 7.1): через «Загрузить документы» у каждого ЮЛ и подтверждение каждого ОСВ, либо скриптом из каталога `arm-web`: `scripts/demo-prepare.sh <version_id>` (id — из адреса `?version=`) | скрипт печатает строку на каждый файл (пять файлов из W13 — «уже загружен», это нормально), ждёт распознавания (до 5 мин), подтверждает только неподтверждённые ОСВ (чистые уже «Загружен», автоподтверждение, OQ-157) и в конце печатает `строк: 1385 документов: 22 несопоставленных: 1260 пробелов: 7`. Статус версии — «Коррекция данных» (K9) появляется сразу после распознавания (автоподтверждение чистых документов, OQ-157), в «Организации» в колонке «ОСВ» — счета ЮЛ |
| W18 | Остальные файлы РБ и Счастливочной 2024 Q1–Q3 (всего 22, список — 7.1): через «Загрузить документы» у каждого ЮЛ и подтверждение каждого ОСВ, либо скриптом из каталога `arm-web`: `scripts/demo-prepare.sh <version_id>` (id — из адреса `?version=`) | скрипт печатает строку на каждый файл (пять файлов из W13 — «уже загружен», это нормально), ждёт распознавания (до 5 мин), подтверждает только неподтверждённые ОСВ (чистые уже «Загружен», автоподтверждение, OQ-157) и в конце печатает `строк: 1385 документов: 22 несопоставленных: 1236 пробелов: 7`. Статус версии — «Коррекция данных» (K9) появляется сразу после распознавания (автоподтверждение чистых документов, OQ-157), в «Организации» в колонке «ОСВ» — счета ЮЛ |
`demo-prepare.sh` берёт пользователя вторым аргументом (по умолчанию `ka_go@armka.local`), адрес ядра — из `API`
(по умолчанию `localhost:8000/api/v1`), каталог фикстур — из `FIXTURES_DIR` (по умолчанию `fixtures` рядом с `arm-web`).
@ -815,12 +839,13 @@ docker compose -f ../docs/dev/docker-compose.yml --profile services up -d --buil
PDF из `fixtures/ocr` — отчётность других компаний (`aep_6.pdf` — ООО «Дорстроймонтаж», на 30.06.2025), поэтому ячейки
ББ/ОФР чек-листа версии 2024 Q3 они не заполняют; для проверки экрана подойдёт любое ЮЛ версии. Распознаются только PDF,
для которых в эмуляторе есть ответ (раздел 6.8).
для которых в эмуляторе есть ответ (раздел 6.8). Экран показывает форму по контракту 2.0: что изменилось (строки со статусами,
подсветка «требует внимания», предупреждения у места) — [`qa-statements-v2.md`](qa-statements-v2.md) разделы 1 и 4.
| № | Шаги | Ожидание |
|---|---|---|
| W19 | В панели Счастливочной загрузить `../fixtures/ocr/aep_6.pdf` | через 10–60 с два документа: «Бух. баланс · PDF» и «ОФР · PDF», статус «Требуется проверка», «Контрагент ✗» (в скане другая организация) |
| W20 | Открыть «Бух. баланс» | экран «Проверка распознавания»: слева «ИСХОДНЫЙ ДОКУМЕНТ» — страницы PDF «Страница 1…8», масштаб «−», «100%», «+» и сброс; справа «РЕЗУЛЬТАТ РАСПОЗНАВАНИЯ»: шапка «ИНН —», «Дата отчёта —» (оранжевый фон — не распознано), «Единица измерения тыс. руб.»; заголовок «Бухгалтерский баланс»; колонки «На 30 июня 2025 г», «На 31 декабря 2024 г.», «На 31 декабря 2023 г.»; разделы «АКТИВ», «I. Внеоборотные активы» … «ПАССИВ»; итоги разделов жирным; суммы без копеек, пустые — «-»; строка 1600 «БАЛАНС» — 293 709 / 179 791 / 189 847. Ячейки с уверенностью распознавания ниже 100 % — оранжевые, подсказка «Уверенность: N%» |
| W20 | Открыть «Бух. баланс» | экран «Проверка распознавания»: слева «ИСХОДНЫЙ ДОКУМЕНТ» — страницы PDF «Страница 1…8», масштаб «−», «100%», «+» и сброс; справа «РЕЗУЛЬТАТ РАСПОЗНАВАНИЯ»: шапка «Организация» (текст из скана), «ИНН —» и «Дата отчёта —» с синим значком ⓘ (подсказки «ИНН не найден», «Дата отчёта не разобрана»), «Единица измерения тыс. руб.»; заголовок «Бухгалтерский баланс»; «Проверки пройдены»; «Предупреждения (3)» — «Информация» о наименовании строки 1530, дате и ИНН; переключатель «Показать расшифровки (20)»; колонки «На 30 июня 2025 г», «На 31 декабря 2024 г.», «На 31 декабря 2023 г.»; разделы «АКТИВ», «I. Внеоборотные активы» … «ПАССИВ»; итоги разделов жирным; суммы без копеек, пустые — «-»; строка 1600 «БАЛАНС» — 293 709 / 179 791 / 189 847; две розовые строки «код не распознан» без сумм (подтверждение не блокируют). Оранжевые — только ячейки «требует внимания» (сомнительные и не подтверждённые проверкой §7); в подсказке ячейки «Распознано: «…»» и «Уверенность: N%» есть и у неподсвеченных. Подробно — [`qa-statements-v2.md`](qa-statements-v2.md) N15 |
| W21 | «✎ Редактировать» → в строке 1600 первой колонки прибавить 100 → «✓ Сохранить» | уведомление «Изменения сохранены»; ячейка голубая, подсказка «Исходное: 293 709»; блок «Нарушения (N)» со строками «Колонка N: <соотношение> — ожидалось X, получено Y» (F3) |
| W22 | «✓ Подтвердить данные» | красный блок в правой части с текстом сервера и списком нарушений (409 `CHECKS_NOT_PASSED`, F4); документ не подтверждён |
| W23 | «Принять с комментарием» → в окне «Принять нарушения» сначала пустой комментарий, затем «округление в форме клиента» → «Принять» | с пустым комментарием «Принять» неактивна; после — синий блок «Нарушения приняты» с датой и комментарием (F5) |
@ -833,8 +858,9 @@ PDF из `fixtures/ocr` — отчётность других компаний (
| W28b | «✎ Редактировать» на форме, где есть достроенные (в источнике отсутствующие) строки | пустые достроенные строки видны, редактируются и не подсвечены как ошибки; ввод суммы → «✓ Сохранить» создаёт строку, проверки пересчитываются |
Формы из Excel (`fixtures/statements-xlsx`, раздел 6.9) открываются тем же экраном, но слева вместо скана — «Превью
недоступно для этого формата» и кнопка «Скачать исходник». Документы «Прочий документ» (расшифровки) в панели не
открываются.
недоступно для этого формата» и кнопка «Скачать исходник». Документы «Расшифровка» и «Прочее» в панели не
открываются. Строки без кода, расшифровки, правка кодов строк и дат колонок, подтверждение значения без правки, новые
блокировки подтверждения — сценарии N23–N49 в [`qa-statements-v2.md`](qa-statements-v2.md).
### 8.6 Сводная ОСВ [30]
@ -843,16 +869,16 @@ PDF из `fixtures/ocr` — отчётность других компаний (
| № | Шаги | Ожидание |
|---|---|---|
| W29 | В строке версии «К отчётности →» | экран «Русский Бисквит — 2024 К3», крошки «Отчётность › Русский Бисквит › 2024 · К3», справа «Статус отчёта» «Коррекция данных»; активна вкладка «ОСВ»; «Шахматка», «Таблица корректировки», «Гудвилл», «КФО», «КФО Общий», «Подтверждение КФО клиента» неактивны (подсказка «Будет в следующих срезах») |
| W30 | Сводка | под таблицей «Строк: 1385» (= `rows_total`, 7.2); жёлтый баннер «Требуется указать соответствия … Осталось: 1260.» (= `unmapped_total`); свёрнутый блок «Пробелы: 7 — по этим счетам нет ОСВ за часть кварталов, их строк в своде нет», раскрыть — 7 строк «<ЮЛ> — счёт <код> — нет кварталов: Q1, Q2»: РБ 01, 58.03, 66, 67, 76; Счастливочная 01, 02 |
| W30 | Сводка | под таблицей «Строк: 1385» (= `rows_total`, 7.2); жёлтый баннер «Требуется указать соответствия … Осталось: 1236.» (= `unmapped_total`); свёрнутый блок «Пробелы: 7 — по этим счетам нет ОСВ за часть кварталов, их строк в своде нет», раскрыть — 7 строк «<ЮЛ> — счёт <код> — нет кварталов: Q1, Q2»: РБ 01, 58.03, 66, 67, 76; Счастливочная 01, 02 |
| W31 | Колонка «Период», суммы | у всех строк «9 мес. 2024 г.»; суммы с запятой и пробелами, ноль — «—»; по 500 строк на страницу |
| W32 | Фильтр «Компания ГК» (воронка в заголовке) = «ПЕКАРНЯ СЧАСТЛИВОЧНАЯ, ООО» → «Применить»; фильтр «Контрагенты» = `бисквит` → «Применить» | «Строк: 6» — `60.01`, `60.02`, `62.01`, `62.02`, `76.06`, `76.АВ`, контрагент «РУССКИЙ БИСКВИТ, АО», ИНН 3528052718. Суммы — как в 7.2, на экране с запятой: `60.01` — «—», «4 454 151,93», «128 058 143,65», «125 950 450,77», «—», «2 346 459,05»; `60.02` — «—» везде, кроме оборотов «9 745 019,62» / «9 745 019,62»; `62.01` — «40 211 938,00», «—», «398 018 012,46», «330 517 504,00», «107 712 446,46», «—»; `62.02` — «—», «24 100 000,00», «9 900 000,00», «—», «—», «14 200 000,00»; в последней колонке «Тип контрагента» у всех шести — синий бейдж «ГСК». Окно фильтра закрывается после «Применить», иконка активного фильтра зелёная |
| W32a | Сбросить фильтры; прокрутить таблицу вправо; фильтр на колонке «Тип контрагента» по очереди «ГСК», «ГК», «Внешний» → «Применить» | у каждой строки бейдж: «ГСК» — синий, «ГК» — зелёный, «Внешний» — серый (как в макете [30]); «Строк» при «ГСК» + «ГК» + «Внешний» = 1385, «Строк» при «Внешний» = «Осталось» в баннере. «Сбросить» в окне фильтра возвращает все строки и закрывает окно |
| W32a | Сбросить фильтры; прокрутить таблицу вправо; фильтр на колонке «Тип контрагента» по очереди «ГСК», «ГК», «Внешний» → «Применить» | у каждой строки бейдж: «ГСК» — синий, «ГК» — зелёный, «Внешний» — серый (как в макете [30]); «Строк»: «ГСК» — 10, «ГК» — 26, «Внешний» — 1349, в сумме 1385. «Внешний» больше «Осталось» в баннере (1236): строки с ИНН из файла, которого нет в справочнике, — «Внешний», но не «несопоставленные» (отмена П-1, 7.2); «Осталось» = W34. «Сбросить» в окне фильтра возвращает все строки и закрывает окно |
| W33 | Сбросить фильтры; «Счёт» = `62` | «Строк: 387»; `60.01` — 0 строк (фильтр принимает только корень счёта, ограничение прототипа) |
| W34 | «Показать ЮЛ без ИНН» | только строки без связи с ЮЛ и без ИНН, «Строк» = «Осталось»; в ячейке ИНН — только красное «Указать» на подсвеченном фоне (макет [32-osv-no-inn]); воронка колонки «ИНН» зелёная; кнопка сменилась на «Показать все строки» |
| W34a | Ячейка ИНН без фильтров (arm-web #17) | строка с ИНН в файле — просто ИНН моноширинным шрифтом, «Указать» нет (даже если такой организации нет в справочнике); строка, связанная без ИНН в файле (например, РБ → «Юг-Финанс / ПЕКАРНЯ СЧАСТЛИВОЧНАЯ» на данных 2025 К1), — серая «таблетка» с ИНН организации справочника; клик по ней открывает «Выбор организации для связи с …», у текущей организации — неактивное «Связано», у остальных — «Связать» |
| W35 | «Экспорт» (с фильтрами и без) | файл `svod-osv_Русский Бисквит_2024-Q3_v1.xlsx` по текущим фильтрам; содержимое — по 7.3 |
Если на стенде раньше делали ручное сопоставление контрагентов (K14), «Осталось» меньше 1260: алиасы переживают версии.
Если на стенде раньше делали ручное сопоставление контрагентов (K14), «Осталось» меньше 1236: алиасы переживают версии.
Остальные цифры от этого не меняются.
### 8.7 Что в UI не считать багом (прототип)
@ -867,8 +893,12 @@ PDF из `fixtures/ocr` — отчётность других компаний (
- «Распознан» (старые `RECOGNIZED` и формы после правки) и «Требуется проверка» в панели документов выглядят одинаково — «Требуется проверка».
- «ГСК» и «Дата верификации» в таблице консолидаций, «Утверждён в РФ» и «Верифицирован в ГО» — всегда «—».
- Панель документов показывает первые 100 файлов рабочего стола консоли (или ЮЛ — по переключателю); загрузка — только из панели ЮЛ внутри версии «в работе».
- Шапку формы (ИНН, дату, единицу) нельзя очистить, только заменить; время принятия нарушений — в часовом поясе
браузера, остальные даты — по Москве.
- Шапку формы (ИНН, дату, единицу, с v5.19 и наименование организации) нельзя очистить, только заменить; время принятия
нарушений — в часовом поясе браузера, остальные даты — по Москве.
- Формы ББ/ОФР по контракту 2.0: известные замечания экрана (номер «Колонка N» = столбец листа, «Показать» в нарушениях без
рамки, значок ⓘ на разной высоте, сырое значение в поле правки и др.) и что так задумано — [`qa-statements-v2.md`](qa-statements-v2.md)
разделы 6 и 7. Значок с числом под статусом документа в панели считает и принятые нарушения; «Предупреждения обработки» в число
не входят.
- Ссылка `?version=` с несуществующим id «выбирает» пустую версию; при 404 на своде может прийти до трёх сообщений;
после истечения токена кроме «Сессия истекла» бывают лишние уведомления.
- Предупреждения antd в консоли браузера («Static function can not consume context…», deprecated) ни на что не влияют.
@ -896,7 +926,9 @@ PDF из `fixtures/ocr` — отчётность других компаний (
- Ручное сопоставление контрагента меняет строку ОСВ для всех версий, куда входит документ (OQ-123); рекомендация кандидата — только
при точном совпадении нормализованного имени (OQ-127).
- PDF-путь (Срез 3a): эмулятор отвечает только на PDF из `fixtures/ocr`, остальные —
`INVALID_DOCUMENT` (раздел 6.8, OQ-151); редакция `fsbu4` не заполнена (OQ-150).
`INVALID_DOCUMENT` (раздел 6.8, OQ-151).
- Формы ББ/ОФР по контракту 2.0 (единая нормализация, выкладка 19.10.2026): известные замечания I-1…I-5, M-1…M-9, O-2, F-1, F-2
и «что так задумано» — [`qa-statements-v2.md`](qa-statements-v2.md) разделы 6 и 7.
- Парсер ОСВ: границы и «не баги» — в конце раздела 6.7 (счёт 91 — OQ-132; скользящий период — OQ-131).
- Удаление алиаса одновременно с его переносом ручным сопоставлением даёт 404 вместо 204 (arm-core #26) — так задумано.

391
dev/qa-statements-v2.md Normal file
View File

@ -0,0 +1,391 @@
# Тестирование единой нормализации ББ/ОФР (контракт 2.0)
Документ для тестировщиков к выкладке «единой нормализации ББ/ОФР» на тестовый стенд в контуре банка (19.10.2026).
Проверка — через экраны АРМ КА (arm-web) на стенде контура. Как поднять стенд локально, войти и проверить API через
Swagger — общий гайд [`qa-guide.md`](qa-guide.md) (разделы 4, 6.9, 8.5); здесь — только то, что изменилось с этой
выкладкой.
Что выложено: arm-core `ddd607e` (DBML v5.19, приём результатов 1.x и 2.0, встроенный фронт = arm-web `test` `4a02512`),
tabular-parser `4d1709a`, scan-gateway `1d05b9e`, общий пакет `arm-statements` `3390f92`. Задача — RSHB/arm-ka-docs#116;
правила — `docs/context/05-domain-rules.md` §7, §9.5, §11; решения Р-1…Р-44 — `openspec/changes/unified-statement-normalization/design.md`.
Перед выкладкой все сценарии ниже прогнаны на локальном стенде (18–19.10.2026: 25 книг Excel, 6 PDF, 129 ОСВ,
сводная ОСВ двух периодов). Найденное там и не исправленное — в разделе 6: такие случаи **не заводите** как баги.
Как читать: раздел 1 — что изменилось, раздел 3 — что проверить перед началом, раздел 4 — справка по цветам, значкам
и текстам предупреждений, раздел 5 — чек-лист сценариев, разделы 6–7 — известное и «не баг», раздел 8 — как
заводить баги.
## 1. Что изменилось для пользователя
| Было | Стало |
|---|---|
| Excel (tabular-parser) и PDF (scan-gateway + ИС Сканирование) разбирались разными программами: одинаковая форма из Excel и из скана вела себя по-разному | Оба сервиса разбирают таблицу формы **одним общим кодом** (пакет `arm_statements`): одинаковые правила поиска колонки кодов, строк, сумм, проверок и статуса. Различается только чтение файла: лист Excel или ответ ИС Сканирование |
| Строки без кода («в том числе: …»), строки с нечитаемым кодом и строки без кода с суммами молча пропадали | **Строки не пропадают.** У каждой строки статус: обычная; **расшифровка** (строка без кода под строкой с кодом — «в том числе …»); **код не распознан** (в ячейке кода мусор: «ИЧ,250», «12 /»); **кода нет** (строка с суммами без кода в начале таблицы) |
| Повтор кода — вторая строка терялась | Повтор кода — законный случай (в ББ 2025 года две строки 1220 и две 1520): видны **все** строки, в проверках их суммы складываются |
| Оранжевой подсвечивалась любая ячейка с уверенностью распознавания ниже 100 % | Подсвечивается только то, что **требует внимания**: сомнительное значение, которое не подтвердила ни одна сошедшаяся контрольная проверка (§7), сомнительный код строки, поле шапки. Сомнительная ячейка, подтверждённая проверкой, не подсвечивается, но в подсказке видно, что распознано и с какой уверенностью |
| Предупреждения сервисов нигде не показывались | Предупреждения — у места: список «Предупреждения (N)» над таблицей (уровни «Ошибка» и «Информация», ссылка «Показать»), значок у ячейки, строки, заголовка колонки и поля шапки; в панели «Первичные документы» под статусом документа — значок с числом, по клику — список |
| Подтвердить можно было любую форму без нарушений | Новые блокировки: «Подтвердить данные» неактивна, пока есть строки без кода **с суммами** («Разберите строки без кода: N»); вторая форма того же типа и периода в одном файле не подтверждается, если первая уже подтверждена |
| Соотношение §7 с пустой целью пропускалось | Соотношение считается, если заполнена хоть одна его сторона: пустой итог при заполненных слагаемых — нарушение «цель не заполнена»; лист только с активом даёт нарушение `1600 = 1700` |
| — | В режиме «Редактировать»: назначить или сменить код строки, «Это расшифровка» / «Сделать расшифровкой», «Подтвердить код», подтвердить значение без правки (серая галочка), поставить или подтвердить дату колонки, подтвердить дату отчёта, править наименование организации |
| Числа правее таблицы (формулы аналитика в свободных столбцах) становились колонкой без даты | Столбец без подписи правее последней колонки с периодом в форму не попадает; вместо ошибки — «Информация»: «числа правее таблицы формы не учитываются: <адреса ячеек>» (правило Р-44) |
| Формы из PDF почти всегда «Требуется проверка» | Чистый скан, где все проверки сошлись, может подтвердиться автоматически (статус «Загружен» сразу) |
| ОСВ: предупреждения парсера не показывались | ОСВ разбирается как раньше; предупреждения листа видны в панели (значок с числом) и блоком «Предупреждения» на экране «Просмотр ОСВ» |
| Формы ББ/ОФР, загруженные до выкладки | **Удалены** очисткой перед выкладкой (раздел 3): их нужно загрузить заново, тогда они разберутся по новым правилам |
Чего нет и в этой выкладке не будет: склейки страниц формы из разных файлов (OQ-140) и половинок формы внутри одного
файла (Р-15), восстановления потерянных строк по наименованию (OQ-149), сопоставления формы без колонки кодов по
именам строк (OQ-139), переключателя «строки как в файле» (Р-14), удаления строк (вместо него — «Сделать расшифровкой»).
## 2. Как это работает
1. **Загрузка.** Аналитик загружает файл в панели «Первичные документы» ЮЛ (как раньше). Ядро сохраняет файл и
отправляет задание: Excel (`xls`, `xlsx`, `xlsb`) — в tabular-parser, PDF и картинки — в scan-gateway, который отдаёт
файл в ИС Сканирование и ждёт ответ (на скане — до нескольких минут).
2. **Чтение файла (шаг 1, у каждого сервиса своё).** tabular-parser читает листы книги, scan-gateway — json-ответы ИС.
Оба превращают каждую найденную форму в одинаковую «сетку» ячеек: текст, число (если оно есть в Excel), уверенность
распознавания (у Excel всегда 100 %), адрес ячейки.
3. **Нормализация (шаги 2–8, общий код).** Колонка кодов и наименований, колонки периодов и их даты, строки и их
статусы, разбор сумм, код и редакция формы (66н / ФСБУ 4), тип формы (ББ / ОФР / расшифровка), контрольные проверки
§7, признак «требует внимания» у каждой ячейки, строки и поля шапки, предупреждения, статус документа «готово» или
«нужна проверка».
4. **Результат 2.0.** Сервис кладёт результат в хранилище и сообщает ядру. Ядро сохраняет его **как пришёл** (ничего не
пересчитывает) и добавляет только свои сверки: ИНН и организация с ЮЛ, код в справочнике наименований, наименование
строки со справочным для сомнительных кодов, период — конец квартала.
5. **Автоподтверждение.** Документ «готово», ИНН совпал с ЮЛ, период — конец квартала, в файле нет ошибок уровня файла и
второй формы того же типа и периода → статус «Загружен» без участия аналитика. Иначе — «Требуется проверка».
6. **Экран проверки формы.** Аналитик смотрит подсвеченное, правит («Редактировать» → «Сохранить»). После каждого
сохранения ядро пересчитывает проверки §7 и статус **тем же общим кодом**: правленое или подтверждённое значение
больше не «требует внимания», принятые с комментарием нарушения не блокируют.
7. **Подтверждение.** «Подтвердить данные»: ядро проверяет по порядку — период определён → нет строк без кода с суммами
→ в файле нет уже подтверждённой формы того же типа и периода → нет непринятых жёстких нарушений §7. Подтверждённая
форма закрывает ячейку «Бух.баланс» / «ОФР» в «Организациях» версии консолидации и больше не правится.
## 3. Предусловия на стенде контура
Что владелец сделал при выкладке (уточните у него, если что-то не так):
1. **Резервная копия БД и очистка форм** скриптом ядра `scripts/purge_statements.py` (сначала `--dry-run` с отчётом,
затем `--apply`): удалены все документы «Бух. баланс» и «ОФР» с данными форм, комментариями и привязками к версиям
«в работе»; файлы, где кроме форм ничего нет, удалены целиком. ОСВ, консолидации, справочники не тронуты.
**Смешанные файлы** (в одной книге ОСВ и формы): по умолчанию у них удаляются только формы, файл с ОСВ остаётся;
с флагом `--include-mixed` — удаляются целиком. Спросите владельца, какой вариант применён (решение Р-27).
2. **Порядок выкладки «сначала ядро»:** arm-core (миграция v5.19, приём старых 1.x и новых 2.0 результатов) и его
встроенный фронт, затем tabular-parser и scan-gateway на контракте 2.0.
Как убедиться, что версия новая:
| Что | Как проверить | Признак новой версии |
|---|---|---|
| Ядро и экран | открыть любой документ ОСВ или форму | на экране «Просмотр ОСВ» над таблицей блок «Предупреждения (N)»; в панели «Первичные документы» под статусом документа — значок с числом (ⓘ / ❗ N) |
| tabular-parser (Excel) | загрузить любую ОСВ из 1С и нажать значок с числом под статусом | в разделе «Предупреждения документа» — «Информация: иерархия строк — по группировке листа (outline)». Старый сервис: вместо этого раздел «Предупреждения файла» с текстом вида `sheet=TDSheet hierarchy=outline` |
| scan-gateway (PDF) | загрузить PDF формы | в списке предупреждений документа тексты вида «Дата отчёта не разобрана», «склеенная строка сетки 73 разделена на 2 строк». Старый сервис: «Предупреждения файла» вида `<…>.json: table:0: строк с нечисловым кодом пропущено: 8` |
| Очистка форм | открыть панель документов ЮЛ, где до выкладки были ББ/ОФР | ни одного «Бух. баланс» / «ОФР» с датой загрузки раньше выкладки |
Если сервис ещё старый (окно перехода), формы и ОСВ всё равно принимаются и экран работает, но без новых сигналов
качества (сценарий N58). Это не баг — сообщите владельцу, что сервис не обновлён.
**Повторная загрузка после очистки.** Файл, удалённый целиком, загружается заново как новый. Смешанный файл, у
которого удалены только формы, повторно не загрузится: «файл … уже загружен для этого ЮЛ» (дубликат по содержимому).
Чтобы получить его формы — удалите файл (если его ОСВ не подтверждены вручную) и загрузите заново, либо загрузите копию,
пересохранённую в Excel.
**Файлы.** Репозиторий тестовых данных `fixtures` в контур не переносится. Ниже у каждого сценария указан файл из наших
фикстур (если у вас есть его копия) и чем он особенный — чтобы подобрать аналог среди отчётности на стенде. Загружайте
формы на ЮЛ с тем же ИНН, что в шапке формы: иначе «Контрагент ✗» и автоподтверждения не будет (это правильно, но
мешает проверять другое).
| Файл | Путь в fixtures | Что в нём особенного |
|---|---|---|
| Т1 | `statements-xlsx/mezheninovskaya/2025-Q3/1_Форма1_бух_09.xlsx` | чистый ББ из 1С, ФСБУ 4, три колонки (30.09.2025, 31.12.2024, 31.12.2023), 37 строк с кодом; правее таблицы в столбцах U–W числа и формулы аналитика; ИНН 7016006635 |
| Т2 | `statements-xlsx/mezheninovskaya/2025-Q3/1_Форма2_бух_09.xlsx` | чистый ОФР того же ЮЛ, две колонки |
| Т3 | `statements-xlsx/npz/2025-Q3/Бухгалтерская отчетность за Январь - Сентябрь 2025 г. (НОВОРОССИЙСКИЙ ПРОКАТНЫЙ ЗАВОД).xlsx` | одна книга: ББ на нескольких листах (листы 2–5 без шапки) и ОФР; в шапке ОФР нет ИНН; пятизначные подстроки (11501…) |
| Т4 | `statements-xlsx/unagrande-co/2024-FY/Б.Б Лист 1.xls` | постраничная печать 1С: в файле только страница 1 баланса (актив, есть 1600, нет 1700) |
| Т5 | `statements-xlsx/unagrande-co/2024-FY/Б.Б. Лист 2.xls` | страница 2 того же баланса (пассив) отдельным файлом: нет шапки (ни организации, ни ИНН, ни единиц), есть 1700, нет 1600 |
| Т6 | `statements-xlsx/synthetic/st01_both_forms_one_sheet.xlsx` | ББ и ОФР на одном листе |
| Т7 | `statements-xlsx/synthetic/st03_no_codes.xlsx` | форма без колонки кодов |
| Т8 | `statements-xlsx/synthetic/st04_mixed_book.xlsx` | книга: лист ОСВ и лист ББ |
| Т9 | `statements-xlsx/synthetic/st06_header_variants.xlsx` | ОФР и пять листов приложений (расшифровки, ОДДС, отчёт об изменениях капитала, целевое использование) |
| Т10 | `statements-xlsx/templates/ББ до 01.01.2025.xlsx` | пустой бланк банка: нет организации, ИНН, даты, сумм |
| Т11 | `ocr/aep_3.pdf` | плохой скан ББ и ОФР за 2024 год (66н): мусор в шапке, нечитаемые коды, 24 нарушения; второй json ответа ИС — ошибка |
| Т12 | `ocr/aep_6.pdf` | скан ООО «Дорстроймонтаж» на 30.06.2025 (ФСБУ 4): ИНН не распознан, в поле даты — текст организации, 20 расшифровок |
| Т13 | `statements/rb/Бухгалтерская отчетность 1 кв.25.pdf` | чистый скан ББ и ОФР АО «Русский бисквит» (ИНН 3528052718) за 1 кв. 2025: все проверки сходятся, 40 расшифровок в ББ, одна склеенная строка |
| Т14 | `statements/schastl/БО 1 кв 2025.PDF` | скан ООО «Пекарня Счастливочная» (ИНН 3528104476) за 1 кв. 2025: проверки сходятся, поле даты отчёта не разобрано |
Про PDF: на локальном стенде ответы ИС подставляет эмулятор (сохранённые ответы настоящей ИС), в контуре отвечает
настоящая ИС Сканирование. Распознавание может немного отличаться (другая уверенность, другие нечитаемые ячейки) — сверяйте
поведение по смыслу, а не точные числа предупреждений.
## 4. Справка: что видно на экране
### 4.1 Статусы и подсветка
| Что видно | Что значит |
|---|---|
| статус «Загружен» (зелёный) | документ подтверждён — пользователем или автоматически |
| статус «Требуется проверка» (оранжевый) | нужна проверка аналитика (так же выглядят документы, ставшие «Распознан» после правки, — `RECOGNIZED`) |
| статус «Ошибка» | файл не разобран (причина — во всплывающем списке значка) |
| оранжевый фон ячейки суммы | значение требует внимания: сомнительное и не подтверждено проверкой, или участвует в несошедшемся соотношении |
| оранжевый фон наименования и кода строки | сомнительный код строки: подтвердите («Подтвердить код») или смените |
| розовая строка целиком, код серым | строка без разобранного кода: «Код не распознан: «<текст>»» или «—» с подсказкой «Кода в строке нет» |
| голубой фон | исправлено аналитиком; подсказка «Исходное: …» |
| серая галочка перед суммой | значение подтверждено аналитиком без изменения («Подтверждено аналитиком» в подсказке) |
| серый текст в ячейке суммы | текст ячейки, который не удалось прочитать как число (подсказка «Не распознано как сумма: «…»») |
| фиолетовые строки 1600 / 1700 | итог «БАЛАНС» (как раньше) |
| красный значок ❗ / синий ⓘ у ячейки, строки, заголовка колонки, поля шапки | у этого места есть предупреждение уровня «Ошибка» / «Информация»; текст — в подсказке |
| переключатель «Показать расшифровки (N)» | в форме N строк-расшифровок; по умолчанию скрыты, включённые стоят под своей строкой с отступом, код пуст, подсказка «Расшифровка — в суммы формы не входит» |
| переключатель «Показать пустые строки детализации (N)» | пустые подстроки бланка скрыты (как раньше) |
| ссылка «Разберите строки без кода: N» над шапкой | в форме N строк без кода с суммами; клик ведёт к первой; «Подтвердить данные» неактивна |
| подсказка ячейки | «Распознано: «<сырой текст>»», «Уверенность: N%», «Исходное: …», «Подтверждено аналитиком», тексты предупреждений этой ячейки |
| подсказка поля шапки | «Распознано: «<текст>» · уверенность N%» или «Исходное: …» после правки |
| блоки над таблицей | «Проверки пройдены» (зелёный); «Нарушения (N)» (красный, жёсткие соотношения §7, блокируют подтверждение до «Принять с комментарием»); «Предупреждения проверок (N)» (жёлтый, мягкие соотношения, не блокируют); «Межформенная проверка ББ↔ОФР» (жёлтый, не блокирует); «Нарушения приняты»; «Предупреждения (N)» — предупреждения документа, показаны первые 3, «Показать все (N)» |
Уровни предупреждений: **«Ошибка»** — данные или их полнота под сомнением, документ не подтвердится автоматически;
**«Информация»** — к сведению, на статус не влияет.
### 4.2 Тексты предупреждений (справка)
Код виден в ответе API (`GET /documents/{id}/statement`, поле `issues[].code`) — его указывайте в баге.
| Код | Уровень | Текст на экране (пример) | Что значит и что делать |
|---|---|---|---|
| `JSON_FAILED` | Ошибка, файл | `INVALID_DOCUMENT: Не удалось определить тип документа. — file:<…>_ofr.json` | один из ответов ИС по файлу — ошибка: часть формы могла потеряться; документы файла не подтверждаются автоматически. Снимается только перезагрузкой |
| `TABLE_LOST`, `TABLE_PARSE_ERROR` | Ошибка, файл | — | таблица ответа ИС не разобрана; перезагрузка |
| `CODE_COLUMN_NOT_FOUND` | Ошибка | «столбец кодов строк не найден» | форма без колонки кодов: строк из файла нет, только пустые строки бланка |
| `SEGMENT_WITHOUT_CODES`, `SHEET_NOT_JOINED`, `CONTINUATION_TYPE_CONFLICT` | Ошибка | — | лист или страница-продолжение не присоединились к форме; перезагрузка |
| `SEGMENT_COLUMNS_MISMATCH` | Ошибка | «в сегменте со строки N колонок значений 1, в первом сегменте 0…» | на продолжении другое число колонок сумм; значения разложены по порядку — проверьте; перезагрузка |
| `HEADER_ROW_NOT_FOUND` | Ошибка | «строка заголовка таблицы не найдена» | у колонок нет подписей и дат; заголовки «Колонка N» |
| `COLUMN_WITHOUT_DATE` | Ошибка | «у столбца N с числами нет разобранной подписи периода» | колонка с суммами без даты; поставьте дату колонке в режиме правки |
| `COLUMN_DATE_UNCERTAIN` | Ошибка | «дата подписи столбца N («…») не подтверждена» | дата колонки распознана неуверенно; проверьте и нажмите «Подтвердить» под датой колонки |
| `TYPE_CONFLICT` | Ошибка | «тип по кодам строк (…) противоречит типу по заголовку (…)» | перезагрузка |
| `NO_ORGANIZATION_NO_INN` | Ошибка | «В шапке нет ни организации, ни ИНН» | впишите ИНН или организацию в шапке — предупреждение снимется |
| `PERIOD_UNKNOWN` | Ошибка | «Отчётный период не определён: нет ни даты отчёта, ни дат колонок» | впишите дату отчёта |
| `REPORT_DATE_UNCERTAIN` | Ошибка | «Дата отчёта неуверенна и не подтверждена колонками» | проверьте дату и нажмите «Подтвердить» под полем или исправьте |
| `XLSB_SCALE_SUSPECT` | Ошибка | — | книга xlsb, «тыс. руб.» и суммы с копейками: возможен масштаб ×1000 |
| `INN_NOT_FOUND`, `INN_UNCERTAIN` | Информация | «ИНН не найден», «ИНН распознан неуверенно» | ИНН сверяет ядро с ЮЛ («Контрагент ✓/✗») |
| `ORGANIZATION_NOT_FOUND`, `ORGANIZATION_UNCERTAIN` | Информация | «Организация не найдена», «Название организации распознано неуверенно» | к сведению |
| `REPORT_DATE_UNPARSED` | Информация | «Дата отчёта не разобрана» | период взят по датам колонок; можно вписать дату |
| `UNITS_NOT_FOUND` | Информация | «Единицы измерения не найдены» | впишите единицу в шапке |
| `COLUMN_SKIPPED` | Информация | «столбец N («Изменение») пропущен: не период» | служебная колонка («Изменение», «Отклонение», «%», «Примечание») не взята |
| `FRACTIONAL_IN_THOUSANDS` | Информация | «единицы «тыс. руб.», но N из M значений с дробной частью» | проверьте единицы |
| `XLSB_NO_FORMATS`, `NUMBER_FORMAT_UNPARSED`, `VALUE_OUT_OF_RANGE`, `XLS_NO_CODEPAGE`, `FILE_TYPE_MISMATCH`, `SHEET_OTHER`, `TABLE_SKIPPED` | Информация | — | особенности файла, на данные не влияют |
| `ROW_SPLIT` | Информация | «склеенная строка сетки 73 разделена на 2 строк» | ИС склеила две строки бланка в одну, сервис их разделил; суммы проверены соотношениями |
| `NUMBERS_OUTSIDE_TABLE` | Информация | «числа правее таблицы формы не учитываются: TDSheet!V45, …» | числа справа от таблицы (формулы аналитика) в форму не взяты (Р-44) |
| `RELATION_FAILED` | Ошибка | блок «Нарушения»: «Колонка N: 1600 = 1100 + 1200 — ожидалось X, получено Y» | жёсткое соотношение §7 не сошлось |
| `RELATION_SOFT` | Информация | блок «Предупреждения проверок» | мягкое соотношение (подстроки, 2400, расхождение в пределах округления) — не блокирует |
| `CODE_NOT_IN_DICTIONARY` | Информация (ядро) | «кода 2350 нет в словаре наименований редакции» | код не из справочника банка; наименование — из файла |
| `CODE_NOT_IN_EDITION` | Информация (ядро) | «код N не входит в перечень кодов редакции формы» | к сведению |
| `NAME_MISMATCH` | Информация (ядро) | «наименование «Целевой капитал» не совпало со справочным для кода 1320» | у строки с сомнительным кодом наименование не совпало со справочным: такая форма не подтверждается автоматически; проверьте код |
| `STATEMENTS_VERSION_MISMATCH` | Информация (ядро) | «форма распознана общим кодом версии X, в ядре версия Y» | после правки, если сервис и ядро на разных версиях общего кода; к сведению |
| `MAPPING_WARNING` | Информация (ядро) | тексты обработки, как раньше («период формы не определён …») | к сведению |
| `LEGACY_WARNING` | Информация | старый текст предупреждения сервиса | результат от сервиса старой версии (1.x), см. N58 |
| `OSV_*` | Информация | «иерархия строк — по группировке листа (outline)» и др. | предупреждения листа ОСВ, на статус не влияют |
## 5. Чек-лист сценариев
Отмечайте: ✅ ожидание совпало / ❌ баг (с номером issue) / ⚠️ вопрос. Пользователь — аналитик с правом правки
документов (как `ka_go` на локальном стенде). Сценарии с пометкой **(спека)** на локальном стенде не прогонялись —
ожидание взято из правил; расхождение — повод для вопроса, а не обязательно баг.
### 5.1 Excel: ББ и ОФР
| № | Файл | Шаги | Ожидание |
|---|---|---|---|
| N1 | Т1 | загрузить на ЮЛ с ИНН шапки, дождаться обработки (5–15 с), открыть «Бух. баланс» | «Загружен» сразу (автоподтверждение), «Контрагент ✓»; под статусом синий значок «ⓘ 1». На экране: «Проверки пройдены»; «Предупреждения (1)» — «Информация: числа правее таблицы формы не учитываются: TDSheet!V45, TDSheet!W57, …»; три колонки с датами из подписей; оранжевых ячеек нет; столбцов U–W в таблице нет |
| N2 | Т2 | загрузить тому же ЮЛ, открыть «ОФР» | «Загружен»; две колонки периодов; блок «Межформенная проверка ББ↔ОФР» может появиться — он жёлтый и подтверждение не блокирует |
| N3 | Т3 | загрузить на ЮЛ НПЗ, открыть оба документа | два документа из одной книги: «Бух. баланс» и «ОФР». В ББ — строки **всех** листов (листы без шапки присоединены, ни одна строка не потеряна), пятизначные подстроки под своей строкой; «Предупреждения проверок (N)» по подстрокам (11501…, 14101…) — жёлтые, не блокируют. В ОФР — «Информация: ИНН не найден». Оба «Загружен», если организация совпала с ЮЛ |
| N4 | Т4 | загрузить, открыть ББ | «Требуется проверка»; «Нарушения (3)»: «Колонка N: 1600 = 1700 — ожидалось <сумма 1600>, получено —» по каждой колонке (1700 на этом листе нет). Номер колонки — см. известное замечание I-1. «Принять с комментарием» → комментарий → «Принять» → «Нарушения приняты»; «Подтвердить данные» проходит |
| N5 | Т5 | загрузить на другое ЮЛ (не то, где Т4), открыть ББ | «Требуется проверка»; в шапке все поля «—»; «Предупреждения»: «Ошибка: В шапке нет ни организации, ни ИНН», «Информация: Единицы измерения не найдены»; «Нарушения»: «1600 = 1700 — цель не заполнена, получено <сумма 1700>». «Редактировать» → вписать ИНН → «Сохранить»: ошибка про организацию и ИНН исчезла (информация про единицы остаётся — M-4) |
| N6 | Т6 | загрузить, открыть оба документа | из одного листа два документа: «Бух. баланс» (коды 1xxx) и «ОФР» (коды 2xxx) |
| N7 | Т7 | загрузить, открыть ББ | «Требуется проверка»; «Ошибка: столбец кодов строк не найден»; в таблице только пустые строки бланка («-»), строк из файла нет. «Подтвердить данные» активна и проходит — известное замечание I-4 |
| N8 | Т10 | загрузить, открыть ББ, нажать «Подтвердить данные» | «Требуется проверка»; «Ошибка: Отчётный период не определён…», «Ошибка: В шапке нет ни организации, ни ИНН»; подтверждение — красный блок «<текст сервера>. Исправьте дату отчёта в шапке и сохраните.» (`PERIOD_REQUIRED`) |
| N9 | свой: любой ББ, в свободный столбец справа от таблицы (без подписи) вписать несколько чисел в строках с кодами | загрузить, открыть | статус как у исходного файла; «Информация: числа правее таблицы формы не учитываются: <адреса ваших ячеек>»; лишней колонки в форме нет |
| N10 | свой: тот же ББ, но над столбцом с числами подпись «Итог» (не период) и столбец **между** колонками периодов | загрузить, открыть | колонка «Итог» в форме без даты; «Ошибка» у заголовка колонки: «у столбца N с числами нет разобранной подписи периода»; «Требуется проверка». «Редактировать» → под заголовком колонки поле «ГГГГ-ММ-ДД» → дата → «Сохранить»: заголовок «На <дата>», ошибка снята. Подпись «Изменение» / «%» / «Примечание» → колонка не взята, «Информация: столбец N («Изменение») пропущен: не период» |
| N11 | свой (спека): ББ с единицей «тыс. руб.», где суммы с копейками; то же, сохранённое как xlsb | загрузить оба | xlsx: «Информация: единицы «тыс. руб.», но N из M значений с дробной частью», статус не меняется; xlsb: «Ошибка» (подозрение на масштаб ×1000), «Требуется проверка» |
### 5.2 PDF: ББ и ОФР
| № | Файл | Шаги | Ожидание |
|---|---|---|---|
| N12 | Т13 | загрузить на ЮЛ «Русский бисквит», дождаться (до нескольких минут), открыть «Бух. баланс» | оба документа «Загружен» (автоподтверждение скана); в ББ «Проверки пройдены», «Информация: склеенная строка сетки N разделена на 2 строк» со ссылкой «Показать»; переключатель «Показать расшифровки (40)»; колонки «На 31 марта 2025 г.» и т. п.; оранжевых ячеек нет |
| N13 | Т14 | загрузить на ЮЛ «Пекарня Счастливочная», открыть ББ | «Загружен»; в шапке «Дата отчёта» — «—» с синим ⓘ «Дата отчёта не разобрана» (известное замечание I-2); период документа в панели — «2025 К1» (по датам колонок); «Показать расшифровки (20)» |
| N14 | Т11 | загрузить на любое ЮЛ, открыть «Бух. баланс» | «Требуется проверка», «Контрагент ✗»; ссылка «Разберите строки без кода: 5», «Подтвердить данные» неактивна; «Нарушения (24)»; «Предупреждения»: «Ошибка: строка заголовка таблицы не найдена», «Ошибка: Дата отчёта неуверенна и не подтверждена колонками», «Информация: ИНН распознан неуверенно», «Информация: Название организации распознано неуверенно», «Информация: наименование «…» не совпало со справочным для кода 1320»; колонки «Колонка 3», «Колонка 5», «Колонка 6» (I-1); поле «Дата отчёта» оранжевое. В панели значок ❗ с числом, в списке «Предупреждения файла» — «Ошибка: INVALID_DOCUMENT …_ofr.json» (на эмуляторе; в контуре — если ИС снова вернёт ошибку по второй части) |
| N15 | Т12 | загрузить, открыть ББ и ОФР | ББ: «Требуется проверка», «Проверки пройдены»; «ИНН —» с ⓘ «ИНН не найден», «Дата отчёта —» с ⓘ «Дата отчёта не разобрана»; «Предупреждения (3)», среди них «Информация: наименование «…» не совпало со справочным для кода 1530» со ссылкой «Показать»; две розовые строки «код не распознан» **без сумм** — подтверждение они не блокируют (ссылки «Разберите строки…» нет, «Подтвердить данные» активна); «Показать расшифровки (20)». ОФР: «Нарушения (1)» по `2300 = 2200 + 2310 + 2320 - 2330 + 2340 - 2350`, «Предупреждения проверок (1)» по `2410 = 2411 + 2412` |
| N16 | PDF, который ИС не может разобрать (не отчётность, пустая страница) | загрузить | файл «Ошибка»; в списке значка — «Предупреждения файла»: «Ошибка» с текстом ИС (например, «INVALID_DOCUMENT: Не удалось определить тип документа») |
### 5.3 Шапка: организация, ИНН, дата, единицы
| № | Файл | Шаги | Ожидание |
|---|---|---|---|
| N17 | Т11 или Т14 | навести на поля шапки | подсказка «Распознано: «<текст>» · уверенность N%»; поле из списка «требует внимания» — оранжевое |
| N18 | Т11 (дата 31.12.2024 оранжевая, «Ошибка: Дата отчёта неуверенна…») | «Редактировать» → под полем даты «Подтвердить» (станет «Подтверждено») → «Сохранить» | дата та же, оранжевый фон снят, ошибка про дату исчезла из списка; изменения сохранены одним запросом |
| N19 | любая неподтверждённая форма | дата отчёта `2025-06-30` → «Сохранить»; затем `2025-09-15` → «Сохранить» → «Подтвердить данные» | период документа пересчитан (2025 К2); у колонок с относительными подписями («На отчётную дату») даты пересчитаны; дата не на конец квартала — подтверждение: «… Исправьте дату отчёта в шапке и сохраните.» Дата вводится строго `ГГГГ-ММ-ДД` |
| N20 | любая неподтверждённая форма | ИНН `123` → «Сохранить»; затем ИНН другого ЮЛ | `123` — ошибка с текстом сервера (неверный ИНН), ничего не сохранено; другой ИНН — сохранено, поле голубое («Исходное: …»), в панели «Контрагент ✗» |
| N21 | Т5 | «Организация» — вписать наименование ЮЛ → «Сохранить» | сохранено, поле голубое (подсказки «Распознано» нет — в файле организации не было); «Контрагент» пересчитан; «Ошибка: В шапке нет ни организации, ни ИНН» снята. Текст длиннее 1000 символов — «Наименование организации — не длиннее 1000 символов», запрос не уходит |
| N22 | Т5 | «Единица измерения» → `тыс. руб.` → «Сохранить» | сохранено, поле голубое. Очистить поле шапки нельзя — только заменить (как раньше). ОКУД, ОКПО, ОКЕИ, адрес на экране не показываются |
### 5.4 Строки и коды
Удобный файл — Т11 (пять строк без кода с суммами, расшифровки, сомнительные коды); на стенде контура — любой плохой
скан, где после загрузки есть ссылка «Разберите строки без кода».
| № | Шаги | Ожидание |
|---|---|---|
| N23 | найти розовые строки | строка «код не распознан» стоит сразу под строкой, после которой она шла в файле (например, «12 /» — под предыдущей строкой раздела); в ячейке кода серый сырой текст, подсказка «Код не распознан: «12 /»». Строка «кода нет» — «—», подсказка «Кода в строке нет»; без строки выше — в начале первого раздела |
| N24 | включить «Показать расшифровки (N)» | расшифровки появились под своими строками с отступом, код пуст; оранжевой подсветки у их сумм нет, подсказка с распознанным текстом есть; выключить — скрыты. Итоги разделов и проверки расшифровки не учитывают |
| N25 | «Редактировать» → в поле «Код» розовой строки начать вводить `12` | выпадает подсказка «1230 — Дебиторская задолженность» и т. п. (справочник редакции формы); выбрать → «Сохранить» → «Изменения сохранены»; строка переехала на место кода, не розовая, подсказка кода «Код назначен аналитиком»; счётчик «Разберите строки без кода» уменьшился; проверки пересчитаны |
| N26 | в поле «Код» ввести `12` или `abc` → «Сохранить» | красная рамка у поля, «Код — 4 или 5 цифр», запрос не уходит |
| N27 | у розовой строки меню «⋮» → «Это расшифровка» → «Сохранить» | до сохранения у кода тег «→ расшифровка»; после — строка ушла в расшифровки (видна при включённом переключателе), счётчик «Разберите строки…» уменьшился |
| N28 | у обычной строки из файла «⋮» → «Сделать расшифровкой» → «Сохранить»; затем у неё же (в расшифровках) «⋮» → «Назначить код» → прежний код → «Сохранить» | строка ушла в расшифровки и её суммы перестали участвовать в проверках (могут появиться нарушения); после назначения кода — вернулась на место. У пустых строк бланка (достроенных) меню нет |
| N29 | у обычной строки «⋮» → «Сменить код» → другой код → «Сохранить» | строка переехала на место нового кода, подсказка «Код назначен аналитиком»; «⋮» → «Отменить изменение строки» до сохранения возвращает как было |
| N30 | строка с оранжевыми наименованием и кодом (подсказка кода «Уверенность кода: 50%») → «⋮» → «Подтвердить код» → «Сохранить» | тег «→ код подтверждён» до сохранения; после — подсветка снята, подсказка «Код подтверждён»; «⋮» → «Снять подтверждение кода» → «Сохранить» — подсветка вернулась |
| N31 | форма с законным повтором кода (ББ 2025 из 1С: две строки 1220 — «НДС, начисленный по отгрузке» и НДС по приобретённым ценностям; или 1520 «Обязательство по аренде») | обе строки видны, в порядке файла; в проверках §7 их суммы складываются; предупреждения о повторе нет |
| N32 | (спека) назначить пустой строке бланка `X` сумму → «Сохранить»; затем другой строке назначить код `X` → «Сохранить»; затем сделать оба действия одним сохранением | 409 у поля кода: текст сервера «код занят строкой, созданной правкой, с суммами», ничего не сохранено; одним сохранением — «Код X назначается строке, а в шаблонную строку X введены суммы — сохраните по очереди», запрос не уходит. Назначение кода, который уже есть у **строки из файла**, разрешено (повтор кода законен, см. M-1) |
### 5.5 Суммы и правка
| № | Шаги | Ожидание |
|---|---|---|
| N33 | Т11 или Т12: навести на оранжевую ячейку и на неподсвеченную | у обеих подсказка «Распознано: «…»», «Уверенность: N%»; неподсвеченная с уверенностью ниже 100 % — значит, её подтвердила сошедшаяся проверка (так задумано, Р-7) |
| N34 | «Редактировать» → сумма в ячейке → «Сохранить» | ячейка голубая, подсказка «Исходное: <было>»; проверки и статус пересчитаны; вернуть исходную сумму → голубой фон снят. Ввод `abc` или `1.234` — красная рамка «Неверный формат суммы», запрос не уходит |
| N35 | «Редактировать» → у оранжевой ячейки кнопка ✓ «Подтвердить значение» → «Сохранить» | до сохранения кнопка синяя, подсказка «Подтверждение будет сохранено — нажмите, чтобы убрать»; после — серая галочка перед суммой, оранжевый фон снят, ячейка **не** голубая, сумма прежняя; подсказка «Подтверждено аналитиком». Кнопка ↶ «Снять подтверждение» → «Сохранить» — подсветка вернулась. Ввод суммы в ту же ячейку отменяет подтверждение |
| N36 | ячейка с серым текстом (не число) → «Редактировать» | в поле ввода — пусто (нераспознанный текст не показан, M-3); вписать сумму → «Сохранить» → сумма, голубая |
| N37 | «Редактировать» → поменять суммы → «Отменить» | правки сброшены, запроса нет |
| N38 | (для тех, у кого есть доступ к БД аудита) после N34–N35 | одна запись `RECOGNIZED_DATA_EDIT` на одно сохранение с `before`/`after` |
### 5.6 Проверки §7
| № | Шаги | Ожидание |
|---|---|---|
| N39 | неподтверждённая форма без нарушений: увеличить сумму 1600 первой колонки на 100 → «Сохранить» | «Нарушения (N)»: «Колонка N: 1600 = 1100 + 1200 — ожидалось X, получено Y» и/или `1600 = 1700`; ячейки соотношения оранжевые; статус «Требуется проверка». «Показать» прокручивает к строке (без рамки — F-1) |
| N40 | «Подтвердить данные» | красный блок с текстом сервера и списком нарушений; документ не подтверждён |
| N41 | «Принять с комментарием» при несохранённых правках; затем после сохранения | при несохранённых — кнопка неактивна, подсказка «Сначала сохраните изменения»; окно «Принять нарушения»: с пустым комментарием «Принять» неактивна; после — «Нарушения приняты» с датой и комментарием; «Подтвердить данные» проходит |
| N42 | после N41: подтвердить ячейку (N35) → «Сохранить»; затем изменить сумму → «Сохранить» | подтверждение ячейки, кода или даты принятие **не** сбрасывает; правка суммы сбрасывает («Нарушения приняты» пропал) |
| N43 | вернуть сумму 1600 → «Сохранить» | «Проверки пройдены»; статус «Требуется проверка» до ручного подтверждения (после правки форма не подтверждается автоматически) |
| N44 | в чистой форме очистить ячейку 1600 (пустое поле) → «Сохранить» | нарушение «1600 = 1100 + 1200 — цель не заполнена, получено <сумма>»: пустой итог при заполненных слагаемых — теперь нарушение |
| N45 | Т3 или Т4: блок «Предупреждения проверок (N)» | жёлтый, «Показать» у каждой строки; подтверждение не блокирует, «Принять» для них не нужно |
### 5.7 Подтверждение формы и блокировки
| № | Шаги | Ожидание |
|---|---|---|
| N46 | Т11, ББ: ссылка «Разберите строки без кода: 5» | клик — прокрутка к первой такой строке; «Подтвердить данные» неактивна. Разобрать все пять (назначить код или «Это расшифровка», N25/N27) → кнопка активна (останутся нарушения — их принять, N41) |
| N47 | (спека) книга Excel с двумя листами одной формы за один период (скопировать лист ББ с шапкой) | в файле два документа «Бух. баланс», оба «Требуется проверка» (ни один не подтверждается автоматически); подтвердить первый — проходит; второй — красный блок с текстом сервера и ссылкой «Открыть подтверждённую форму» |
| N48 | подтверждённая форма | «Редактировать» и «Подтвердить данные» неактивны, «Принять с комментарием» нет; читать и смотреть подсказки можно |
| N49 | Т13 или Т1 на ЮЛ **с другим** ИНН | «Требуется проверка», «Контрагент ✗»; ручное подтверждение проходит |
### 5.8 Повторная загрузка и автозамена
| № | Шаги | Ожидание |
|---|---|---|
| N50 | загрузить тот же файл ещё раз | «Отклонено: 1», «<имя> — файл «<имя>» уже загружен для этого ЮЛ» |
| N51 | форма ББ за период уже загружена; загрузить другой файл ББ того же ЮЛ и периода (например, тот же, пересохранённый в Excel) | старый файл «Заменён» (виден по переключателю «Все документы организации»), новая форма разобрана заново; подтверждённая старая форма тоже заменяется (как раньше). Подтвердить документ заменённого файла нельзя |
| N52 | Т4 подтвердить; затем тому же ЮЛ загрузить Т5 | файл Т4 «Заменён» файлом Т5 — известное замечание I-3 |
| N53 | после очистки: файл, где были только формы и который загружали до выкладки | загружается заново как новый, формы разобраны по новым правилам. Смешанный файл (ОСВ + формы), у которого удалены только формы, — «уже загружен» (раздел 3) |
### 5.9 Файлы с несколькими документами
| № | Файл | Ожидание |
|---|---|---|
| N54 | Т8 | два документа: «ОСВ <счёт>» и «Бух. баланс»; статус каждого — свой (ОСВ не ждёт формы и наоборот) |
| N55 | Т9 | «ОФР» и «Расшифровка»; приложения дают **один** документ «Расшифровка» вместо пяти — известное замечание M-9; документ «Расшифровка» не открывается (как раньше) |
| N56 | Т11 | ББ и ОФР из одного PDF; при ошибке по части ответа ИС («Предупреждения файла»: «Ошибка: … .json») ни один документ файла не подтверждается автоматически |
### 5.10 ОСВ не сломалась (регресс)
| № | Шаги | Ожидание |
|---|---|---|
| N57 | загрузить ОСВ из 1С (любой счёт), открыть | как раньше: «Загружен» для чистой ОСВ, «Требуется проверка» при чужой организации в шапке; экран «Просмотр ОСВ» — **плоская** таблица (колонки «Субсчёт», «Контрагент», «ИНН», шесть сумм, внизу «Итого по документу»), поиск «Контрагент или ИНН», фильтр «Субсчёт», «Строк: N»; над таблицей «Предупреждения (1)» — «Информация: иерархия строк — по группировке листа (outline)»; в панели у каждой ОСВ значок «ⓘ 1» (O-2). Суммы «Итого по документу» равны строке «Итого» файла |
| N58 | (окно перехода, если tabular-parser или scan-gateway ещё старые) загрузить ОСВ и форму | принимаются, экран работает; у форм все строки обычные, расшифровок и розовых строк нет; в значке документа — «Предупреждения файла» уровня «Информация» со старыми текстами (`LEGACY_WARNING`). Не баг — сообщите владельцу |
| N59 | ОСВ сч. 01 за 2-й или 3-й квартал без оборотов (Счастливочная 2025 Q2 / Q3) | «Требуется проверка» вместо «Загружен» — известное замечание I-5 |
### 5.11 Консолидация и сводная ОСВ (регресс)
Контрольные цифры — на комплекте РБ и Счастливочной (те же файлы, что в наших фикстурах `osv/rb/`, `osv/schastl/`,
22 ОСВ за 2024 Q1–Q3; порядок загрузки — `qa-guide.md` 7.1, W18). На других данных сравните свод с выгрузкой до
выкладки, если она есть.
| № | Шаги | Ожидание |
|---|---|---|
| N60 | версия «Русский Бисквит» 2024 К3, все 22 ОСВ подтверждены, «К отчётности →» | «Строк: 1385»; баннер «… Осталось: 1236.»; «Пробелы: 7» (РБ 01, 58.03, 66, 67, 76; Счастливочная 01, 02); фильтр «Тип контрагента»: «ГСК» — 10, «ГК» — 26, «Внешний» — 1349 строк (сумма 1385) |
| N61 | фильтры «Компания ГК» = Счастливочная, «Контрагенты» = `бисквит` | «Строк: 6» (`60.01`, `60.02`, `62.01`, `62.02`, `76.06`, `76.АВ`), суммы — как в `qa-guide.md` 7.2 и W32 |
| N62 | версия 2025 К1 тех же ЮЛ (16 ОСВ за 1 кв. 2025) | «Строк: 1421», пробелов нет |
| N63 | в версии загрузить и подтвердить ББ и ОФР ЮЛ за период версии | в «Организациях» у ЮЛ «Бух.баланс» и «ОФР» — «Загружен»; формы в свод ОСВ не входят; форма за другой квартал ячейку не закрывает |
| N64 | «Экспорт» свода | xlsx открывается, число строк = «Строк» на экране, лист «Пробелы» |
### 5.12 Права
| № | Пользователь | Шаги | Ожидание |
|---|---|---|---|
| N65 | только просмотр (эксперт) | открыть форму; «Редактировать» → «Сохранить»; «Принять с комментарием»; «Подтвердить данные» | форма и подсказки видны; каждое действие — уведомление с текстом сервера «недостаточно прав: требуется DOCUMENT_EDIT», ничего не изменилось |
| N66 | пользователь другого филиала | открыть форму ЮЛ чужого филиала по ссылке | «не найдено» (как у несуществующего документа) |
## 6. Известные замечания (не заводить как баги)
Найдены на приёмочных прогонах 18–19.10.2026, исправляются одной пачкой. Если видите то же самое — отметьте «известно,
<номер>» и идите дальше. Если проявление другое или хуже — заводите баг со ссылкой на номер.
| № | Где | Как проявляется |
|---|---|---|
| I-1 | список «Нарушения» и «Предупреждения проверок»; заголовки колонок без подписи и даты | «Колонка N» — это номер столбца листа Excel (или таблицы ИС), а не порядковый номер колонки формы. Унагранде «Б.Б Лист 1» — «Колонка 25», «Колонка 29», «Колонка 36» (столбцы Y, AC, AJ листа) вместо 1, 2, 3; скан aep_3 — заголовки «Колонка 3», «Колонка 5», «Колонка 6». Сверяйте по подписи колонки или по порядку |
| I-2 | шапка формы из PDF | у «БО 1 кв 2025» (и aep_6) «Дата отчёта» пустая с «Информация: Дата отчёта не разобрана», а в подсказке поля «Распознано: «Общество с ограниченной ответственностью "Пекарня»» — ИС кладёт в поле даты текст организации. Период документа верный (по датам колонок) |
| I-3 | автозамена | страница 2 баланса без шапки («Лист 2», отдельный файл) того же ЮЛ и периода заменяет уже подтверждённую страницу 1 («Лист 1»): файл страницы 1 становится «Заменён». Склейки страниц из разных файлов нет (OQ-140) |
| I-4 | «Подтвердить данные» | подтверждение проходит у формы без единого значения (файл без колонки кодов — только пустые строки бланка) и у формы с предупреждениями уровня «Ошибка» («В шапке нет ни организации, ни ИНН» у страницы без шапки). Предупреждения «Ошибка» запрещают только автоподтверждение |
| I-5 | ОСВ | квартальная ОСВ сч. 01 без оборотов (Счастливочная 2025 Q2 и Q3) считается «нарастающей» и получает «Требуется проверка»; правило «нарастающая по данным Q1» — со Среза 2c, не новое (проверяется, регрессия ли) |
| M-1 | назначение кода | назначение строке кода, который уже есть у другой строки **из файла**, проходит без предупреждения. Так по правилам: повтор кода законен (Р-4), а ошибка «код занят» возникает только против строки, созданной аналитиком, с суммами. Нужна ли подсказка о повторе — вопрос владельцу |
| M-2 | API | уточнено, не дефект: `PATCH …/statement` с полем `is_detail` отклоняется (422), потому что такого поля нет; «сделать расшифровкой» — `lines: [{line_id, line_status: "detail"}]`, экран отправляет именно так |
| M-3 | режим «Редактировать» | в поле суммы — сырое значение без форматирования («30127.00» вместо «30 127»); у ячейки с нераспознанным текстом (серый текст) поле пустое — текст в режиме правки не виден |
| M-4 | шапка | правка поля снимает только связанные с ним предупреждения «Ошибка» («В шапке нет ни организации, ни ИНН», «Отчётный период не определён», «Дата отчёта неуверенна…») и «Дата отчёта не разобрана». «Информация» «ИНН не найден», «ИНН распознан неуверенно», «Название организации распознано неуверенно», «Единицы измерения не найдены» остаются в списке и после исправления поля |
| M-5 | тексты | у форм, принятых от старого (1.x) и нового (2.0) сервиса, одни и те же ситуации описаны разными словами |
| M-6 | ОСВ | ОСВ в «Требуется проверка», хотя в её списке предупреждений только «Информация» (Агрокомплекс ОСВ 62 и 76 за 9 мес. 2025, НКЗ 58): причина (несошедшиеся суммы, признак «нарастающая») на экране не видна |
| M-7 | шапка формы из PDF | в «Организация» мусор: ведущее «:» и перенос строки внутри («Общество с ограниченной ответственностью "Пекарня : "Счастливочная""», «: Акционерное общество "Русский бисквит"»); у плохого скана — весь текст верха страницы |
| M-8 | тексты нарушений | при пустой стороне соотношения формулировки непонятны: «цель не заполнена, получено X» (пустой итог) и «ожидалось X, получено —» (пустые слагаемые); нарушения в списке идут не по порядку колонок |
| M-9 | книга с приложениями | несколько листов приложений (пояснения, ОДДС, отчёт об изменениях капитала) дают один документ «Расшифровка» вместо отдельного на каждый лист (st06: 5 → 1) |
| O-2 | панель «Первичные документы» | у каждой ОСВ под статусом синий значок «ⓘ 1» — это информационное «иерархия строк — по группировке листа (outline)» (`OSV_HIERARCHY_BY_OUTLINE`); шумит, ничего не значит |
| F-1 | экран формы | «Показать» в блоках «Нарушения» и «Предупреждения проверок» прокручивает к строке, но не обводит её рамкой (у «Показать» в «Предупреждениях» рамка есть) |
| F-2 | экран формы | значок ⓘ / ❗ слева от суммы стоит в разных строках на разной высоте и на разном расстоянии от края — колонка «прыгает» |
## 7. Что не считать багом (так задумано)
- Строки без кода, «в том числе …», строки с нечитаемым кодом теперь видны — раньше они пропадали молча (Р-8).
- Две строки с одним кодом — обе на экране, в проверках сумма (Р-4).
- Сомнительная ячейка (уверенность ниже 100 %, текст с мусором) без подсветки, если её подтвердила сошедшаяся
проверка §7; сомнительный текст остаётся в подсказке (Р-7). Подсветки по уверенности «напрямую» нет.
- Суммы расшифровок не подсвечиваются, не входят в итоги, проверки, сводную ОСВ и КФО (Р-8, Р-23).
- Скан может подтвердиться автоматически — так задумано, если все проверки сошлись.
- Лист только с активом или только с пассивом (постраничная печать 1С) — нарушение `1600 = 1700` и «Требуется проверка»:
пустая сторона соотношения теперь нарушение. Решение — «Принять с комментарием» или загрузить файл с полной формой.
- Мягкие соотношения («Предупреждения проверок»: подстроки 11501…, 2400, расхождение в пределах округления) и
межформенная проверка ББ↔ОФР подтверждение не блокируют.
- Числа правее таблицы не попадают в форму (Р-44). Цена правила: настоящая колонка сумм без подписи справа тоже будет
отброшена с «Информация» — если видите такую, это вопрос, а не баг.
- Некоторые «Ошибки» снимаются только перезагрузкой исправленного файла: колонки продолжения не совпали, строка
заголовка не найдена, тип по кодам противоречит заголовку, потерянная часть ответа ИС, лист не присоединился, xlsb с
подозрением на масштаб.
- Строки удалить нельзя (первичка не меняется); вывести строку из сумм — «Сделать расшифровкой».
- Строки на экране стоят по коду «как на бумаге», а не в порядке файла; строки без кода — под своей предыдущей строкой.
- Страницы одной формы из разных файлов не склеиваются (OQ-140); две половинки формы в одном файле — две формы (Р-15).
- Форма без колонки кодов строк из файла не получает (OQ-139) — только пустые строки бланка.
- Коды без образца в наших данных (66н: 2421, 2430, 2450; ФСБУ 4: 1120 и др.): сомнительный такой код на скане
подсвечивается, пока аналитик его не подтвердит (Р-26).
- Значок с числом у документа считает и уже принятые нарушения; «Предупреждения обработки» в число не входят.
- После правки формы может появиться «Информация: форма распознана общим кодом версии …, в ядре версия …» — на окне
выкладки это штатно.
- В контуре PDF распознаёт настоящая ИС Сканирование: уверенность и нечитаемые ячейки могут отличаться от описанных
здесь для aep_3 / aep_6.
- Документ «Расшифровка» в панели не открывается (как раньше).
## 8. Как заводить баги
На стенде контура баг заводится задачей в Jira проекта AURORA, как остальные замечания тестирования. Шаблон описания —
`qa-guide.md` раздел 11; в задаче укажите, чей он, если понятно (экран — arm-web, API и данные — arm-core, распознавание
Excel — tabular-parser, PDF — scan-gateway; не уверены — по вкладке Network). Для форм ББ/ОФР дополнительно приложите:
1. **Файл** (или обезличенную копию) и где он лежит на стенде: ЮЛ, имя файла, дата загрузки.
2. **id документа** — из адреса страницы проверки (`…/documents/<id>`).
3. **Скриншот экрана проверки** целиком (шапка, блоки нарушений и предупреждений, нужная строка; подсказку
проблемной ячейки — отдельным скриншотом).
4. **Ответ `GET /documents/{id}/statement`** — вкладка Network браузера (запрос `statement`, вкладка «Response», сохранить
как файл); для ошибки загрузки — ответ `GET /files/{file_id}` (поля `job.warnings`, `job.error_code`).
5. Номер сценария из раздела 5 и что ожидали.
6. Для PDF — что видно на скане в этом месте (страница и строка) и что распознано (из подсказки ячейки).