fix(DocumentReview): виртуализация таблицы ОСВ (#38, AURORA-1665) #41

Merged
aep merged 2 commits from feat/38-osv-virtual-table into test 2026-10-17 13:46:20 +03:00
Owner

Что и зачем

Экран «Просмотр ОСВ» рисовал все строки таблицы сразу. ОСВ на ~29 тысяч строк — это ~29 тысяч HTML-строк в странице, браузер съедал память и вкладка падала.

Теперь таблица «виртуальная» (virtual в antd 6): браузер рисует только те строки, что видны на экране (~15), а при прокрутке подставляет следующие. Данные по-прежнему загружаются целиком, поиск по контрагенту/ИНН и фильтр по субсчёту работают как раньше (на клиенте), серверной пагинации нет.

Виртуальной таблице нужна высота числом, а не calc(100vh - 340px). Высота считается чистой функцией osvBodyHeight (окно минус 340 px, не меньше 240) и пересчитывается при изменении размера окна. Функция покрыта тестами.

Сохранено: «Итого по документу» закреплена внизу и выровнена, двухъярусная шапка, закреплённая колонка «Субсчёт», горизонтальная прокрутка, текст «нет строк». В спеку document-review-ui добавлено требование про виртуализацию (отдельным абзацем).

Closes #38. Jira AURORA-1665.

make check

Checked 144 files in 47ms. No fixes applied. (biome)
✖ 9 problems (0 errors, 9 warnings)  (ESLint, предупреждения уже были)
All matched files use Prettier code style!
npx tsc --noEmit  — без ошибок
Test Files  26 passed (26) / Tests  154 passed (154)
rsbuild build: ready, built in 0.85 s

Браузерная проверка (Playwright, окно 1600x1000, реальные файлы контура)

Открытие документа, число HTML-строк в DOM и память JS (usedJSHeapSize):

Документ Строк До: строк в DOM / память / загрузка После: строк в DOM / память
ОСВ ~29 тыс. (плоская) 29 048 29 049 / 1,7 ГБ / 13,5 с ~15 / 41 МБ
ОСВ ~13,8 тыс. 13 797 13 798 / 2,5 ГБ / 5,4 с ~15 / 83 МБ
ОСВ ~5,6 тыс. 5 582 5 583 / 2,7 ГБ / 3,8 с ~15 / 49 МБ
малая ОСВ 60 61 / — 15 (все видимые) / 48 МБ

«До» — тот же код без virtual (случайно снят в начале проверки, вкладка не упала, но память — гигабайты; замеры по документам шли в одной сессии браузера, поэтому их память накопительная и показывает порядок величины). Скриншоты не в репозитории (реальные данные).

  • «Итого по документу» до и после совпадает по всем колонкам на всех документах (например малая ОСВ: 428 677 586,56 в «Сальдо на конец, дебет»).
  • Прокрутка до конца: последняя строка документа достигается, шапка и «Итого» остаются на месте, колонки выровнены.
  • Поиск («травосмесь» → 8 строк), пустой результат (текст «По заданным фильтрам строк нет»), фильтр по субсчёту (189 строк) — работают, «Итог�� по документу» не зависит от фильтра (как и раньше).
  • Смена высоты окна 1000 → 700 px: высота области прокрутки пересчитывается (660 → 360).
  • Не проверялось: фактический «до»-сценарий на ветке test отдельным сервером (порт отнят параллельным агентом), нагрузка на слабой машине.

Rulings I made

  • R-1: высота области прокрутки = высота окна − 340 px (как было в calc), минимум 240; пересчёт по window.resize, без ResizeObserver — проще, поведение прежнее.
  • R-2: компонентные тесты не писал (по CLAUDE.md arm-web компоненты не тестируются); тест — на чистую функцию osvBodyHeight.
  • R-3: требование про виртуализацию добавлено отдельным Requirement после «ОСВ-документ», а не правкой его текста (чтобы не конфликтовать с #39).

Находки

Маркер Суть Статус
R-1 Высота = окно − 340, min 240, resize-слушатель fixed a3e53c8
R-2 Тест только на чистую функцию fixed a3e53c8
R-3 Спека: отдельный Requirement fixed a3e53c8
O-1 Codegraph в worktree ответил (пустым не был) rejected не проблема
O-2 Общий Playwright-браузер используется параллельными агентами (навигация в общей странице уходила на чужой порт); проверка шла в собственном browser context rejected окружение
O-3 Итоги на больших числах (17-значные, колонка 140 px) переносятся на 2 строки, строка «Итого» становится выше; ширина колонок не менялась deferred
O-4 Конфликт с PR #40 (#39): строка scroll={{ y, x }} и абзац спеки — разрешить при merge второго PR deferred

🤖 Generated with Claude Code

## Что и зачем Экран «Просмотр ОСВ» рисовал все строки таблицы сразу. ОСВ на ~29 тысяч строк — это ~29 тысяч HTML-строк в странице, браузер съедал память и вкладка падала. Теперь таблица «виртуальная» (`virtual` в antd 6): браузер рисует только те строки, что видны на экране (~15), а при прокрутке подставляет следующие. Данные по-прежнему загружаются целиком, поиск по контрагенту/ИНН и фильтр по субсчёту работают как раньше (на клиенте), серверной пагинации нет. Виртуальной таблице нужна высота числом, а не `calc(100vh - 340px)`. Высота считается чистой функцией `osvBodyHeight` (окно минус 340 px, не меньше 240) и пересчитывается при изменении размера окна. Функция покрыта тестами. Сохранено: «Итого по документу» закреплена внизу и выровнена, двухъярусная шапка, закреплённая колонка «Субсчёт», горизонтальная прокрутка, текст «нет строк». В спеку `document-review-ui` добавлено требование про виртуализацию (отдельным абзацем). Closes #38. Jira AURORA-1665. ## make check ``` Checked 144 files in 47ms. No fixes applied. (biome) ✖ 9 problems (0 errors, 9 warnings) (ESLint, предупреждения уже были) All matched files use Prettier code style! npx tsc --noEmit — без ошибок Test Files 26 passed (26) / Tests 154 passed (154) rsbuild build: ready, built in 0.85 s ``` ## Браузерная проверка (Playwright, окно 1600x1000, реальные файлы контура) Открытие документа, число HTML-строк в DOM и память JS (`usedJSHeapSize`): | Документ | Строк | До: строк в DOM / память / загрузка | После: строк в DOM / память | |---|---|---|---| | ОСВ ~29 тыс. (плоская) | 29 048 | 29 049 / 1,7 ГБ / 13,5 с | ~15 / 41 МБ | | ОСВ ~13,8 тыс. | 13 797 | 13 798 / 2,5 ГБ / 5,4 с | ~15 / 83 МБ | | ОСВ ~5,6 тыс. | 5 582 | 5 583 / 2,7 ГБ / 3,8 с | ~15 / 49 МБ | | малая ОСВ | 60 | 61 / — | 15 (все видимые) / 48 МБ | «До» — тот же код без `virtual` (случайно снят в начале проверки, вкладка не упала, но память — гигабайты; замеры по документам шли в одной сессии браузера, поэтому их память накопительная и показывает порядок величины). Скриншоты не в репозитории (реальные данные). - «Итого по документу» до и после совпадает по всем колонкам на всех документах (например малая ОСВ: 428 677 586,56 в «Сальдо на конец, дебет»). - Прокрутка до конца: последняя строка документа достигается, шапка и «Итого» остаются на месте, колонки выровнены. - Поиск («травосмесь» → 8 строк), пустой результат (текст «По заданным фильтрам строк нет»), фильтр по субсчёту (189 строк) — работают, «Итог�� по документу» не зависит от фильтра (как и раньше). - Смена высоты окна 1000 → 700 px: высота области прокрутки пересчитывается (660 → 360). - Не проверялось: фактический «до»-сценарий на ветке test отдельным сервером (порт отнят параллельным агентом), нагрузка на слабой машине. ## Rulings I made - R-1: высота области прокрутки = высота окна − 340 px (как было в calc), минимум 240; пересчёт по `window.resize`, без ResizeObserver — проще, поведение прежнее. - R-2: компонентные тесты не писал (по CLAUDE.md arm-web компоненты не тестируются); тест — на чистую функцию `osvBodyHeight`. - R-3: требование про виртуализацию добавлено отдельным Requirement после «ОСВ-документ», а не правкой его текста (чтобы не конфликтовать с #39). ## Находки | Маркер | Суть | Статус | |---|---|---| | R-1 | Высота = окно − 340, min 240, resize-слушатель | fixed a3e53c8 | | R-2 | Тест только на чистую функцию | fixed a3e53c8 | | R-3 | Спека: отдельный Requirement | fixed a3e53c8 | | O-1 | Codegraph в worktree ответил (пустым не был) | rejected не проблема | | O-2 | Общий Playwright-браузер используется параллельными агентами (навигация в общей странице уходила на чужой порт); проверка шла в собственном browser context | rejected окружение | | O-3 | Итоги на больших числах (17-значные, колонка 140 px) переносятся на 2 строки, строка «Итого» становится выше; ширина колонок не менялась | deferred | | O-4 | Конфликт с PR #40 (#39): строка `scroll={{ y, x }}` и абзац спеки — разрешить при merge второго PR | deferred | 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 1 commit 2026-10-17 11:08:45 +03:00
Таблица строк ОСВ получила virtual (antd 6): в DOM только видимые строки.
Высота области прокрутки считается числом (osvBodyHeight) и обновляется при
изменении окна. В спеку document-review-ui добавлено требование про виртуализацию.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep added 1 commit 2026-10-17 13:46:14 +03:00
Слияние с #39 (PR #40): scroll.x считается от фактических колонок, scroll.y — числом
для virtual. Колонки сумм расширены до 160 px: итоги из 17 цифр («Итого по документу»)
переносились на две строки и обрезались внизу таблицы (O-3). Спека: поиск — по аналитике.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep merged commit 783c3f0b17 into test 2026-10-17 13:46:20 +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#41
No description provided.