ББ/ОФР из Excel: значение как показывает числовой формат (#42, AURORA-1528) #43

Merged
aep merged 4 commits from feat/42-xls-number-format into main 2026-10-15 17:37:31 +03:00
Owner

Закрывает RSHB/arm-tabular-parser#42, Jira AURORA-1528 «Неверный масштаб сумм при импорте ББ и ОФР из Excel».

Значение ячейки ББ/ОФР из Excel теперь = как его показывает числовой формат ячейки (решение владельца 15.10.2026, пересмотр OQ-138). 1С отдаёт рубли с копейками, в тысячи их переводит формат (#,##0,, 0,, условные литералы [=0]"-", [=-872206880.07]"(872 207)").

  • readers xlsx/xls отдают числовой формат (Cell.number_format); xlsb — без формата + предупреждение на документ;
  • новый чистый модуль statements/number_format.py (секции, условия, масштабирующие запятые, литералы, округление половина от нуля, не больше 2 знаков); неразобранный формат — сырое значение + предупреждение;
  • ОСВ, контракт и версия схемы не затронуты;
  • golden и docs — отдельные PR.

Порядок слияния: docs (arm-ka-docs) -> fixtures (arm-ka-fixtures, golden) -> этот PR. Golden-тесты этого PR требуют новых снимков из fixtures (без них fixtures-тесты красные); вместе с fixtures слить в один заход.

Проверки: make check-full зелёный (lint, 2529 passed, 10 integration passed, docker-build). arm-core на новых golden: 1335 unit + 911 integration passed (arm-core не менялся).

Изменения статусов в statements_manifest.yaml: нет (статусы, complete, failed_relations прежние); обновлены только комментарии. Предупреждения «значений с дробной частью» исчезли в НПЗ ББ, Межениновская ББ, Унагранде-co Б.Б Лист 1.

Rulings I made

  • R-1 Формат хранится в Cell.number_format (default None), не отдельной картой. Цена ошибки: изменение равенства Cell только у числовых ячеек с форматом; ОСВ поле не использует.
  • R-2 Выбор секции по Excel: без явных условий — умолчания по числу секций (1: все; 2: >=0/<0; 3: >0/<0/остальное); с явными — по порядку, неявное у нефинальной секции — умолчание по номеру, у финальной — «остальное»; ничего не подошло (в т.ч. единственная условная секция) — формат не разобран. Цена: редкие комбинации вида [>100]0;0;0 могут отличаться от Excel; значение почти не зависит от выбора секции (знак — от сырого).
  • R-3 Знак отображаемого значения — от сырого значения для числовых секций; в литеральных секциях знак из литерала.
  • R-4 Секция General -> сырое значение, не «не разобран».
  • R-5 Литерал, не превращающийся в число/пусто/прочерк (напр. «н/д») -> формат не разобран (сырое + предупреждение).
  • R-6 Неизвестные буквы/знаки вне кавычек (d m y h s, AM/PM, E+, %, @, /, «₽» без кавычек) -> не разобран.
  • R-7 Предупреждения по одному на документ ББ/ОФР с колонкой кодов, с префиксом sheet=<первый лист>: xlsb «формат чисел xlsb не читается: значения как в файле»; «формат чисел не разобран, значения как в ячейках: «ф1», «ф2»» (уникальные, по алфавиту, до 30 символов). Документы без колонки кодов и DISCLOSURE предупреждений не получают (значений нет).
  • R-8 Квантование результата и проверка диапазона numeric(18,2) — тем же кодом, что to_money (quantize_money).
  • R-9 (T4, fixed) Условия формата сравниваются с точностью 15 значащих цифр, как Excel (xls даёт -1486533582.3500001 против условия [=-1486533582.35]); то же — для округления при масштабировании. Цена: значение с 16+ значащими цифрами округляется до 15 (в реальных данных нет); при формате 0 и значении ≥1e15 результат выходит за numeric(18,2) -> «не разобран».
  • R-10 (fix-волна) Формат более чем из 4 секций -> не разобран (Excel такой не принимает). Скобка с оператором сравнения, не подошедшая под шаблон условия ([=1E-5]), -> не разобран, а не игнорируется.
  • R-11 Признак xlsb для предупреждения — из содержимого (read_book_detected -> detected == "XLSB"), а не из текста outline-предупреждения.
  • R-12 OpenSpec change не заводился (bounded по решению владельца), openspec/specs/{statement-parsing,tabular-recognition-service}/spec.md НЕ обновлены и частично противоречат коду — см. I-2 (deferred).

Находки

Маркер Суть Статус
T4.1 операнд условия не приводился к 15 цифрам fixed 904392d
T4.2 .15g округляет HALF_EVEN fixed 904392d
T4.3 неявные условия не описаны в docs fixed 20dd0fe
T4.4 [=5]0;[=5]1 unparsed без теста rejected: пример некорректен («1» вне плейсхолдеров -> R-6); добавлен тест [=5]0;[=5]0,
T4.5 «дубль пробела» в _PLAIN_CHARS rejected: второй символ NBSP
I-1 integration test_roundtrip ожидал устаревшие мягкие соотношения НПЗ fixed 904392d (make check-full: 10 integration passed)
I-2 openspec/specs содержат устаревшие сценарии (значения как в файле, 5852464.14, 1600=1700 1.94/9.02/2.48) deferred: нужна дельта OpenSpec к двум capability — решение владельца (change не заводился)
M-1 устаревшие комментарии манифеста/README fixed 904392d
M-2 детали алгоритма не попали в §12 п. 5 fixed 20dd0fe
M-3 неточности qa-guide, 06-test-data fixed 20dd0fe
M-4 непонятная скобка-условие молча игнорировалась fixed 904392d
M-5 xlsb-признак выведен из текста предупреждения fixed 904392d
M-6 округление без приведения к 15 цифрам fixed 904392d
O-1 ~600 нулей в golden стали null ([=0]"-"); UI покажет пустые/«—» deferred: сообщить фронту/владельцу
O-2 make check docs не прошёл: нет jsonschema в среде deferred (среда, к правкам не относится)
O-3 arm-core unit 1335 + integration 911 passed на новых golden (ARM_KA_FIXTURES=$W/fixtures) информация

🤖 Generated with Claude Code

Закрывает RSHB/arm-tabular-parser#42, Jira AURORA-1528 «Неверный масштаб сумм при импорте ББ и ОФР из Excel». Значение ячейки ББ/ОФР из Excel теперь = как его показывает числовой формат ячейки (решение владельца 15.10.2026, пересмотр OQ-138). 1С отдаёт рубли с копейками, в тысячи их переводит формат (`#,##0,`, `0,`, условные литералы `[=0]"-"`, `[=-872206880.07]"(872 207)"`). - readers xlsx/xls отдают числовой формат (`Cell.number_format`); xlsb — без формата + предупреждение на документ; - новый чистый модуль `statements/number_format.py` (секции, условия, масштабирующие запятые, литералы, округление половина от нуля, не больше 2 знаков); неразобранный формат — сырое значение + предупреждение; - ОСВ, контракт и версия схемы не затронуты; - golden и docs — отдельные PR. **Порядок слияния:** docs (arm-ka-docs) -> fixtures (arm-ka-fixtures, golden) -> этот PR. Golden-тесты этого PR требуют новых снимков из fixtures (без них fixtures-тесты красные); вместе с fixtures слить в один заход. Проверки: `make check-full` зелёный (lint, 2529 passed, 10 integration passed, docker-build). arm-core на новых golden: 1335 unit + 911 integration passed (arm-core не менялся). Изменения статусов в `statements_manifest.yaml`: нет (статусы, complete, failed_relations прежние); обновлены только комментарии. Предупреждения «значений с дробной частью» исчезли в НПЗ ББ, Межениновская ББ, Унагранде-co Б.Б Лист 1. ## Rulings I made - R-1 Формат хранится в `Cell.number_format` (default None), не отдельной картой. Цена ошибки: изменение равенства Cell только у числовых ячеек с форматом; ОСВ поле не использует. - R-2 Выбор секции по Excel: без явных условий — умолчания по числу секций (1: все; 2: >=0/<0; 3: >0/<0/остальное); с явными — по порядку, неявное у нефинальной секции — умолчание по номеру, у финальной — «остальное»; ничего не подошло (в т.ч. единственная условная секция) — формат не разобран. Цена: редкие комбинации вида `[>100]0;0;0` могут отличаться от Excel; значение почти не зависит от выбора секции (знак — от сырого). - R-3 Знак отображаемого значения — от сырого значения для числовых секций; в литеральных секциях знак из литерала. - R-4 Секция `General` -> сырое значение, не «не разобран». - R-5 Литерал, не превращающийся в число/пусто/прочерк (напр. «н/д») -> формат не разобран (сырое + предупреждение). - R-6 Неизвестные буквы/знаки вне кавычек (d m y h s, AM/PM, E+, %, @, /, «₽» без кавычек) -> не разобран. - R-7 Предупреждения по одному на документ ББ/ОФР с колонкой кодов, с префиксом `sheet=<первый лист>`: xlsb «формат чисел xlsb не читается: значения как в файле»; «формат чисел не разобран, значения как в ячейках: «ф1», «ф2»» (уникальные, по алфавиту, до 30 символов). Документы без колонки кодов и DISCLOSURE предупреждений не получают (значений нет). - R-8 Квантование результата и проверка диапазона numeric(18,2) — тем же кодом, что `to_money` (`quantize_money`). - R-9 (T4, fixed) Условия формата сравниваются с точностью 15 значащих цифр, как Excel (xls даёт -1486533582.3500001 против условия `[=-1486533582.35]`); то же — для округления при масштабировании. Цена: значение с 16+ значащими цифрами округляется до 15 (в реальных данных нет); при формате `0` и значении ≥1e15 результат выходит за numeric(18,2) -> «не разобран». - R-10 (fix-волна) Формат более чем из 4 секций -> не разобран (Excel такой не принимает). Скобка с оператором сравнения, не подошедшая под шаблон условия (`[=1E-5]`), -> не разобран, а не игнорируется. - R-11 Признак xlsb для предупреждения — из содержимого (`read_book_detected` -> `detected == "XLSB"`), а не из текста outline-предупреждения. - R-12 OpenSpec change не заводился (bounded по решению владельца), `openspec/specs/{statement-parsing,tabular-recognition-service}/spec.md` НЕ обновлены и частично противоречат коду — см. I-2 (deferred). ## Находки | Маркер | Суть | Статус | |---|---|---| | T4.1 | операнд условия не приводился к 15 цифрам | fixed 904392d | | T4.2 | `.15g` округляет HALF_EVEN | fixed 904392d | | T4.3 | неявные условия не описаны в docs | fixed 20dd0fe | | T4.4 | `[=5]0;[=5]1` unparsed без теста | rejected: пример некорректен («1» вне плейсхолдеров -> R-6); добавлен тест `[=5]0;[=5]0,` | | T4.5 | «дубль пробела» в _PLAIN_CHARS | rejected: второй символ NBSP | | I-1 | integration test_roundtrip ожидал устаревшие мягкие соотношения НПЗ | fixed 904392d (make check-full: 10 integration passed) | | I-2 | openspec/specs содержат устаревшие сценарии (значения как в файле, 5852464.14, 1600=1700 1.94/9.02/2.48) | deferred: нужна дельта OpenSpec к двум capability — решение владельца (change не заводился) | | M-1 | устаревшие комментарии манифеста/README | fixed 904392d | | M-2 | детали алгоритма не попали в §12 п. 5 | fixed 20dd0fe | | M-3 | неточности qa-guide, 06-test-data | fixed 20dd0fe | | M-4 | непонятная скобка-условие молча игнорировалась | fixed 904392d | | M-5 | xlsb-признак выведен из текста предупреждения | fixed 904392d | | M-6 | округление без приведения к 15 цифрам | fixed 904392d | | O-1 | ~600 нулей в golden стали null (`[=0]"-"`); UI покажет пустые/«—» | deferred: сообщить фронту/владельцу | | O-2 | `make check` docs не прошёл: нет jsonschema в среде | deferred (среда, к правкам не относится) | | O-3 | arm-core unit 1335 + integration 911 passed на новых golden (`ARM_KA_FIXTURES=$W/fixtures`) | информация | 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 4 commits 2026-10-15 17:01:08 +03:00
Чистый модуль statements/number_format.py (display_amount) и публичная numbers.quantize_money.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
statement_money вместо to_money в разборе строк форм, предупреждения о неразобранном формате и об xlsb,
сравнение условий формата с точностью Excel (15 значащих цифр), тесты и тексты.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Фикс-волна по финальному ревью: I-1, M-1, M-4, M-5, M-6 (T4.1, T4.2); тесты на ;;;, 5 секций, [$-419], \(…\), [=5]0;[=5]0,.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep merged commit 295b9924af into main 2026-10-15 17:37:31 +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#43
No description provided.