docs(#116): Р-6 решено — колонка без даты остаётся с error, относительные периоды в словарь

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Andrey Epifancev 2026-10-17 19:11:22 +04:00
parent fbc1de5910
commit bcb6b0b527

View File

@ -1,7 +1,7 @@
# Единый алгоритм нормализации ББ/ОФР (scan-gateway и tabular-parser) — дизайн
Issue: arm-ka-docs#116. Статус: черновик; текущая цепочка описана, целевая картина по шагам 1–9 — предложение, ждёт
решений владельца Р-6, Р-7; Р-1…Р-5 решены (brainstorming 17.10.2026).
решения владельца Р-7; Р-1…Р-6 решены (brainstorming 17.10.2026).
## Цель
@ -399,7 +399,7 @@ sheet:<A>,<B>`. `DISCLOSURE` и форма без колонки кодов —
- **2. Повторная шапка внутри таблицы** — одно правило: строка внутри сетки с признаком шапки («Код» / та же сигнатура) открывает новый сегмент; у сегмента своя раскладка (позиции колонок могут сдвинуться); колонки значений сегментов сопоставляются по порядку; число не совпало — предупреждение, значения по позиции
- scan-gateway: как сейчас, через общее правило
- tabular-parser: добавляет: бывший «лист-продолжение со своей раскладкой» становится сегментом
- **3. Дата колонки** — один словарь периодов (`statement_periods.yaml`) → `period_end`; перед разбором — очистка двойников OCR (общий шаг, у Excel не срабатывает)
- **3. Дата колонки** — один словарь периодов (`statement_periods.yaml`) → `period_end`: абсолютные подписи («На 31 марта 2025 г.», «За январь – март 2025 г.», «31.12.2024», «За 9 месяцев 2025 г.», «2024») и относительные («На отчётную дату», «На 31 декабря предыдущего года», «На 31 декабря года, предшествующего предыдущему», «За отчётный период», «За аналогичный период прошлого года» — дата считается от даты отчёта из шапки; даты отчёта нет → колонка без даты). Перед разбором — очистка двойников OCR (общий шаг, у Excel не срабатывает). Относительные подписи — решение владельца 17.10.2026 (Р-6): это бланки по приказу 66н без впечатанных дат, у шлюза сейчас «колонка 0 без даты: На отчетную дату»
- scan-gateway: `parse_date` «размером с дату» → словарь
- tabular-parser: добавляет очистку двойников (no-op)
- **4. Без шапки** — одно правило: строка заголовка не найдена → колонки значений = столбцы правее кода, где в строках с кодами стоят числа; `label` пустая, `period_end` `null`; одно предупреждение «строка заголовка не найдена»
@ -408,9 +408,9 @@ sheet:<A>,<B>`. `DISCLOSURE` и форма без колонки кодов —
- **5. Строка нумерации «1 2 3 4 5»** — одно правило `is_numbering_row` → роль `numbering`, в данные не попадает
- scan-gateway: добавляет (AURORA-1517)
- tabular-parser: как сейчас
- **6. Подпись без периода** — одно правило: подпись — период по словарю → колонка с датой; подпись из словаря исключений («Изменение», «Отклонение», «%», «Темп», «Доля») → пропуск с предупреждением info; иначе, если в столбце есть числа в строках с кодами — колонка без даты + предупреждение (Р-6); иначе пропуск
- scan-gateway: добавляет словарь исключений
- tabular-parser: перестаёт молча пропускать неизвестные числовые колонки
- **6. Подпись без периода** — **решение владельца (17.10.2026, Р-6):** подпись — период по словарю (абсолютный или относительный, п. 3) → колонка с датой; подпись из словаря исключений («Изменение», «Отклонение», «%», «Темп», «Доля», «Примечание») → пропуск с предупреждением `info`; иначе, если в столбце есть числа в строках с кодами (OCR-мусор вроде «| | г» с уверенностью 17 в aep_3, обрезанная или самодельная подпись) — колонка остаётся с подписью как есть и `period_end = null`, предупреждение `error` с привязкой к колонке, документ `needs_check`, аналитик подтверждает после сверки с источником; иначе пропуск. Ядру колонка без даты не мешает: период формы берётся из даты отчёта, без неё — из самой поздней даты остальных колонок (`statement_period`). Пропуск числовой колонки с нераспознанной подписью отвергнут: для OCR это тихая потеря периода с возможным автоподтверждением
- scan-gateway: добавляет словарь исключений и относительные периоды
- tabular-parser: перестаёт молча пропускать неизвестные числовые колонки; добавляет относительные периоды
### Шаг 3 — Отбор строк данных
@ -615,8 +615,10 @@ column_index?}`, а не строка.
порога. Код строки подтверждается структурой (перечень кодов формы + порядок), не уверенностью. Уверенность
наименования в сервисах не используется; сопоставление со справочным — открытый вопрос ядра (= решение № 7 по
спринту 2, AURORA-1519 / 1524).
- **Р-6** (шаг 2, п. 6) — неизвестная числовая колонка без периода: оставлять без даты с предупреждением (`needs_check`)
или пропускать, как парсер сейчас.
- **Р-6** (шаг 2, п. 6) — **решено владельцем 17.10.2026:** числовая колонка с нераспознанной подписью остаётся в
документе без даты с предупреждением `error` (`needs_check`, подтверждение руками); пропуск отвергнут как тихая
потеря периода. Относительные подписи бланка 66н («На отчётную дату», «На 31 декабря предыдущего года», …)
добавляются в словарь периодов и считаются от даты отчёта.
- **Р-7** (шаг 8, «Подтверждение проверкой») — снимать ли подсветку сошедшимся соотношением §7 и с `is_recognized =
false` (число собрано из грязного текста), а не только с низкой уверенности; предложение — да: сошедшаяся проверка
сильнее догадки о мусоре.