Просмотр ОСВ: плоская таблица вместо дерева (#12) #13

Merged
aep merged 1 commits from feat/12-osv-flat-table into test 2026-10-08 15:23:29 +03:00
Owner

Closes #12

Что сделано

Экран «Просмотр ОСВ» показывал строки документа деревом (счёт → субсчёт → подразделение → контрагент), всё свёрнуто. Теперь — плоская таблица:

  • Строка = аналитика нижнего уровня (контрагент; у 01/02 — объект ОС). Строки счетов/субсчетов не показываются; договоры (CONTRACT) не отдельными строками — их сумма уже в строке контрагента, как в сводной ОСВ (§3). Субсчёт/подразделение без нижних строк, но с суммами — строкой с пустой аналитикой.
  • Колонки: Субсчёт · Подразделение (только если уровень есть в файле) · Контрагент / аналитика · ИНН · 6 сумм (группы как в сводной [30]).
  • «Итого по документу» — закреплённая строка внизу = сумма корневых строк счёта, т. е. «Итого» файла 1С. Не сумма строк: у 1С сальдо по контрагентам развёрнутое и с итогом счёта не совпадает. От фильтров не зависит.
  • Поиск по контрагенту/ИНН, фильтр по субсчёту, «Строк: N» — на клиенте (строки документа уже загружены целиком).
  • Пустой документ — «В документе нет строк» (было «No data»; закрывает Q-1 из RSHB/arm-scan-gateway#19).

Как устроено (для ревью)

  • osvRows.ts → flattenEntries(entries): чистая функция «строки API → строки таблицы + итог + список субсчетов + есть ли подразделения». Предки ищутся с ограничением шагов (битая ссылка или цикл не роняет экран — как было в entryTree).
  • money.ts → sumAmounts: точная сумма строк Decimal через копейки (BigInt), без float; нераспознанная сумма даёт null, а не выдуманный итог.
  • types/api.ts: в EntryOut добавлено group_type — поле уже есть в схеме arm-core (schemas/documents.py), фронт его не объявлял.
  • entryTree.ts и его тест удалены — больше не используются.

Проверка

  • make lint typecheck test build: biome — 0 ошибок (7 старых предупреждений), tsc чисто, vitest 19 файлов / 102 теста, сборка ок.
  • Браузер (ветка на :3001 поверх стенда, 1600×1000), «Итого по документу» сверено с «Итого» исходных файлов:
Документ Строк Итого (нач. Дт / об. Дт / об. Кт / кон. Дт)
ОСВ 62 РБ 1 кв. 2025 379 613 926 948,12 / 2 555 438 965,10 / 2 615 303 390,56 / 554 062 522,66
ОСВ 62 Счастливочной (с подразделениями) 7 54 487 831,16 / 138 614 053,36 / 101 407 541,60 / 91 694 342,92
ОСВ 01 РБ (объекты ОС) 322 700 517 098,71 / 11 679 271,90 / 426 375,96 / 711 769 994,65
ОСВ 58 РБ (договоры свёрнуты) 2 83 900 000,00 / — / 72 400 000,00 / 11 500 000,00
ОСВ 58 Счастливочной (пустая) 0 «В документе нет строк»

Фильтры: «бисквит» → 3 стр��ки, ИНН 3528065770 → 1, субсчёт 62.02 → 1, несуществующее → «По заданным фильтрам строк нет».

Rulings I made

  • R-1: экрана просмотра ОСВ-документа в макете нет (строки xlsx в [39] только для чтения) — стиль таблицы взят со сводной ОСВ [30]. Цена ошибки: низкая.
  • R-2: колонка «Субсчёт» закреплена слева, «Итого» — закреплённая строка снизу. Цена: низкая.

🤖 Generated with Claude Code

Closes #12 ## Что сделано Экран «Просмотр ОСВ» показывал строки документа деревом (счёт → субсчёт → подразделение → контрагент), всё свёрнуто. Теперь — плоская таблица: - **Строка = аналитика нижнего уровня** (контрагент; у 01/02 — объект ОС). Строки счетов/субсчетов не показываются; договоры (CONTRACT) не отдельными строками — их сумма уже в строке контрагента, как в сводной ОСВ (§3). Субсчёт/подразделение без нижних строк, но с суммами — строкой с пустой аналитикой. - **Колонки:** Субсчёт · Подразделение (только если уровень есть в файле) · Контрагент / аналитика · ИНН · 6 сумм (группы как в сводной [30]). - **«Итого по документу»** — закреплённая строка внизу = сумма корневых строк счёта, т. е. «Итого» файла 1С. Не сумма строк: у 1С сальдо по контрагентам развёрнутое и с итогом счёта не совпадает. От фильтров не зависит. - **Поиск** по контрагенту/ИНН, **фильтр по субсчёту**, «Строк: N» — на клиенте (строки документа уже загружены целиком). - Пустой документ — «В документе нет строк» (было «No data»; закрывает Q-1 из RSHB/arm-scan-gateway#19). ## Как устроено (для ревью) - `osvRows.ts` → `flattenEntries(entries)`: чистая функция «строки API → строки таблицы + итог + список субсчетов + есть ли подразделения». Предки ищутся с ограничением шагов (битая ссылка или цикл не роняет экран — как было в `entryTree`). - `money.ts` → `sumAmounts`: точная сумма строк Decimal через копейки (BigInt), без float; нераспознанная сумма даёт `null`, а не выдуманный итог. - `types/api.ts`: в `EntryOut` добавлено `group_type` — поле уже есть в схеме arm-core (`schemas/documents.py`), фронт его не объявлял. - `entryTree.ts` и его тест удалены — больше не используются. ## Проверка - `make lint typecheck test build`: biome — 0 ошибок (7 старых предупреждений), `tsc` чисто, vitest 19 файлов / 102 теста, сборка ок. - Браузер (ветка на :3001 поверх стенда, 1600×1000), «Итого по документу» сверено с «Итого» исходных файлов: | Документ | Строк | Итого (нач. Дт / об. Дт / об. Кт / кон. Дт) | |---|---|---| | ОСВ 62 РБ 1 кв. 2025 | 379 | 613 926 948,12 / 2 555 438 965,10 / 2 615 303 390,56 / 554 062 522,66 | | ОСВ 62 Счастливочной (с подразделениями) | 7 | 54 487 831,16 / 138 614 053,36 / 101 407 541,60 / 91 694 342,92 | | ОСВ 01 РБ (объекты ОС) | 322 | 700 517 098,71 / 11 679 271,90 / 426 375,96 / 711 769 994,65 | | ОСВ 58 РБ (договоры свёрнуты) | 2 | 83 900 000,00 / — / 72 400 000,00 / 11 500 000,00 | | ОСВ 58 Счастливочной (пустая) | 0 | «В документе нет строк» | Фильтры: «бисквит» → 3 стр��ки, ИНН 3528065770 → 1, субсчёт 62.02 → 1, несуществующее → «По заданным фильтрам строк нет». ## Rulings I made - R-1: экрана просмотра ОСВ-документа в макете нет (строки xlsx в [39] только для чтения) — стиль таблицы взят со сводной ОСВ [30]. Цена ошибки: низкая. - R-2: колонка «Субсчёт» закреплена слева, «Итого» — закреплённая строка снизу. Цена: низкая. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 1 commit 2026-10-08 15:22:36 +03:00
- Строка = аналитика нижнего уровня (контрагент, объект ОС); строки счетов и
  субсчетов не показываются, договоры (CONTRACT) — в строке контрагента, как в
  сводной ОСВ (§3); субсчёт/подразделение без нижних строк с суммами — строкой с
  пустой аналитикой.
- Колонки: Субсчёт · Подразделение (если уровень есть в файле) · Контрагент /
  аналитика · ИНН · 6 сумм; закреплённая строка «Итого по документу» = сумма
  корневых строк счёта (= «Итого» файла 1С).
- Поиск по контрагенту/ИНН, фильтр по субсчёту, «Строк: N» — на клиенте.
- flattenEntries (osvRows.ts) и точное sumAmounts (копейками, BigInt) с тестами;
  EntryOut.group_type — как в схеме arm-core; entryTree удалён.
- Пустой документ: «В документе нет строк» вместо «No data».

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep merged commit 403f086bb1 into test 2026-10-08 15:23:29 +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-web#13
No description provided.