arm-tabular-parser/api/rules/osv_headers.yaml
Andrey Epifancev dc3d7c8ce9 ОСВ: признак «ОСВ по сч.» вместо «ОСВ…» — перечень документов шаблона банка не ОСВ (#81)
Регрессия банка первички: «ОСВ за квартал по счетам …» на листе «Входные данные_ИП» роняла книги расшифровок.
Негатив s55 дополнен листом-перечнем.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 21:07:08 +04:00

141 lines
11 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Словарь заголовков ОСВ: чем помечены лист, блоки сумм, колонки и служебные строки (05-domain-rules.md §1.0–§1.2).
#
# Правила записи (проверяет загрузчик):
# - паттерн — регулярное выражение Python, ищется (`search`) в НОРМАЛИЗОВАННОМ тексте ячейки и применяется без учёта
# регистра. Нормализация: нижний регистр, «ё» -> «е», дефисы/тире/неразрывные пробелы/переносы строк -> пробел,
# пробелы схлопываются. Поэтому в паттернах нет «ё», дефисов и диапазонов [а-я]: пишите «оборотно сальдовая
# ведомость», «д т», `\w` вместо диапазона;
# - новый синоним = новая строка в нужном списке, без правки кода.
# Лист содержит ОСВ: любая ячейка (первые строки листа) матчит один из паттернов. Названия других учётных систем и
# отчётов 1С (AURORA-1717) — только с начала ячейки: «… см. оборотную ведомость» в примечании формы листом ОСВ не делает
sheet_markers:
- 'оборотно\s*сальдовая\s+ведомость'
- '^оборотн\w*\s+ведомост' # «Оборотная ведомость по счетам …» (выгрузки КТЗ)
# «ОСВ по сч. 41 за 3 кв.», «ОСВ по ДЗ по сч. 62.01» (КТЗ); не «ОСВ за квартал по счетам …» в перечне документов
- '^осв\s+по\s+(\w+\s+по\s+)?сч\b'
- '^оборотн\w*\s+баланс' # «Оборотный баланс» (КТЗ)
- '^фин\.?\s*обороты' # «Фин. Обороты Листок» (Navision, Айсберри)
- '^отчет\s+по\s+главной\s+книге' # SAP, ООО «Виола»
# Три группы сумм в заголовке таблицы. «Оборотно сальдовая» (название ведомости) не должно матчить turnover:
# отсюда границы слова `\bоборот(ы)?\b`. Сторона может стоять в ячейке группы после названия — в том числе вплотную
# («НачалоДт», «ОборотыДтВВ»): паттерн группы тогда заканчивается перед стороной (опережающая проверка), остаток ячейки
# разбирают `debit`/`credit` (AURORA-1719)
groups:
opening:
- 'сальдо\s+на\s+начало'
- '\bнач(альн\w*)?\.?\s*сальдо'
- 'входящ\w*\s+сальдо'
- 'остат\w*\s+на\s+начало' # «Остаток на начало (периода)» (КТЗ)
- 'остат\w*(?=\s+по\s+(дебету|кредиту)\s+на\s+начало)' # «Остаток по дебету на начало» (КТЗ, ЧАЗ)
- 'сальдо\s+начальное' # «Сальдо НачальноеДТВВ» (SAP, НМЖК)
- 'сальдо\s+вх\b' # «Сальдо вх Дт» (SAP, Виола)
- '^начало(?=\s*(дт|кт)\b)' # «НачалоДт» (Navision без названия ведомости, Айсберри)
turnover:
- '\bоборот(ы)?\b'
- '^оборот(ы)?(?=\s*(дт|кт))' # «ОборотДт» (Navision), «ОборотыДтВВ» (SAP, НМЖК)
closing:
- 'сальдо\s+на\s+конец'
- '\bкон(ечн\w*)?\.?\s*сальдо'
- 'исходящ\w*\s+сальдо'
- 'остат\w*\s+на\s+конец' # «Остаток на конец (периода)» (КТЗ)
- 'остат\w*(?=\s+по\s+(дебету|кредиту)\s+на\s+конец)' # «Остаток по кредиту на конец» (КТЗ, ЧАЗ)
- 'сальдо\s+конечное' # «Сальдо КонечноеКТВВ» (SAP, НМЖК)
- 'сальдо\s+исх\b' # «Сальдо исх Кт» (SAP, Виола)
- '^конец(?=\s*(дт|кт)\b)' # «КонецКт» (Navision без названия ведомости, Айсберри)
# Подзаголовки сумм под группой («Дебет»/«Кредит», «Дт»/«Кт», «Д-т»/«К-т») или сторона в остатке ячейки группы:
# ячейка (остаток) начинается с синонима
debit:
- '^(дебет|дт|д т)\b'
- '^по\s+дебету\b' # «Оборот по дебету», «Остаток по дебету на начало» (КТЗ)
- '^дт\s*вв\b' # «Сальдо НачальноеДТВВ» (SAP, НМЖК)
credit:
- '^(кредит|кт|к т)\b'
- '^по\s+кредиту\b' # «Оборот по кредиту» (КТЗ)
- '^кт\s*вв\b' # «Сальдо НачальноеКТВВ» (SAP, НМЖК)
# Служебные колонки таблицы по тексту заголовка. Код знает колонки ИНН и «Показатели»; прочие колонки таблицы (КПП, код,
# количество, валюта и т. п.) попадают в `rows[].extra` под текстом своего заголовка и словаря не требуют.
# (Записи kpp/code/quantity/currency удалены: код их не читал, тест покрытия словарей R-22 их не находил.)
service_columns:
inn:
- '\bинн\b'
# Колонка вида суммы строки 1С («Показатели», в шапке часто с переносом «Показа-тели»): метки БУ/НУ/Кол./Вал./ПР/ВР
# (§1.3, AURORA-1613). Метки читает `data_types.yaml` — `indicator_column`
indicator:
- '^показа\s?тели$'
# Итоговая строка таблицы (начало текста первой колонки)
total_row:
- '^итого\b'
# Итоговая строка, чей текст — ровно «Итого»: ищется первой, чтобы контрагент «Итого-Сервис» на плоском листе (без outline
# и отступов) не обрезал таблицу; нет такой — действует `total_row` (начало текста)
total_row_exact:
- '^итого$'
# выгрузка 1С «по контрагентам»: итог листа — «ИТОГ» (без «О»); «ИТОГ по 60.111» — итог субсчёта (subaccount_sums)
- '^итог$'
# «ВСЕГО» — итог листа ведомостей ГК КТЗ по счёту 009 (AURORA-1732)
- '^всего$'
# Итог субсчёта в выгрузке 1С «по контрагентам»: «ИТОГ по 60.111» — суммы строки-счёта с тем же кодом (группа account);
# отдельной строкой в результат не попадает (05-domain-rules.md §1.3, AURORA-1714)
subaccount_sums:
- '^итог\s+по\s+(?P<account>\S+)$'
# Вторая итоговая строка («Итого развернутое» в 1С): тоже TOTAL, но «Итого» листа — основная. Стоит сразу после основной
# «Итого» или ПЕРЕД ней (плоская форма 1С, #59); сверяется основная
total_row_secondary:
- '^итого\s+развернут'
# Подписи колонок под названием группировки («Счет» -> «Код» | «Наименование»): это не группировки блока заголовка
column_captions:
- '^(код|наименование)$'
# ИНН в тексте строки контрагента (OQ-100): в конце текста, 10 или 12 цифр после запятой, скобки, «/», пробела или
# метки «ИНН» (дефисы нормализация превращает в пробелы), необязательный «/КПП» из 9 цифр. Группы: tail — отрезаемый хвост
# (разделитель, метка, ИНН), inn — цифры ИНН; название контрагента — текст до tail
counterparty_inn_suffix:
- '(?P<tail>[\s,;(/]+(инн\s*[:№]?\s*)?\(?(?P<inn>\d{12}|\d{10})(\s*/\s*\d{9})?\)?)\s*$'
# Строка, где есть только ИНН («7701234567», «ИНН 7701234567 / 770101001»): ИНН строкой выше названия контрагента (OQ-130)
inn_only_row:
- '^(инн\s*[:№]?\s*)?\(?(?P<inn>\d{12}|\d{10})(\s*/\s*\d{9})?\)?$'
# Ячейка колонки ИНН со склеенным «ИНН/КПП»: «7701234567 / 770101001»
inn_kpp_cell:
- '^(?P<inn>\d{12}|\d{10})\s*/\s*\d{9}$'
# Метки шапки документа (область выше заголовка таблицы); ключи фиксированы
header_markers:
# «по счету 60 за …»: код счёта — сразу после совпадения
# выгрузка 1С «ОСВ по счёту 60 по контрагентам»: «Счет Поставщика» | «60*» — метка и код в соседних ячейках строки
account:
- '\bпо\s+счету\b'
- '\bсчет\s+(поставщика|клиента)\b'
# вариант 1: «… за 1 квартал 2025 г.», вариант 2: отдельная строка «Период: 1 квартал 2026 г.»
period:
# выгрузка 1С «по контрагентам»: «За период» | «01.01.25..30.06.25» — значение в соседней ячейке строки; запись
# стоит первой: «\bза\s+» ниже совпала бы с «За период» и оставила бы хвостом слово «период»
- '^за\s+период\b\s*:?\s*'
- '\bза\s+'
- '^период\s*:\s*'
# «Выводимые данные: БУ (данные бухгалтерского учета)»
data_type:
- 'выводимые\s+данные'
# «Валюта БУ, НУ: RUB»
currency:
- '\bвалюта\b'
# «Параметры:» — блок над таблицей
org_params:
- '^параметры\b'
# вариант 2: «Детализация по субсчетам, субконто: Контрагенты, Договоры»; в первой колонке заголовка — «Субконто»
subkonto:
- '\bсубконто\b'
- '\bдетализация\b'
# плоская форма 1С: «за 2 Квартал 2026 г. План счетов ООО Хреновская Нива» — организация после метки
chart_of_accounts:
- '\bплан\s+счетов\b'