arm-ka-docs/context/06-test-data.md
Andrey Epifancev 17857dd1d1 06-test-data §7: синтетика s33–s36 (tabular-parser#58)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 12:26:03 +04:00

314 lines
41 KiB
Markdown
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.

# 06. Тестовые данные (реальная группа «Русский бисквит»)
Все файлы — реальная первичка одной группы компаний, полученная от аналитиков ДКБ. Живут в отдельном репозитории
`arm-ka-fixtures` (workspace: `fixtures/`) **с исходными именами**, не переименовывать: имена тоже тест.
Данные содержат наименования контрагентов и ИНН реальных организаций — репозиторий внутренний, наружу не выносить.
> **Фикстуры ≠ спецификация.** Это выгрузки из одной конфигурации 1С у двух организаций. ОСВ других клиентов будут
> отличаться: другие колонки, другой порядок субконто, без outline level, другие заголовки, несколько листов, ББ/ОФР
> в Excel. Всё, что ниже в §3 «показали файлы», — наблюдения для регрессии и для словарей синонимов, а не правила
> парсера. Правила — `05-domain-rules.md` §1.0 и §12.
## 1. Периметр
| Организация | ИНН | Роль в группе | Что есть |
|---|---|---|---|
| АО «Русский бисквит» (АО РБ) | 3528052718 | заёмщик, фактически головная | ОСВ 01, 02, 58, 60, 62, 66, 67, 76 за 1–3 кв. 2024, 2024 г., 1–3 кв. 2025; ББ/ОФР за 9 мес. 2024, 2024 г., 1 кв. 2025, 1 полуг. 2025, 9 мес. 2025; расшифровки на 01.10.24, 01.04.25, 01.07.25; анализ заёмщика |
| ООО «Пекарня «Счастливочная» | 3528… (есть в ББ) | поручитель, дочерняя/связанная | ОСВ 01, 02, 58, 60, 62, 66, 67, 76 за 1–3 кв. 2024, 2024 г., 1–3 кв. 2025; ББ/ОФР (сканы «БО …»); анализ поручителя |
| Прочие контрагенты из ОСВ | ОАО «ЧКФ» (аренда), ООО «Лидер», ООО «ОФГ» (займы), Россельхозбанк, ВТБ, Сбербанк и др. | внешние / возможно ГК | нужны для проверки признака ГК vs Внешний |
Внутригрупповые связи, видимые в ОСВ (для тестов матчинга ВГО):
- У «Счастливочной» в ОСВ 62 контрагент **«Русский бисквит», ИНН 3528052718** (Дт 62.01 ≈ 106,3 млн на 30.09.2024, Кт 62.02
авансы 14,2 млн). Зеркально у АО РБ в ОСВ 60 контрагент записан как **«Юг-Финанс / ПЕКАРНЯ СЧАСТЛИВОЧНАЯ»** (без ИНН,
иногда с пробелом в конце; Кт 60.01 на 30.09.2024 = 106 311 116,46 — совпадает копейка в копейку с Дт 62.01 у
Счастливочной) — идеальный тест резолва по алиасу и точного матча 1:1 по правилу № 6.
- У АО РБ в ОСВ 66 за 3 кв. 2024: заём 42 000 000 от «Юг-Финанс / ПЕКАРНЯ СЧАСТЛИВОЧНАЯ» (66.03) и проценты (66.04) —
зеркало должно быть у Счастливочной на 58.03 (правило № 4) и 76 (проценты, правило № 5).
- «ЧКФ АО» (ОАО «ЧКФ») — у АО РБ на 58.03 (заём 10 млн), 60, 76 (аренда/лизинг, крупные суммы на 76.07.x) — скорее
всего третий участник ГК; есть ли он в периметре ГСК — уточнить у аналитиков. Пара 76.07.x ↔ 03/01 — тест правила № 1.
- «ОФГ ООО» (займы 66.03/66.04, 62), «Лидер ОП», «ЛИДЕР-КРЫМ ООО», «ТЕХНОЛИДЕР ООО» — кандидаты на ГК vs Внешний.
- ОСВ 58.03 АО РБ за 3 кв. 2024: займы выданные «МАЛЕЧКИНСКАЯ ПТИЦЕФАБРИКА ООО» (75 млн, ИНН 3523023093 — есть в ОСВ 62
Счастливочной) и «РБ ТК» (13,1 млн) — почти наверняка участники ГК «Русский бисквит»; ОСВ по ним в наборе нет
(OQ-25). В этом файле уровень 1 — сразу контрагент (счёт в шапке уже субсчёт), уровень 2 — договор.
Эталон результата: `Консолидация_Группа РБ.xlsx` — ручная консолидация аналитика на 01.10.2024, 01.01.2025,
01.04.2025, 01.07.2025, 01.10.2025 (листы по датам). На листе `01.10.2024` видно ожидаемые «в т. ч. взаимные
обязательства» по статьям (напр., 1150: 51 577; 1230: 4 814 у АО РБ и 108 062 у Счастливочной; 1250: 42 000 у
Счастливочной). Это **golden-данные для интеграционных тестов** консолидации (с допуском на ручные правки аналитика).
## 2. Инвентарь ОСВ (xls/xlsx из 1С 8.3)
Формат имени в наборе аналитиков сильно варьируется — это намеренно хорошие тесты для парсера шапки, а не имени файла.
### АО «Русский бисквит»
| Счёт | 1 кв. 2024 | 2 кв. 2024 | 3 кв. 2024 | 2024 г. | 1 кв. 2025 | 2 кв. 2025 | 3 кв. 2025 |
|---|---|---|---|---|---|---|---|
| 01 | — | — | `сч 01.xlsx` (306 стр., 24 кол.) | `ОСВ_01_ОС по субсчетам.xlsx` | `ОСВ сч 01 за 1 кв 2025 год.xlsx` | — | `ОСВ сч 01 за 3 кв 2025г.xlsx` |
| 02 | — | — | — | `ОСВ_02_ОС по субсчетам.xls` | `ОСВ сч 02 за 1 кв 2025 год.xlsx` | `сч 02.xlsx` | `ОСВ сч 02 за 3 кв 2025г.xlsx` |
| 58 | — | — | `сч 583_3 кв 2024.xlsx` (**по субсчёту 58.03**) | `ОСВ_58 за 2024.xls` | `ОСВ сч 58 за 1 кв 2025 год.xlsx` | `сч 58.xlsx` | `ОСВ сч 58 за 3 кв 2025г.xlsx` |
| 60 | `сч 60_ 1 кв 2024 г.xlsx` (626 стр.) | `сч 60_ 2 кв 2024 г.xlsx` | `сч 60_3 кв 2024.xlsx` | `ОСВ_60 за 2024.xls` (1045 стр.) | `ОСВ сч 60 за 1 кв 2025 год.xlsx` | `сч 60.xlsx` | `ОСВ сч 60 за 3 кв 2025г.xlsx` |
| 62 | `сч 62_ 1 кв 2024 г.xlsx` | `сч 62_ 2 кв 2024 г.xlsx` | `сч 62_3 кв 2024.xlsx` | `ОСВ_62_по субсчетам и поставщикам.xls` | `ОСВ сч 62 за 1 кв 2025 год.xlsx` | `сч 62.xlsx` | `ОСВ сч 62 за 3 кв 2025г.xlsx` |
| 66 | — | — | `сч 66_3 кв 2024.xlsx` | `ОСВ_66 за 2024.xls` | `ОСВ сч 66 за 1 кв 2025 год.xlsx` | `сч 66.xlsx` | `ОСВ сч 66 за 3 кв 2025г.xlsx` |
| 67 | — | — | `сч 67_3 кв 2024.xlsx` | `ОСВ_67 за 2024.xls` | `ОСВ сч 67 за 1 кв 2025 год.xlsx` | `сч 67.xlsx` | `ОСВ сч 67 за 3 кв 2025г.xlsx` |
| 76 | — | — | `сч 76_3 кв 2024.xlsx` | `ОСВ_76 за 2024.xls` | `ОСВ сч 76 за 1 кв 2025 год.xlsx` | `сч 76.xlsx` | `ОСВ сч 76 за 3 кв 2025г.xlsx` |
### ООО «Пекарня «Счастливочная» (имена `Оборотносальдовая ведомость по счету NN за … г..xlsx|xls`)
| Счёт | 1 кв. 2024 | 2 кв. 2024 | 3 кв. 2024 | 2024 г. | 1 кв. 2025 | 2 кв. 2025 | 3 кв. 2025 |
|---|---|---|---|---|---|---|---|
| 01 | — | — | xls | xlsx | xlsx | xlsx | xlsx |
| 02 | — | — | xls | xlsx | xlsx | xlsx | xlsx |
| 58 | — | — | — | xlsx | xlsx | xlsx | xlsx |
| 60 | xls | xls | xls | xlsx | xlsx | xlsx | xlsx |
| 62 | xls | xls | xls | xlsx | xlsx | xlsx | xlsx |
| 66 | — | — | — | xlsx | xlsx | xlsx | xlsx |
| 67 | — | — | — | xlsx | xlsx | xlsx | xlsx |
| 76 | xls | xls | xls | — | xlsx | xlsx | — |
Набор 2025 г. неполный: во 2 кв. нет 62/67/76, в 3 кв. — 58/62/66/67/76. 1 кв. 2025 дополнен пакетом ДКБ
06.10.2026 (02, 58, 62, 66, 67, 76; имена новых файлов — с дефисом «Оборотно-сальдовая …»). Реальных ОСВ в `osv/` — 72.
## 3. Что показали реальные файлы (требования к парсеру)
Наблюдения, которых **нет в ТЗ**, но которые ломают наивный парсер:
1. **Шапка везде вариант 1** («Оборотно-сальдовая ведомость по счету NN за <период>»), организация — в r1, параметры —
r7, таблица с r9. Но заголовок таблицы может быть 2 или 3 строки (`Счет / Контрагенты / Договоры`; `Счет /
Подразделение / Контрагенты ИНН`).
2. **Позиции колонок сумм плавают**: у АО РБ Дт-начало в E, Кт-начало в H, обороты в J/L, конец в O/Q; у Счастливочной
— G/J, K/N, Q/S (2024, xls) или H/J, L/O, Q/S. Колонка ИНН — E (только у Счастливочной). Определять по тексту заголовка.
3. **Мусор правее таблицы**: в xls Счастливочной 62 за 3 кв. 2024 в колонках T/U стоят числа; в xlsx АО РБ 62 за 2024–2025
у контрагентских строк встречаются «хвостовые» ячейки с дробями вроде `8.577e+00` или `8.76e-06` (остатки формул
аналитика). Границу таблицы задаёт заголовок; всё правее последней «Кредит» — игнорировать.
4. **Уровни группировки** (outline level): 0 — счёт верхнего уровня и «Итого»; 1 — субсчёт; дальше — субконто по
схеме. У АО РБ ОСВ 60: 60 (0) → 60.01 (1) → контрагент (2); ОСВ 66: 66 → 66.01 → контрагент (2) → договор (3).
У Счастливочной ОСВ 62: 62 → 62.01 → подразделение «БП Аренда» (2) → контрагент с ИНН (3).
5. **Строка «Итого»** — последняя, level 0, равна строке счёта верхнего уровня.
6. **Пустые ячейки** = нет значения (NULL), не ноль. Значения — числа (`#,##0.00`), не текст.
7. **ОСВ по субсчёту** (`сч 583_3 кв 2024.xlsx`: «по счету 58.03») — `osv_account_code = '58.03'`, `account_root = '58'`;
чек-лист по счёту 58 этим файлом не закрывается полностью — решить правило [открыто].
8. **Квартальные vs нарастающие**: ОСВ «за N квартал» у обеих компаний — **квартальные**: у АО РБ ОСВ 60 opening 1 кв.
2024 = 260,1 млн, opening 2 кв. = 311,96 млн = closing 1 кв., opening 3 кв. = 558,8 млн ≈ closing 2 кв. (559,3 млн —
расхождение 0,5 млн: исправительные проводки задним числом, тоже реальный кейс). «За 2024 г.» — годовые.
Проверять по данным, не только по тексту.
9. **Валюта**: `Валюта БУ, НУ: RUB` или `руб.` — равнозначно. Строк Вал./Кол. в этом наборе нет, но ТЗ их описывает
(ОСВ 60.32 в у. е.) — закрыто синтетикой `s04` (§7).
10. **Названия субсчетов** в строках счёта могут присутствовать («60.01, Расчеты с поставщиками») или нет — в этом
наборе нет; поддержаны оба, синтетика `s09` (§7).
11. **Контрагенты-физлица** и ИП («Абрамова Татьяна Викторовна (Перевозчик)», «Аверина Е.И. ИП», «Ведомость в счет
з/платы») — не ЮЛ; резолв даёт NULL, тип «Внешний». Суффиксы в скобках — часть имени.
12. **xls (BIFF8)** читается `xlrd` (`formatting_info=True` для outline level через `rowinfo_map`); **xlsx** — `openpyxl`
(не `read_only`, иначе нет `row_dimensions[].outline_level`). XLSB — `pyxlsb` (в реальном наборе нет; ТЗ требует;
есть только рукописный синтетический `s13`, см. §7).
13. Размеры: до ~1000 строк, до 330 КБ; 2280 merged-диапазонов в файле на 677 строк — не падать на merged.
14. **Две пустые ОСВ**: `schastl/2025-Q2/…по счету 58 за 2 квартал 2025 г..xlsx` и `…по счету 66 за 2 квартал 2025 г..xlsx` —
заголовок и сразу «Итого», строк данных нет. Штатный случай: `done`, `hierarchy=trivial`, `metrics.rows = 0`.
15. **Буквенные субсчета 1С** «76.АВ», «76.ВА», «76.ОТ» — в 8 файлах ОСВ 76 (АО РБ: 2024 г., 3 кв. 2024, 1–3 кв. 2025;
Счастливочная: 1–3 кв. 2024). Это счета (ACCOUNT), а не контрагенты; регулярка кода счёта допускает 1–3 заглавные буквы
в сегменте субсчёта (§1.3 п. 1 правил).
16. **Сальдо родителя нетто, детей развёрнуто**: 1С показывает счёт свёрнутым сальдо (62 = 16,1 млн Дт), а субсчета —
развёрнутым (62.01 = 40,2 млн Дт, 62.02 = 24,1 млн Кт); без учёта этого 32 из 66 файлов не сходились бы по
колонкам (§1.4 правил, R-21).
17. **ИНН внутри текста строки**: у Счастливочной в ОСВ 76 за 1–3 кв. 2024 встречаются контрагенты вида «Полиграф, 3528315710»
(20 строк) без колонки ИНН; парсер ИНН из текста не извлекает (OQ-100).
## 4. ББ / ОФР (PDF) и ответы ИС Сканирование
| Файл | Орг. | Период | Тип |
|---|---|---|---|
| `АО РБ_ф.1_ 2024 год.pdf`, `АО РБ_ф.2_ 2024 год.pdf` | АО РБ | 2024 г. | машиночитаемый PDF (форма 66н), 3 + 2 стр. |
| `Отчетность 30092024 РБ.pdf` | АО РБ | 9 мес. 2024 | скан с OCR-слоем, 5 стр. |
| `Бухгалтерская отчетность 1 кв.25.pdf` | АО РБ | 1 кв. 2025 | скан, 6 стр. |
| `Бух отчетность за 2 кв 2025г.pdf` | АО РБ | 1 полуг. 2025 | PDF с текстом, 7 стр. |
| `Бухгалтерская отсчетность 9 мес.25.pdf` | АО РБ | 9 мес. 2025 | скан, 8 стр. |
| `БО 31.12.2024.pdf` | Счастливочная (предп.) | 2024 г. | машиночитаемый, 11 стр. (полный комплект) |
| `БО 9 мес. 2024 год скан.PDF`, `БО 1 кв 2025.PDF`, `БО за полугодие 2025 год. скан с подписями.PDF`, `БО за 9 месяцев 2025.PDF` | Счастливочная (предп.) | соотв. | сканы 4–5 стр. |
| `aep_4.PDF`, `aep_5.PDF` | разные | — | выписки из ГИР БО (ресурс БФО) — другой шаблон, для теста классификации |
| `aep_6…9, aep_30…34 (pdf)` + `*_aep_N.json` (в Project docs) | разные | — | **пары «вход OCR → выход OCR»** от ИС Сканирование: фикстуры контракта `scan-gateway` |
JSON `aep_*.json` — реальные ответы Content AI: структура `data_ocr[].table_structure.rows[].cells[]`, confidence в
процентах (100.0), поле организации может называться иначе, чем в ТЗ — нормализацию делать по этим файлам, а не по ТЗ.
В фикстурах встречаются файлы с ББ **и** ОФР в одном PDF (→ два `document` из одного `stored_file`).
## 4а. Пакет ДКБ 06.10.2026: организации вне группы РБ, ББ/ОФР в Excel, план счетов 1С
Один zip «Документы по дкб в формате xls» + отдельные файлы, разложены в `fixtures/` (PR arm-ka-fixtures#7):
| Что | Где | Состав |
|---|---|---|
| ОСВ шести организаций (29 файлов, 34 МБ) | `osv-dkb/<org>/<период>/` | АО «Цимлянский» (7 ОСВ за 9 мес. 2025), ООО «Новороссийский Кислородный завод» (2 книги по 3 листа), ООО «Новоросметалл» (2 книги по 3 листа + ОСВ 63; вариант 2, «сумма»), ООО «Новороссийский прокатный завод» (2 книги; одна за окт. 2024 – сент. 2025), ООО «Приманыческий» (7 ОСВ), АО фирма «Агрокомплекс» им. Ткачева (4 ОСВ по 50 тыс. строк, 9–14 МБ) |
| «Анализ счета» (3 книги) | `analysis-reports/<org>/2025-Q3/` | отчёт 1С по корреспонденции счетов с отбором по контрагентам группы; не ОСВ, парсер отвечает `INVALID_DOCUMENT` |
| ББ/ОФР в Excel (18 файлов: 14 форм и 4 шаблона) | `statements-xlsx/<org>/<период>/` | АО «Унагранде Ко» и «Унагранде Групп» (постраничные xls из 1С, 2024 г. и 9 мес. 2025), ООО НПЗ (одна книга ФСБУ 4/2023 с подстроками «в том числе»), ООО «Агрофирма Межениновская» (TDSheet, 66н); `templates/` — пустые формы 66н и ФСБУ 4/2023 |
| План счетов 1С заказчика | `directories/chart-of-accounts-1c.xlsx` | 488 строк: код, наименование, субконто 1–3, вид; в seed 122 кода, все есть в выгрузке; 366 кодов выгрузки в seed нет (OQ-113, arm-core#23) |
`osv-dkb/` намеренно вне `osv/`: fixtures-тесты парсера и ядра требуют один лист `Лист_1`, `done`, период = каталогу и
golden-снимок на каждый файл, а здесь многолистовые книги, `needs_check`, скользящий период и файлы по 14 МБ. Обобщение
тестов — arm-tabular-parser#10. Что показали файлы (8 находок: скользящий период «Октябрь 2024 г. – Сентябрь 2025 г.»,
тождество сальдо на счёте 91, несколько корней без строки счёта, шапка ОСВ 63 с кодом и названием в двух колонках,
«Итого развернутое», листы с именем кода счёта, нет валюты в шапке, объём) — `fixtures/osv-dkb/README.md`,
arm-tabular-parser#11, OQ-131…OQ-135. ИНН организаций в шапках ОСВ нет (OQ-136).
## 4б. Формы ББ/ОФР в Excel: манифест, golden, синтетика (Срез 2b)
**Раскладки реальных файлов** (`fixtures/statements-xlsx/`, README там же; 18 файлов: 14 форм и 4 шаблона):
| Раскладка | Где | Особенности |
|---|---|---|
| 1С-xls постранично | `unagrande-co/2024-FY/`, `unagrande-group/{2024-FY,2025-Q3}/` | один файл = одна страница формы; на странице 1 титул (организация, ИНН, ОКПО, единица «в тыс. рублей», ОКЕИ, аудитор со **своим** ИНН), на странице 2 только «Форма 0710001 с.2»; пятизначные подстроки (11101…), значения в ячейке — рубли с копейками, в тысячи их переводит числовой формат (`#,##0,`), парсер берёт значение как показывает формат (OQ-138, #42); страниц 1 ББ в пакете нет (только актив) и ОФР Групп 2024 — только стр. 2 |
| Многолистовая xlsx ФСБУ 4/2023 | `npz/2025-Q3/` | ББ на 5 листах, ОФР на 3 (третий — одна строка 2400, присоединяется как продолжение); заголовок формы после титула; листы 2–5 без заголовка и маркера; строка 1105 «Гудвил», подстроки 12301…, строка без кода с суммами; лист ОФР с одной строкой 2400 (OQ-143) |
| `TDSheet` 66н | `mezheninovskaya/2025-Q3/` | вся форма на одном листе, дата тройкой «30 \| 9 \| 2025» числами, двухстрочные заголовки, строка нумерации колонок, значения — тысячи с дробной частью; формат `#,##0` показывает их целыми, парсер берёт показанное (OQ-138, #42) |
| Шаблоны | `templates/` | 66н и ФСБУ 4/2023: коды есть, сумм и шапки нет; заголовок на две строки; в шаблоне ФСБУ «АКТИВ» и код 1110 в одной строке (OQ-142) |
**Манифест** `tabular-parser/api/tests/statements_manifest.yaml`: для каждого из 18 файлов — организация, ИНН, документы по
порядку (`type`, `status`, `complete`, причина `needs_check`, `failed_relations`). Статусы сверены прогоном: `done` — полные
формы (Межениновская ББ и ОФР, книга НПЗ, ОФР стр. 1 Унагранде Компани и Групп 3 кв. 2025: расхождения итогов —
округление, мягкие, OQ-138; значения — как показывает числовой формат, #42); `needs_check` — по данным файла: только актив (ББ стр. 1), страница 2 без шапки, шаблон без сумм.
Таблица «файл → статус» — README `tabular-parser`, «Парсер форм».
**Golden** `fixtures/golden/expected_statement_parse/<тот же путь без расширения>.json` — 24 снимка (18 реальных файлов +
6 синтетических); регрессия, не оракул; обновление — `make golden-update` (один для ОСВ и форм), просмотр diff, отдельный
коммит в `fixtures`. Оракулы корректности — манифест и property-тест `tests/fixtures/test_statements_property.py` (манифест покрывает
каждый файл; тип, статус и видимая причина `needs_check` каждого документа совпадают с ожиданиями).
**Синтетика** `fixtures/statements-xlsx/synthetic/st01…st07` (генератор `tabular-parser/api/tests/synthetic/generate_statements.py`,
ожидания — `tests/synthetic/test_statement_synthetic_files.py`, описание — README каталога):
| Файл | Что проверяет |
|---|---|
| `st01_both_forms_one_sheet` | ББ и ОФР на одном листе, два документа с одним `locator` (§12 п. 1) |
| `st02_csv_like` | csv-подобный лист: двухстрочный заголовок, коды без подписи «Код», отрицательное значение, единиц нет |
| `st03_no_codes` | форма без колонки кодов → `needs_check`, «колонка кодов не найдена» (OQ-139) |
| `st04_mixed_book` | книга: лист ОСВ + лист баланса, порядок документов ОСВ → форма |
| `st05_continuation_only` | одинокая страница 2 → `needs_check`, предупреждение о продолжении (OQ-140) |
| `st07_single_code_continuation` | ОФР без 2400 на первом листе и лист-продолжение с единственной кодовой строкой 2400 присоединяется (OQ-143) |
| `st06_header_variants` | варианты, которых нет в реальных файлах: старое название ОФР, расшифровки/ОДДС/ОИК, форма только с ОКУД 0710xxx, организация в «», «Адрес», «Пояснения», числовая дата (покрытие словарей `statement_*.yaml`) |
## 5. Прочее
- `Форма расшифровки к отчетности 01 10 24 / 01 04 25 / 01 07 25.xlsx` — расшифровки АО РБ (кредиты и займы, дебиторы и
кредиторы с ИНН, поручительства, аренда, лизинг/залог, «К балансу»). Полезны как независимый источник ИНН контрагентов
и для будущего `DISCLOSURE`.
- `Копия Рекомендуемые формы расшифровок_РБ копия на 30.09.25.xlsx` — рекомендуемые банком формы расшифровок по строкам
ББ (1110, 1120, 1150 …) с данными на 30.06 и 30.09.2025 по участникам группы.
- `Анализ Русский бисквит_заемщик 01102025.xlsx`, `Анализ Счастливочная_поручитель 01102025.xlsx` — макросные книги
«Альбома инструментов и стандартов кредитования» (БлокТ32): листы «Отчетность», «Экспресс-анализ», «ЗАКЛ_лимит»,
«ЗАКЛ_сделка», «П2_ОД-2967», «Профсуждение» — контекст для будущей формы 276-ОД, не для первых срезов.
- `diagrams_v5.12.zip` → `docs/model/diagrams/` (part01…09 svg/png) — исходная поставка; с v5.17 диаграммы перерисовываются
из DBML (`make diagrams` в docs, см. `04-data-model-guide.md`).
## 6. Раскладка репозитория `arm-ka-fixtures` (workspace `fixtures/`)
```
fixtures/
README.md # откуда данные, ограничения доступа
osv/
rb/ 2024-Q1/ 2024-Q2/ 2024-Q3/ 2024-FY/ 2025-Q1/ 2025-Q2/ 2025-Q3/ # файлы с исходными именами
schastl/ ...
synthetic/ README.md + s01…s19 (генератор в tabular-parser, §7)
statements/
rb/ schastl/ gir-bo/ # pdf
statements-xlsx/<org>/<период>/ # ББ/ОФР в Excel (§12, §4а): unagrande-co, unagrande-group, npz,
# mezheninovskaya, templates/ (пустые формы 66н и ФСБУ 4/2023)
osv-dkb/<org>/<период>/ # ОСВ пакета ДКБ вне тестов osv/** (§4а)
analysis-reports/<org>/<период>/ # отчёты «Анализ счета» (не ОСВ)
ocr/
aep_N.pdf|PDF + aep_N.json # пары вход/выход ИС Сканирование (эмулятор ИС
# в scan-gateway находит пару по sha256 содержимого
# входного PDF; имя и регистр расширения входного
# файла, `<uuid>.<ext>`, значения не имеют; набор —
# `<основа>.json` + `<основа>_*.json`; PDF без
# JSON-набора (aep_4/7/9/30–34) — `INVALID_DOCUMENT`)
expected_normalize/ # эталоны нормализатора scan-gateway (Срез 3a)
golden/
Консолидация_Группа РБ.xlsx # эталон КФО по датам
expected_osv_parse/<зеркало osv/ без расширения>.json # golden-снимки парсера ОСВ: 113 файлов (94 реальных: 72 в osv/ + 22 в osv-dkb/; + 19 синтетических)
expected_statement_parse/<зеркало statements-xlsx/ без расширения>.json # golden-снимки парсера форм ББ/ОФР: 24 файла (18 реальных + 6 синтетических), §4б
directories/
ecp-export-russkiy-biskvit.xlsx # срез выгрузки ЕЦП CRM по ГК «Русский Бисквит» (Срез 1)
chart-of-accounts-1c.xlsx # план счетов 1С заказчика, 488 строк (пакет ДКБ, OQ-113)
```
`directories/` содержит срез выгрузки ЕЦП CRM по группе «Русский бисквит» (Срез 1, §6.1).
### 6.1 `directories/ecp-export-russkiy-biskvit.xlsx` — фикстура импорта справочников (Срез 1)
Срез реальной выгрузки ЕЦП CRM (`docs/source/biq/ecp-export-lagal-entity.xlsx`, лист «Выписки_01.04.26»; формат импорта —
`05-domain-rules.md` §13) по одной ГК. Тот же формат колонок: `ИНН`, `iD ГК`, `Базовый РФ ГК в CRM`, `Группа компаний`,
`Организация`, `ГСК`, `ГСЗ`, `Тип`. Используется тестами импорта `arm-core` (`tests/` Среза 1).
| Что | Значение |
|---|---|
| Строк данных | 21 (+ строка заголовков) |
| ГК | одна: «Русский Бисквит», `iD ГК` = `1-AZFL6BQ`; базовый РФ — «Санкт-Петербургский РФ» |
| Импортируется | 20 ЮЛ/ИП: 18 ЮЛ + 2 ИП |
| Пропускается | 1 строка типа `ФЛ` (ИНН совпадает с ИП `352819549855`) → `UNSUPPORTED_TYPE` (проверка типа идёт раньше проверки дубля, поэтому `DUPLICATE_IN_FILE` в этом файле не возникает) |
| Члены ГСК (флаг «входит в ГСК») | АО «Русский бисквит» `3528052718` и ООО «Пекарня Счастливочная» `3528104476` → одна ГСК «Русский Бисквит» |
| ГСЗ | флагов нет — ГСЗ не создаётся |
| Кандидаты OQ-25 | ЧКФ, ОФГ, Малечкинская птицефабрика, ТК РБ — в составе ГК, но без флага ГСК |
Ожидаемый отчёт на пустой БД: `rows = 21`, `groups_created = 1`, `offices_created = 1`, `entities_created = 20`,
`memberships_created = 2`, `errors = 1`. Полная выгрузка (8400 строк, 345 ГК) в `fixtures/` не копируется — лежит в
`docs/source/biq/` (внутренние данные) и нужна для прогона импорта целиком.
Справочники **продукта** — план счетов, правила элиминации, права и роли, состав обязательных документов,
региональные офисы — не фикстуры, а seed ядра: `arm-core/api/seed/core/` (обязательные данные: `roles.yaml`,
`permissions.yaml`, `role_permissions.yaml`, `regional_office.yaml`, `chart_of_accounts.csv`, `elimination_rules_v1.yaml`,
`required_document_rules.yaml`) и `arm-core/api/seed/dev/` (только `python -m scripts.seed --dev`: dev-пользователи и
примеры РФ). Загрузчик — `python -m scripts.seed [--dev]` из `arm-core/api/` (идемпотентен, upsert по натуральному ключу;
в compose его выполняет одноразовый сервис `arm-core-migrate`). Здесь остаются только тестовые данные группы.
План счетов 1С заказчика получен 06.10.2026 (`directories/chart-of-accounts-1c.xlsx`, 488 строк); seed пока на Плане счетов 94н и типовых субсчетах (OQ-47, OQ-113 → arm-core#23).
Первый прогон парсера на `osv/**` сохранён как `expected_osv_parse/*.json` после ручной сверки итогов со строкой «Итого»
(§7) — дальше это regression-набор.
## 7. Синтетика, golden-снимки и xlsb парсера ОСВ (Срез 2a)
Реальные файлы покрывают один вариант шапки и один формат файла (xls/xlsx из 1С 8.3). Остальное — синтетика
`fixtures/osv/synthetic/` (вымышленные организации и ИНН; суммы согласованы арифметически, поэтому листы ОСВ, кроме
`s10`, дают `done`; книги `s12`/`s14` с формами — `needs_check` по формам). Файлы собирает детерминированный генератор `tabular-parser/api/tests/synthetic/generate.py`
(повторный запуск даёт те же байты), ожидания по каждому файлу — в `tests/synthetic/test_synthetic_files.py`, описание —
в `fixtures/osv/synthetic/README.md`.
| Файл | Назначение (что из §1 проверяет) |
|---|---|
| `s01_variant2_header` | шапка варианта 2 («Период:», «Детализация по субсчетам, субконто: …», заголовок «Субконто», данные «Сумма») |
| `s02_no_outline_indent` | иерархия без outline level — по отступам (`hierarchy=indent`); `Валюта БУ, НУ: руб.` |
| `s03_no_outline_no_indent` | ни outline, ни отступов — по кодам счетов и жирности (`hierarchy=account_pattern`); римский квартал |
| `s04_currency_quantity_rows` | строки «USD», «Вал.», «Кол.» под контрагентом (`CURRENCY`/`QUANTITY`) |
| `s05_text_numbers` | суммы текстом: «1 234 567,89», «(1 234,00)», «—», неразрывные и узкие пробелы |
| `s06_two_osv_and_other_sheet` | два листа ОСВ и посторонний лист «Справка» |
| `s07_no_opening_collapsed_closing` | нет группы «Сальдо на начало»; свёрнутое сальдо на конец одной колонкой (в т. ч. R-21) |
| `s08_extra_kpp_column` | колонка «КПП» между «ИНН» и суммами → `extra` |
| `s09_subaccount_names` | названия субсчетов в строке счёта, буквенный субсчёт |
| `s10_broken_sum` | испорченная сумма → `needs_check` с номерами строк |
| `s11_header_repeat` | заголовок таблицы повторяется внутри данных (печать по страницам) |
| `s12_statement_and_osv` | лист ББ и лист ОСВ в одной книге: с Среза 2b — два документа (ОСВ, затем ББ без колонки кодов → `needs_check`) |
| `s13_no_outline_indent` (`.xlsb`) | та же ведомость, что `s02`, в xlsb |
| `s14_statement_forms` | три формы ББ/ОФР, каждая опознаётся своим признаком (с 2b — документы `BALANCE`/`INCOME` без колонки кодов, `needs_check`) |
| `s15_group_title_synonyms` | названия групп сумм «Входящее/Начальное/Конечное/Исходящее сальдо» |
| `s16_header_synonyms` | шапка без организации, период «2024», группировки `OTHER`, «Детализация: …» |
`s17`–`s19` — извлечение ИНН (из текста названия, из строки над названием, «ИНН/КПП» в одной ячейке; OQ-100, OQ-130);
`s20`–`s27` — по одной на раскладку строки ИНН рядом с наименованием (над / под × в дереве / не в дереве × с суммами / без;
ИНН с верной контрольной суммой), `s28` — строка ИНН с неверной контрольной суммой (остаётся строкой, `needs_check`);
правило — `05-domain-rules.md` §1.3, OQ-163.
`s33`–`s36` — строки-показатели (`05-domain-rules.md` §1.3, AURORA-1613, AURORA-1661, tabular-parser#58):
`s33_indicator_column_bu_nu` — счёт 02, колонка «Показатели» БУ/НУ, шапка без «Выводимые данные», «Итого» по БУ и НУ;
`s34_indicator_column_qty_val_diff` — метки «Вал.», «Кол.», «ПР», «ВР» и неизвестная «Ед.»: показатели вне сверки родителя;
`s35_currency_slices` — пары «Валюта USD/EUR» (рубли) и «В валюте» (показатель `CURRENCY`) на одном уровне;
`s36_no_data_type_header` — шапка без вида данных и без колонки «Показатели»: строки `BU` по умолчанию с предупреждением.
Формы ББ/ОФР из Excel — подраздел 4б. `s14`–`s16` добавлены тестом покрытия словарей: каждая запись `rules/*.yaml` обязана сработать на реальных или
синтетических файлах.
**xlsb рукописный.** `s13` собран **не Excel и не LibreOffice** (их нет на машине разработки), а минимальным писателем
BIFF12 `tabular-parser/api/tests/synthetic/xlsb_writer.py`: он пишет только то, что читает `pyxlsb`. Файл читается
парсером, но совместимость с xlsb, сохранённым Excel (стили, другая раскладка записей), **не проверена**; нужен реальный
файл из Excel (OQ-102). Инструкция замены — в README `fixtures/osv/synthetic/`.
**Golden-снимки.** Для каждого файла `fixtures/osv/**` (включая синтетику) в `fixtures/golden/expected_osv_parse/` лежит
результат разбора (113 файлов: 94 реальных и 19 синтетических `s01`–`s19`): файл результата контракта v1.2 (v1.1 — до Среза 2b) без `job_id`, `file_id`,
`service.version`, `metrics.duration_ms`. Снимок — **регрессия, не оракул**: он фиксирует, что парсер выдаёт сейчас.
Обновление — только `make golden-update` в `tabular-parser` с просмотром diff и отдельным коммитом в `fixtures`;
`make golden-check` (код возврата 1 при расхождении) — без записи. Оракулы корректности — property-тест
(`done`, контрольные суммы, корень = счёт шапки, период распознан, разбор < 5 с) и ручная сверка «Итого» с ячейками
файла, прочитанными независимо от парсера (АО РБ 60 за 1 кв. 2025, Счастливочная 62 за 3 кв. 2024 xls, ОСВ по субсчёту
58.03).