Andrey Epifancev 5bbbe1c7b3 test(osv-dkb): golden-снимки пакета ДКБ (22 файла до 1 МиБ), README
golden/expected_osv_parse/osv-dkb/** — 22 новых снимка (7,8 МБ); три файла Агрокомплекса (9–14 МБ) без снимков.
Существующие снимки не менялись. Парный PR: RSHB/arm-tabular-parser feat/10-osv-dkb-tests (issue #10), stacked on fixtures#8.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 13:23:30 +04:00
..

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/.