From ca759d482d89a76329772d320a8af156baef1b79 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Wed, 28 Oct 2026 21:09:27 +0400 Subject: [PATCH] =?UTF-8?q?05=20=C2=A71.0:=20=D0=9E=D0=A1=D0=92=20=D0=B4?= =?UTF-8?q?=D1=80=D1=83=D0=B3=D0=B8=D1=85=20=D1=83=D1=87=D1=91=D1=82=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=20=E2=80=94?= =?UTF-8?q?=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F,=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BF=D0=B0=D1=81=D0=BD=D0=BE=D0=B9=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=B7=D0=BD=D0=B0=D0=BA,=20=D0=B3=D1=80=D1=83=D0=BF=D0=BF?= =?UTF-8?q?=D1=8B=20=D0=B8=20=D1=81=D1=82=D0=BE=D1=80=D0=BE=D0=BD=D1=8B,?= =?UTF-8?q?=20=C2=AB=D0=92=D0=A1=D0=95=D0=93=D0=9E=C2=BB=20(tp#81)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AURORA-1717, AURORA-1719, AURORA-1732. Co-Authored-By: Claude Opus 5.5 --- context/05-domain-rules.md | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/context/05-domain-rules.md b/context/05-domain-rules.md index b3c5813..a337557 100644 --- a/context/05-domain-rules.md +++ b/context/05-domain-rules.md @@ -17,11 +17,26 @@ `fixtures/osv/` — это примеры двух организаций, а не спецификация формата. Парсер обязан: 1. **Найти лист(ы) с ОСВ** по содержимому: ячейка в первых 30 строках листа (`SHEET_MARKER_ROWS`: шапка ведомости всегда - над таблицей), матчащая `оборотно[- ]сальдовая ведомость` (без учёта регистра, «ё/е», переносов строк). Один файл может содержать несколько листов с разными ОСВ → несколько `document`. + над таблицей), матчащая название ведомости (без учёта регистра, «ё/е», переносов строк): `оборотно[- ]сальдовая + ведомость` в любом месте ячейки или, **с начала ячейки**, названия других учётных систем и отчётов 1С — «Оборотная + ведомость …», «ОСВ по сч. …», «Оборотный баланс», «Фин. Обороты Листок» (Navision), «Отчет по Главной книге» (SAP) + (AURORA-1717; «… см. оборотную ведомость» в примечании формы признаком не является). Отчёт 1С «Обороты счета» + (обороты в разрезе корр. счетов) — не ОСВ. + **Запасной признак** (лист без названия ведомости, tabular-parser#81): лист, который не опознан ни как ОСВ по + названию, ни как форма ББ/ОФР или её продолжение по признакам форм, — ОСВ, если в его первых 30 строках есть строка + со всеми тремя группами сумм («начало», «обороты», «конец»), у каждой группы найдены «Дебет» и «Кредит» и между ними + в строках заголовка нет других подписей; свёрнутое сальдо (одна колонка) запасного признака не даёт. Слабое + продолжение формы (лист из 1–2 кодов сразу после формы) признаком формы не считается: лист с такой таблицей после + формы — ОСВ. + Один файл может содержать несколько листов с разными ОСВ → несколько `document`. Листы без признаков ОСВ/ББ/ОФР — пропускать с warning, не падать. 2. **Найти заголовок таблицы** по содержимому: строка(и), где встречаются одновременно «Сальдо на начало…», «Оборот(ы) за период», «Сальдо на конец…» (с вариантами: «Нач. сальдо», «Обороты», «Кон. сальдо», «Дебет/Кредит», - «Дт/Кт», «Д-т/К-т»). **Обязательны группы «обороты» и «сальдо на конец»; отсутствовать может только «сальдо на + «Дт/Кт», «Д-т/К-т»; выгрузки других систем, AURORA-1719: «Остаток на начало/конец (периода)», «Остаток по дебету на + начало», «Начальное/Конечное сальдо», «Сальдо вх/исх Дт/Кт» (SAP), «НачалоДт / ОборотДт / КонецКт» (Navision)). + Сторона может стоять в самой ячейке группы после названия — через пробел («Сальдо вх Дт»), словами («Оборот по + дебету») или вплотную («Сальдо НачальноеДТВВ», «ОборотыДтВВ», SAP); тогда подзаголовков «Дебет/Кредит» нет. Сторона + перед названием группы («Дт оборот», SAP) пока не распознаётся (AURORA-1722). **Обязательны группы «обороты» и «сальдо на конец»; отсутствовать может только «сальдо на начало»** (иначе заголовок не найден → `INVALID_FORMAT`, §1.6). Заголовок может занимать 1–4 строки с merged-ячейками; группировки могут быть как под «Счет» в первой колонке, так и строкой «Субконто», так и перечислением через запятую (вариант 2). 3. **Определить колонки сумм по тексту**, а не по позиции: для каждой из трёх групп («начало», «оборот», «конец») @@ -295,7 +310,8 @@ AURORA-1661; прикладной сценарий валютных строк `CONTRACT` (§1.3, п. 3: после COUNTERPARTY дочерние продолжают классифицироваться по схеме; вид договоров здесь не назван в шапке, поэтому тип задаёт сама раскладка), на уровень глубже контрагента. Суммы контрагента = Σ его договоров. Иерархия листа: субсчёт → контрагент → договор (стратегия каскада `code_blocks`, `OSV_HIERARCHY_BY_CODE_BLOCKS`). -4. **«ИТОГ» — итог листа.** Строка с текстом ровно «ИТОГ» (`total_row_exact`, наравне с «Итого») — TOTAL; таблица кончается +4. **«ИТОГ» и «ВСЕГО» — итог листа.** Строка с текстом ровно «ИТОГ» или «ВСЕГО» (ведомости ГК КТЗ по счёту 009, + AURORA-1732; `total_row_exact`, наравне с «Итого») — TOTAL; таблица кончается на ней, а не на первой «ИТОГ по …» (та не начинается с «Итого» и итогом листа не является). Сверка «Итого = Σ строк уровня 0» (§1.4) идёт по субсчетам.