# osv-dkb — ОСВ организаций из пакета ДКБ (06.10.2026) Реальные ОСВ шести организаций вне группы «Русский бисквит», присланные ДКБ одним пакетом («Документы по дкб в формате xls.zip»). Данные внутренние, наружу не выносить. Раскладка — `osv-dkb/<организация>/<период>/`, имена файлов исходные. Период каталога — по шапке документа, не по имени файла: `2025-Q3` = «9 месяцев 2025 г.», `2024-10_2025-09` = «Октябрь 2024 г. – Сентябрь 2025 г.» (скользящие 12 месяцев, не с начала года). **Почему отдельный каталог, а не `osv/`.** Тесты `tabular-parser` по `osv/**` требуют от каждого файла: один лист ОСВ с именем `Лист_1`, статус `done`, период = каталогу `YYYY-Qn`, golden-снимок. Здесь это не так: книги с несколькими листами ОСВ, статусы `needs_check`, листы `58`/`TDSheet`, скользящий период в каталоге `2024-10_2025-09`, файлы по 9–14 МБ. Для пакета ДКБ тесты обобщены (`tabular-parser/api/tests/fixtures/test_osv_dkb.py`, issue #10): инварианты на каждом файле; ожидаемые нарушения контрольных сумм — манифест `tabular-parser/api/tests/osv_dkb_expectations.yaml` (данные, не условия по имени файла); период — по имени каталога; golden-снимки (`golden/expected_osv_parse/osv-dkb/`) — у файлов до 1 МиБ (22 из 25), у трёх файлов Агрокомплекса (9–14 МБ, ~50 тыс. строк) — только property-тесты. Прогон: `make test-fixtures`. ## Организации и статус парсера (CLI `src.parser.cli`, 06.10.2026) | Каталог | Организация (по шапке) | Файлов | Формат | Парсер | |---|---|---|---|---| | `tsimlyansky/2025-Q3` | АО «Цимлянский» | 7 (58, 60, 62, 66, 67, 76, 91), xls | 1С, шапка варианта 1, outline, без валюты в шапке | `done`, кроме 91 — `needs_check` (см. ниже) | | `nkz/2025-Q3` | ООО «Новороссийский Кислородный завод» | 2 книги по 3 листа (58+66+67, 60+62+76), xls | листы названы кодом счёта; иерархия outline и по отступам | 60+62+76 `done`; 58+66+67 `needs_check` (лист 58: «сумма детей ≠ родитель», строки 12, 24) | | `nm/2025-Q3` | ООО «Новоросметалл» | 2 книги по 3 листа (58+66+67, 60+62+76) + ОСВ 63, xlsx | шапка варианта 2 («Период:», «Субконто»), «Выводимые данные: сумма»; на листах нет строки корневого счёта — верхний уровень сразу субсчета; «Итого» и «Итого развернутое» | `needs_check` на всех листах: «Итого ≠ корневому счёту» (несколько корней, OQ-106); 63 — шапка не разобрана (см. ниже) | | `npz/2025-Q3`, `npz/2024-10_2025-09` | ООО «Новороссийский прокатный завод» (с обособленными подразделениями) | 2 книги (58+63+66+67 за 9 мес.; 60+62+76 за окт. 2024 – сент. 2025), xlsx | 1С, «Валюта БУ, НУ: RUB», outline | `done`; период «Октябрь 2024 г. – Сентябрь 2025 г.» разобран как `2024 Q4`, нарастающий — **неверно** (см. ниже) | | `primanych/2025-Q3` | ООО «Приманыческий» | 7 (58, 60, 62, 66, 67, 76, 91), xls | как у Цимлянского | `done`, кроме 91 — `needs_check` | | `agrokompleks/2025-Q3`, `agrokompleks/2024-10_2025-09` | АО фирма «Агрокомплекс» им. Н.И. Ткачева | 4, xls (9–14 МБ, лист `TDSheet`, 50 тыс. строк: субсчета → контрагенты → договоры) | шапка варианта 2, «сумма», outline | `needs_check`: «Итого ≠ корню» (несколько корней 62.01/62.04 …), нарушения тождества сальдо в блоках магазинов (строки 48201+ в 62), разбор 3–4 с | ОСВ АО «Русский бисквит» за 3 кв. 2025 и ООО «Пекарня Счастливочная» 01/60 за 1 кв. 2025 из пакета совпали побайтно с `osv/rb/2025-Q3` и `osv/schastl/2025-Q1` и не копировались; шесть недостающих ОСВ Счастливочной за 1 кв. 2025 (02, 58, 62, 66, 67, 76) положены в `osv/schastl/2025-Q1/` с golden-снимками. ## Что показали файлы (кандидаты на правила и доработки парсера) 1. **Скользящий период** «Октябрь 2024 г. – Сентябрь 2025 г.» (НПЗ 60/62/76, Агрокомплекс 76): парсер берёт первый месяц и даёт `2024 Q4`, нарастающий. Нужен разбор диапазона и признак «не с начала года»; ядро должно такой документ не привязывать к версии как нарастающий. 2. **Счёт 91** (Цимлянский, Приманыческий): строки аналитики по статьям доходов/расходов показывают только обороты, сальдо нет (91 закрывается на 91.09) → тождество «начало + обороты = конец» нарушено на каждой строке → `needs_check`. Вопрос к правилам §1.4: исключать ли 90/91/99 из проверки тождества по строкам. 3. **Несколько корней без строки счёта** (Новоросметалл, Агрокомплекс, вариант 2): на листе нет строки «58», верхний уровень — 58.01, 58.03; «Итого» равно сумме корней, парсер сверяет «Итого» с первым корнем → `needs_check` (OQ-106). Встречается массово, стоит сверять «Итого» с суммой строк уровня 0. 4. **Шапка ОСВ 63 Новоросметалл**: «Оборотно-сальдовая ведомость» / «Бухгалтерский | 9 месяцев 2025 г.» / колонки «Счет (Код, Наименование)» двумя столбцами. Парсер не нашёл счёт, период и тип данных (`org = "Бухгалтерский"`), иерархия по шаблону кодов. Новый формат заголовка таблицы. 5. **«Итого развернутое»** (Новоросметалл) — вторая итоговая строка после «Итого»; сейчас, видимо, попадает в OTHER. 6. **Листы названы кодом счёта** (`58`, `60`, …) и несколько ОСВ в одной книге — работает (`locator = sheet:58`). 7. **Без «Валюта» в шапке** (Цимлянский, НКЗ, НМ, Приманыческий, Агрокомплекс) — предупреждение, не ошибка. 8. **Объём**: 50 тыс. строк разбираются за 3–4 с; снимки таких файлов в golden не кладём (десятки МБ JSON). Отчёты «Анализ счета» из того же пакета (`…ПоКомпаниямГруппы…`) — не ОСВ, лежат в `analysis-reports/`.