Плоская форма ОСВ 1С: счёт из шапки, «Итого развернутое», плоский список, контрагенты расчётных счетов (#59) #63

Merged
aep merged 16 commits from feat/59-osv-flat-form into main 2026-10-19 13:21:55 +03:00
Owner

Closes RSHB/arm-tabular-parser#59. Jira: AURORA-1661 (структурная часть). Связано: tabular-parser#49 (файлы Компании 4 «ОСВ сч. NN за 2 кв. 2026.xls» — 6 из 10 упирались в плоскую форму), трек A (#58/#60) слит в main до этого PR — ветка перебазирована на него.
Парные PR: arm-ka-fixtures (синтетика s40–s44, golden s40–s44, README набора), arm-ka-docs (§1.1/§1.3/§1.4, OQ-169…172). Порядок слияния: fixtures → tabular-parser → docs. Спека: openspec/changes/osv-flat-form/.

Что сделано

ОСВ 1С по одному счёту в плоской форме («по счету: X», колонка «Субконто», нет строки счёта, «Итого развернутое») разбирается без INVALID_FORMAT: счёт и организация берутся из шапки («по счету:», строка вида субконто между названием и периодом, «План счетов <орг>»); «Итого развернутое» — итоговая строка в любом порядке относительно «Итого»; новая стратегия иерархии header_account (плоский список под счётом шапки); «Итого» без корня ACCOUNT = сумма уровня 0; на расчётных счетах (58, 60, 62, 66, 67, 75, 76, 80) аналитика без названия вида — COUNTERPARTY с предупреждением OSV_ROWS. Контракт не менялся.

Проверки

  • make check: 3026 passed; ruff/mypy чистые; make golden-check: 161 файл, 0 изменений; openspec validate --strict: valid.
  • make check-full НЕ выполнен целиком: порты 4222/9000/5432 заняты демо-стендом; make test-integration нужно прогнать на свободном стенде до слияния (statements-check и docker-build прошли).
  • Приёмка на реальных файлах контура (локально, не в git): 10 файлов, до — 7 плоских INVALID_FORMAT; после (на ветке до rebase): 0 INVALID_FORMAT, 7 done / 3 needs_check; после rebase на main с треком A ревьюер подтвердил 270b41da и 738bfcf5 → done.
  • Golden реальных файлов и пакета ДКБ — без diff; изменились только s40–s44 (синтетика этой ветки).

Rulings I made

R-8 «Учредители» на 80 остаются OTHER (рекомендация сессии при одобрении запуска). R-9 счета 71/73 исключены из расчётных. R-10 → R-17 «Организации» (множественное) — синоним COUNTERPARTY, единственное «Организация» — OTHER. R-11 данные синтетики s40–s42 «подправлены» — ОТМЕНЁН R-16. R-12 пропуск меток шапки в строке вида субконто. R-13 OSV_ROWS по коду счёта. R-14 ожидания data_type=None у s40–s44 (после rebase BU по умолчанию). R-15 текст предупреждения «Итого» без корня. R-16 → R-19 тождество строки пропускается у вторых итоговых только без оборотов и не у единственной TOTAL. R-18 by_account не применяется к «Валюта…»/«В валюте». R-20 rebase после fix wave. R-21 шаг через показатели в итоговом блоке только при вторичной итоговой выше; показатели вторичной итоговой наследуют пропуск тождества. Подробности и цена ошибки — design.md, «Decisions made without discussion».

Таблица находок

Маркер Суть Статус
T1.1/T1.2 skip FLAT_FORM_FILES и обход EXPECTED fixed (Task 5)
T1.3 (=M-9) устаревшее имя теста генератора fixed
T1.4 README набора синтетики fixed
T1.5 порядок итогов s43/s44 rejected: информационное
T2.1 организация между названием и периодом теряется rejected: R-1, принятая цена
T2.2 ложные группы из строки вида субконто (Валюта, Субконто) fixed c6e928e, c0c8be3
T2.3 дубль теста шапки deferred
T2.4 «План счетов» ищется во всех ячейках rejected: по спеке
T2.6 «Контрагенты, Валюта» теряет вид deferred
T3.1 тест total_matches_root для единственной вторичной fixed
T3.2 checks по body.text, classify по text_col deferred
T3.3 устаревшие docstring/yaml fixed
T4.1 текст OSV_TOTAL без корня fixed
T4.2 парсер-тест плоского файла с испорченной «Итого» fixed
T4.3 тест header_account для indent-ветки deferred
T4.4 next(...) поиск sums rejected: допустимо
T4.5 (=M-5) docstring total_matches_root fixed
T5.1 (=M-8) 34 OSV_ROWS на одном документе (по заметке на субсчёт) deferred
T5.2 тест ИНН у строки by_account deferred
T5.3 счёт 63 в корпусе (osv-dkb golden) не в списке расчётных deferred (OQ-172)
T5.4/T5.5 избыточное name is None, дубль проверок rejected: косметика
I-1 «Организация» (собственная организация) стала COUNTERPARTY fixed (R-17)
I-2 строки валюты → контрагенты fixed (R-18)
I-3 плоская ОСВ на 91/99 → needs_check (R-5 без OQ-132) deferred
I-4 R-16 шире обоснования fixed (R-19)
I-5 make test-integration не выполнен (порты демо-стенда) deferred: прогнать на свободном стенде
I-6 «Итого развернутое» + НУ под ней → фиктивный контрагент fixed d6d1c71 (R-21)
I-7 показатель вторичной итоговой → needs_check fixed d6d1c71 (R-21)
M-1 маркер R-9 в коде fixed
M-2 устаревший design.md fixed
M-3 OQ-172 fixed
M-4 README fixed
M-6 тест порядка header_account перед sums fixed
M-7 реальное ФИО ИП в синтетике fixed
M-10 счётчик TOTAL (два «Итого развернутое» без основной) deferred
M-11 контрагент «Валютный…» остаётся OTHER rejected: цена R-18
M-12/M-13/M-14 докстринг теста, счётчик TOTAL, формулировка спеки fixed d6d1c71
O-1/O-2 и��полнители правили Python через Bash; реальные снимки не изменились rejected: без последствий
O-3 ожидания s40–s44 после слияния A fixed при rebase
O-4 check-full не выполнен: порты демо-стенда см. I-5

Deferred (в follow-up issue при закрытии)

T2.3, T2.6, T3.2, T4.3, T5.1/M-8, T5.2, T5.3 (OQ-172), I-3, M-10, I-5.

Зависимость от трека A

Трек A (#58, tabular-parser#60) слит в main; ветка перебазирована на него (конфликты по 6 пунктам разобраны, golden s40–s44 обновлены: BU по умолчанию). Без трека A плоские файлы не попадали в свод (data_type = null).

🤖 Generated with Claude Code

Closes RSHB/arm-tabular-parser#59. Jira: AURORA-1661 (структурная часть). Связано: tabular-parser#49 (файлы Компании 4 «ОСВ сч. NN за 2 кв. 2026.xls» — 6 из 10 упирались в плоскую форму), трек A (#58/#60) слит в main до этого PR — ветка перебазирована на него. Парные PR: arm-ka-fixtures (синтетика s40–s44, golden s40–s44, README набора), arm-ka-docs (§1.1/§1.3/§1.4, OQ-169…172). Порядок слияния: fixtures → tabular-parser → docs. Спека: openspec/changes/osv-flat-form/. ## Что сделано ОСВ 1С по одному счёту в плоской форме («по счету: X», колонка «Субконто», нет строки счёта, «Итого развернутое») разбирается без INVALID_FORMAT: счёт и организация берутся из шапки («по счету:», строка вида субконто между названием и периодом, «План счетов <орг>»); «Итого развернутое» — итоговая строка в любом порядке относительно «Итого»; новая стратегия иерархии header_account (плоский список под счётом шапки); «Итого» без корня ACCOUNT = сумма уровня 0; на расчётных счетах (58, 60, 62, 66, 67, 75, 76, 80) аналитика без названия вида — COUNTERPARTY с предупреждением OSV_ROWS. Контракт не менялся. ## Проверки - make check: 3026 passed; ruff/mypy чистые; make golden-check: 161 файл, 0 изменений; openspec validate --strict: valid. - make check-full НЕ выполнен целиком: порты 4222/9000/5432 заняты демо-стендом; `make test-integration` нужно прогнать на свободном стенде до слияния (statements-check и docker-build прошли). - Приёмка на реальных файлах контура (локально, не в git): 10 файлов, до — 7 плоских INVALID_FORMAT; после (на ветке до rebase): 0 INVALID_FORMAT, 7 done / 3 needs_check; после rebase на main с треком A ревьюер подтвердил 270b41da и 738bfcf5 → done. - Golden реальных файлов и пакета ДКБ — без diff; изменились только s40–s44 (синтетика этой ветки). ## Rulings I made R-8 «Учредители» на 80 остаются OTHER (рекомендация сессии при одобрении запуска). R-9 счета 71/73 исключены из расчётных. R-10 → R-17 «Организации» (множественное) — синоним COUNTERPARTY, единственное «Организация» — OTHER. R-11 данные синтетики s40–s42 «подправлены» — ОТМЕНЁН R-16. R-12 пропуск меток шапки в строке вида субконто. R-13 OSV_ROWS по коду счёта. R-14 ожидания data_type=None у s40–s44 (после rebase BU по умолчанию). R-15 текст предупреждения «Итого» без корня. R-16 → R-19 тождество строки пропускается у вторых итоговых только без оборотов и не у единственной TOTAL. R-18 by_account не применяется к «Валюта…»/«В валюте». R-20 rebase после fix wave. R-21 шаг через показатели в итоговом блоке только при вторичной итоговой выше; показатели вторичной итоговой наследуют пропуск тождества. Подробности и цена ошибки — design.md, «Decisions made without discussion». ## Таблица находок | Маркер | Суть | Статус | |---|---|---| | T1.1/T1.2 | skip FLAT_FORM_FILES и обход EXPECTED | fixed (Task 5) | | T1.3 (=M-9) | устаревшее имя теста генератора | fixed | | T1.4 | README набора синтетики | fixed | | T1.5 | порядок итогов s43/s44 | rejected: информационное | | T2.1 | организация между названием и периодом теряется | rejected: R-1, принятая цена | | T2.2 | ложные группы из строки вида субконто (Валюта, Субконто) | fixed c6e928e, c0c8be3 | | T2.3 | дубль теста шапки | deferred | | T2.4 | «План счетов» ищется во всех ячейках | rejected: по спеке | | T2.6 | «Контрагенты, Валюта» теряет вид | deferred | | T3.1 | тест total_matches_root для единственной вторичной | fixed | | T3.2 | checks по body.text, classify по text_col | deferred | | T3.3 | устаревшие docstring/yaml | fixed | | T4.1 | текст OSV_TOTAL без корня | fixed | | T4.2 | парсер-тест плоского файла с испорченной «Итого» | fixed | | T4.3 | тест header_account для indent-ветки | deferred | | T4.4 | next(...) поиск sums | rejected: допустимо | | T4.5 (=M-5) | docstring total_matches_root | fixed | | T5.1 (=M-8) | 34 OSV_ROWS на одном документе (по заметке на субсчёт) | deferred | | T5.2 | тест ИНН у строки by_account | deferred | | T5.3 | счёт 63 в корпусе (osv-dkb golden) не в списке расчётных | deferred (OQ-172) | | T5.4/T5.5 | избыточное name is None, дубль проверок | rejected: косметика | | I-1 | «Организация» (собственная организация) стала COUNTERPARTY | fixed (R-17) | | I-2 | строки валюты → контрагенты | fixed (R-18) | | I-3 | плоская ОСВ на 91/99 → needs_check (R-5 без OQ-132) | deferred | | I-4 | R-16 шире обоснования | fixed (R-19) | | I-5 | make test-integration не выполнен (порты демо-стенда) | deferred: прогнать на свободном стенде | | I-6 | «Итого развернутое» + НУ под ней → фиктивный контрагент | fixed d6d1c71 (R-21) | | I-7 | показатель вторичной итоговой → needs_check | fixed d6d1c71 (R-21) | | M-1 | маркер R-9 в коде | fixed | | M-2 | устаревший design.md | fixed | | M-3 | OQ-172 | fixed | | M-4 | README | fixed | | M-6 | тест порядка header_account перед sums | fixed | | M-7 | реальное ФИО ИП в синтетике | fixed | | M-10 | счётчик TOTAL (два «Итого развернутое» без основной) | deferred | | M-11 | контрагент «Валютный…» остаётся OTHER | rejected: цена R-18 | | M-12/M-13/M-14 | докстринг теста, счётчик TOTAL, формулировка спеки | fixed d6d1c71 | | O-1/O-2 | и��полнители правили Python через Bash; реальные снимки не изменились | rejected: без последствий | | O-3 | ожидания s40–s44 после слияния A | fixed при rebase | | O-4 | check-full не выполнен: порты демо-стенда | см. I-5 | ## Deferred (в follow-up issue при закрытии) T2.3, T2.6, T3.2, T4.3, T5.1/M-8, T5.2, T5.3 (OQ-172), I-3, M-10, I-5. ## Зависимость от трека A Трек A (#58, tabular-parser#60) слит в main; ветка перебазирована на него (конфликты по 6 пунктам разобраны, golden s40–s44 обновлены: BU по умолчанию). Без трека A плоские файлы не попадали в свод (data_type = null). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 16 commits 2026-10-19 13:21:08 +03:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
counterparty_accounts в osv_groups.yaml (R-9: без 71 и 73), is_counterparty_account,
OSV_ROWS по счёту; формулировка проверки «Итого» без корня ACCOUNT (T4.1);
ожидания s40–s44 в синтетике (T1.1/T1.2), тест испорченной «Итого» плоского списка (T4.2).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
I-1 (R-17): синоним COUNTERPARTY только «Организации» (^организации\b).
I-2 (R-18): правило расчётных счетов не применяется к строкам, известным словарю как не-контрагенты (валюта, «В валюте»).
I-4 (R-19): тождество у второй итоговой строки пропускается только без оборотов и при наличии другой «Итого».
M-1, M-5, M-6, M-7 (вымышленное ФИО ИП в синтетике), M-9.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
aep merged commit ced16bc8aa into main 2026-10-19 13:21:55 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/arm-tabular-parser#63
No description provided.