fix(statements): подпись колонки в строке-шапке таблицы не заголовок формы (R-8, #54)

Ячейка в строке с подписью «Код» (словарь пакета) не открывает блок формы:
«Пояснения» на листах-продолжениях НПЗ больше не даёт DISCLOSURE.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
This commit is contained in:
Andrey Epifancev 2026-10-18 20:28:39 +04:00
parent c858a85d85
commit ebc1f438da
2 changed files with 26 additions and 2 deletions

View File

@ -134,8 +134,11 @@ def _candidates(sheet: Sheet, rules: StatementRules) -> list[_Candidate]:
for row in range(1, sheet.n_rows + 1):
title: tuple[int, int, str] | None = None
okud: tuple[int, int, str] | None = None
for col, cell in row_cells(sheet, row):
if title is None and type_hint(None, cell.text, rules) is not None:
cells = row_cells(sheet, row)
# строка-шапка таблицы (есть подпись «Код»): «Пояснения» и т. п. — подписи колонок, не заголовок формы
is_table_header = any(caption_matches([rules.headers.code_caption], cell.text) for _, cell in cells)
for col, cell in cells:
if title is None and not is_table_header and type_hint(None, cell.text, rules) is not None:
title = (row, col, cell.text)
# маркер продолжения («Форма 0710001 с.2») — не заголовок нового блока по ОКУД
if okud is None and not is_continuation(cell.text, rules) and type_hint(cell.text, None, rules) is not None:

View File

@ -118,3 +118,24 @@ def test_labels_with_punctuation_match(rules: StatementRules) -> None:
assert matches(rules.headers.labels["okopf_okfs"], "по ОКОПФ / ОКФС")
assert matches(rules.headers.legal_form, "АО «Пример»")
assert caption_matches([rules.headers.code_caption], "Код")
def test_column_caption_in_table_header_is_not_a_form_title(rules: StatementRules) -> None:
rows = [
["Форма 0710001 с.2"],
at({1: "Наименование", 2: "Пояснения", 3: "Код", 4: "На 30.09.2025"}),
at({1: "Капитал", 3: 1310, 4: 10}),
]
sheet = sheet_from_rows(rows)
assert find_blocks(sheet, rules) == []
assert classify_statement_sheet(sheet, rules) == "continuation"
def test_real_title_above_same_table_header_stays_a_block(rules: StatementRules) -> None:
rows = [
["Бухгалтерский баланс"],
at({1: "Наименование", 2: "Пояснения", 3: "Код", 4: "На 30.09.2025"}),
at({1: "Капитал", 3: 1310, 4: 10}),
]
[block] = find_blocks(sheet_from_rows(rows), rules)
assert block.type_hint is DocumentType.BALANCE