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) идёт по субсчетам.