# Proposal: полный состав строк ББ/ОФР на экране проверки **Срез:** доработка Среза 3b (`../docs/context/09-delivery-plan.md`) — экран проверки форм ББ/ОФР. **Репозитории:** arm-core (этот change, issue RSHB/arm-core#80); arm-web — PR в `test` (раскладка, правка по коду строки); `../docs` — bounded-PR: правило в `05-domain-rules.md` §7 «Ядро» и §11/§12, OQ-150 в `07-open-questions.md`, гайды `dev/frontend-api-guide.md`, `dev/qa-guide.md`. Follow-up: словарь `fsbu4` в scan-gateway (OQ-150 для нормализатора). DBML и контракты обмена не меняются, миграций нет. ## Why Ядро хранит только строки формы, пришедшие от OCR или разбора Excel (`financial_statement_line`), и правит только существующую ячейку (`PATCH …/statement` по `line_id` + `column_id`, иначе 422 `UNKNOWN_CELL`). Если источник строку потерял — пример: «Русский бисквит», 1 кв. 2025, ИС склеила «1500\n1700» и строка 1700 пропала (до OQ-156), — аналитик не может её заполнить, хотя форма бухгалтерской отчётности обязана её содержать. То же с ячейкой, которой нет у существующей строки в какой-то колонке. Решение владельца 09.10.2026: на экране проверки всегда показывать все строки формы своей редакции и давать их заполнять. ## What Changes - **Справочник строк форм по редакциям** — `api/rules/statement_lines.yaml` (данные, не код): редакции `66n` (≤ 2024-12-31) и `fsbu4` (с 2025-01-01), для каждой — ББ и ОФР: коды в порядке формы и наименования. Источник обеих редакций — шаблоны банка `../fixtures/statements-xlsx/templates/` («ББ/ОФР до 01.01.2025», «ББ/ОФР после 01.01.2025») с исправленными склейками наименований и заголовков разделов (решение владельца 09.10.2026: данные OQ-150 — из шаблонов). - **`GET /documents/{id}/statement` достраивает форму.** К строкам из БД добавляются строки справочника редакции `edition`, которых в форме нет, и недостающие ячейки у существующих строк по всем колонкам формы. У достроенной строки `id = null`, `origin = "template"`, наименование — из справочника; у достроенной ячейки `id = null`, `amount = null`, `is_recognized = null`, `is_modified = false`. Новое поле `LineOut.origin`: `source` — строка пришла из источника, `template` — строка из справочника (достроенная или созданная правкой аналитика). Без `edition` (нет даты периода) строки не достраиваются, недостающие ячейки — достраиваются. - **`PATCH …/statement` создаёт строку и ячейку при первой правке.** Элемент `values[]` адресует ячейку либо `line_id` + `column_id` (как сейчас; если у строки нет ячейки в этой колонке — ячейка создаётся), либо `line_code` + `column_id` — для строки справочника редакции, которой нет в форме: ядро создаёт `financial_statement_line` (`line_code_original_value = NULL` — признак «не из источника», наименование из справочника) и `financial_statement_value` (`original_amount = NULL`, `is_recognized = NULL`, `confidence = NULL`). Дальше — как любая правка: `is_modified`, `modified_by/at`, один `audit_event(RECOGNIZED_DATA_EDIT)` с `before = null`, сброс акцепта, пересчёт статуса. - **Пустая шаблонная строка не влияет на статус и проверки** (решение владельца 09.10.2026). Достроенные строки в БД не пишутся и в проверки §7, `values_ok` (D-6) и автоподтверждение не попадают. Созданная правкой строка (`origin = template`) участвует в проверках §7, только пока у неё есть хотя бы одна непустая сумма; очищенная до пустоты — снова как будто её нет. Таблицы DBML v5.17: `financial_statement_line` (`line_code_original_value` NULL — признак строки не из источника), `financial_statement_value`, `financial_statement_meta` (сброс акцепта), `document` (статус), `audit_event`. Новых полей нет. ## Non-goals - Запись достроенных строк в БД при маппинге и миграция данных — нет: БД хранит то, что пришло (первичка). - Обязательность заполнения: пустая строка не блокирует подтверждение и автоподтверждение; полноту ловят проверки §7. - Заполнение `fsbu4` в словаре scan-gateway (нормализатор, golden-эталоны) — follow-up issue. - Строки без кода (OQ-36, OQ-141, OQ-149), пятизначные подстроки в справочнике, отдельные формы для упрощённой отчётности малых предприятий — нет. - Порядок строк в ответе — по коду, как сейчас; раскладка по разделам — на фронте (`formLayout.ts`). - Удаление созданной строки аналитиком — нет (очистка суммы до `null` возвращает её в состояние «пустая шаблонная»). - Правка кода и наименования строки — нет (решение Среза 3b). ## Impact - Код: `domain/statement_lines.py` (новый: загрузка справочника, достройка формы — чистые функции), `api/rules/statement_lines.yaml` (новый), `schemas/statements.py` (`LineOut.id`/`ValueOut.id` nullable, `LineOut.origin`, `CellPatch` с `line_id | line_code`), `services/statements.py` (`build_out`, `_apply_cells`), `repositories/statements.py` (создание строки/ячейки, исключение пустых шаблонных строк в `statement_amounts`). - Спеки (дельты): `documents-api` («Форма ББ/ОФР для экрана проверки», «Правка формы»), `statement-checks` («Соотношения §7 по колонкам»). - Фронт arm-web: ключ шаблонной строки, отправка `line_code`, отсутствие подсветки «требует проверки» у пустых достроенных ячеек; выделение цветом строк «БАЛАНС» (1600 актив, 1700 пассив) — просьба владельца 09.10.2026.