diff --git a/context/05-domain-rules.md b/context/05-domain-rules.md index f15c9eb..f25070f 100644 --- a/context/05-domain-rules.md +++ b/context/05-domain-rules.md @@ -155,16 +155,35 @@ r11 Договоры ← Из текста ИНН отрезается всегда: `counterparty_name` без ИНН и разделителя, `row_value` — исходный текст; только для строк `COUNTERPARTY`, договоры и прочее не трогаются; правила — `osv_headers.yaml` (`counterparty_inn_suffix`, `inn_only_row`, `inn_kpp_cell`); **реализовано**, OQ-100, OQ-163 (строки ИНН; ранее OQ-130, tabular-parser #9, PR #15; синтетика `s17`–`s19`), -`data_type` (строки «USD», «Вал.», «Кол.», «Кол-во» под контрагентом → CURRENCY/QUANTITY; по умолчанию — из шапки). +`data_type` (строки «USD», «Вал.», «Кол.», «Кол-во», «В валюте» под контрагентом → CURRENCY/QUANTITY; метка колонки +«Показатели» — ниже; по умолчанию — из шапки, а если шапка вид данных не называет — BU с предупреждением). «Вал» **без точки** — не метка валюты: так называется материал (счёт 10); валютная строка — «Вал.» с точкой или код валюты из словаря (**реализовано**, tabular-parser #47, AURORA-1663). «Кол-во» — строка количества, как «Кол.» и «Количество» (там же). -Строки «Вал.», «Кол.», «Кол-во» и трёхбуквенный код валюты («USD») — не уровень группировки, а вид сумм родителя: -`group_type = OTHER`, `data_type = CURRENCY | QUANTITY`, позицию в `group_schema` не занимают, **не наследуют** -`counterparty_name`/`counterparty_inn` (контрагента потребитель находит по родителю), `account_code_raw` наследуют от -ветки; их суммы остаются в шести полях, но в проверки родителя не входят (§1.4). +Строки «Вал.», «Кол.», «Кол-во», «В валюте» и трёхбуквенный код валюты («USD») — **строки-показатели**: не уровень +группировки, а вид сумм родителя: `group_type = OTHER`, `data_type = CURRENCY | QUANTITY`, позицию в `group_schema` не +занимают, **не наследуют** `counterparty_name`/`counterparty_inn` (контрагента потребитель находит по родителю), +`account_code_raw` наследуют от ветки; их суммы остаются в шести полях, но в проверки родителя и «Итого» не входят +(§1.4). Родитель строки-показателя — **предыдущая строка данных** (ближайшая строка выше, которая сама не показатель); +уровень — на один глубже родителя; в каскад иерархии строки-показатели не передаются, так что не ломают дерево строк +БУ, даже если стоят на одном outline-уровне с ним. Строка «Валюта <код>» («Валюта USD») — **не** показатель: обычная +строка аналитики (OTHER) с рублёвыми суммами; код валюты отдельно не хранится (решение владельца 19.10.2026, +AURORA-1661; прикладной сценарий валютных строк — аналитика AURORA-1670). + +**Колонка «Показатели»** (решение владельца 19.10.2026, AURORA-1613). 1С печатает вид суммы строки отдельной колонкой +между колонкой текста и суммами (заголовок «Показатели», часто с переносом «Показа-тели»; словарь +`osv_headers.yaml` — `service_columns.indicator`): на каждую строку аналитики — строка «БУ», под ней «НУ», «Кол.», +«Вал.», иногда «ПР»/«ВР» (постоянные и временные разницы); текст строк-показателей в колонке текста пуст или повторяет +объединённую ячейку строки БУ. Метка читается по словарю `data_types.yaml` — `indicator_column`: «БУ» — обычная строка с +`data_type = BU`; «НУ» → NU, «Кол.» → QUANTITY, «Вал.» → CURRENCY — строки-показатели (как выше); «ПР», «ВР» и метка не +из словаря — строки-показатели с `data_type = null` (в контракте нет значений для разниц) и, для метки не из словаря, +предупреждением. `row_value` строки-показателя — метка. Строки НУ хранятся как пришли (OQ-45), собственных проверок +«дети = родитель» и «Итого» у них нет (прикладной сценарий НУ — аналитика AURORA-1669); тождество строки (начало + +обороты = конец) проверяется у всех строк, как и раньше. Итоговые строки «Итого» с меткой показателя («НУ», «Кол.») +сразу за основной «Итого» — тоже TOTAL, в подвал не уходят и в сверку «Итого = корень» не входят. Колонка +«Показатели» остаётся в `extra` строки под своим заголовком. Классификация строки (п. 6–10 «Парсинг ОСВ»): 1. Строка — счёт, если текст матчится `^\d{2,3}(\.(\d{1,2}|[А-ЯЁA-Z]{1,3})){0,2}(,\s*.*)?$` (флаги `re.ASCII | re.DOTALL`: @@ -206,8 +225,8 @@ r11 Договоры ← сальдо с детьми не сверяется (у аналитики оно пусто, у субсчёта — равно оборотам). Счёт строки сопоставляется со списком по ближайшему счёту ветки: запись `91` покрывает `91`, `91.01`, `91.09`, но не `910` и не `90.01`; строка «Итого» проверяется как обычно. -- По каждому родителю: суммы родителя = Σ детей того же `data_type`. Строки CURRENCY/QUANTITY в суммирование не входят - и сами родителями не проверяются. **Обороты** сверяются по колонкам (дебет с дебетом, кредит с кредитом). **Сальдо** +- По каждому родителю: суммы родителя = Σ детей того же `data_type`. Строки-показатели (§1.3: «Вал.», «Кол.», код + валюты, «В валюте», метки колонки «Показатели» кроме «БУ») в суммирование не входят и сами родителями не проверяются. **Обороты** сверяются по колонкам (дебет с дебетом, кредит с кредитом). **Сальдо** (начало, конец) — по колонкам либо, **если у родителя сальдо свёрнуто** (не больше одной ненулевой стороны), по нетто `дебет − кредит` (R-21): 1С показывает счёт свёрнутым сальдо (62 = 16,1 млн Дт), а субсчета и контрагентов — развёрнутым (62.01 = 40,2 млн Дт, 62.02 = 24,1 млн Кт). Без этого правила 32 из 66 реальных файлов не сходились бы