Настраиваемый генератор синтетики ГСК: ОСВ, ББ, ОФР, состав ГК (#38) #39

Merged
aep merged 17 commits from feat/38-synthgen into main 2026-11-13 18:53:31 +03:00
Owner

Closes #38

Настраиваемый генератор синтетики ГСК — пакет synthgen/. По настройкам строит согласованный набор одной ГК в виде выгрузок 1С: ОСВ по 9 счетам, ББ и ОФР (форма 66н) по каждой компании и периоду, файл состава ГК для импорта ЕЦП, README прогона. Наборы в git не попадают, коммитятся код, словарь и шаблоны.

Спека: docs/superpowers/specs/2026-11-12-synthgen-design.md (решения 1–43). План: docs/superpowers/plans/2026-11-12-synthgen.md.

Настройки

Ключ Что По умолчанию
group_size компаний в ГК (все в ГСК) 5
prefix префикс ГК, уникальность имён и ИНН на стенде SYN
periods / start число кварталов и первый (нарастающим итогом, как 1С) 4 / 2025-Q1
osv_counterparties_mean среднее внешних контрагентов на ОСВ (≤ 150) 60
no_inn_companies компаний с ОСВ без ИНН контрагентов 1
vgo_mismatch_share доля пар ВГО с расхождением, вперемешку 1–4 % и 8–25 % 0.1
uv run --with openpyxl==3.1.5 --with pyyaml==6.0.2 python -m synthgen --set group_size=10 --set prefix=DEMO --out <папка>

Что внутри

  • Словарь из 400 вымышленных организаций (30 банков, около 40 ИП). ИНН с регионом 00, не пересекаются с #35. У компаний группы ИНН вычисляются из префикса.
  • Книга проводок у каждой компании. ОСВ, ББ и ОФР — свёртки этой книги, поэтому сходятся между собой. Внутри группы: торговля 62↔60, займы 58.03↔66/67 с процентами, дивиденды через 76.03, доли 58.01↔80.
  • ОСВ оформлены по образцу РБ (osv/rb/2024-Q1/сч 60_…): Arial, заливки, рамки, сетка объединений, группировки. Колонка ИНН стоит между наименованием и суммами. В ОСВ без ИНН одна компания группы записана другим написанием, её сопоставляют вручную.
  • ББ и ОФР собраны по шаблону выгрузки Межениновской. Шаблон очищен от реквизитов, формул и ФИО образца.

Проверка

  • pytest synthgen/tests: 134 passed, 8 skipped (skipped — приёмка парсером и slow без окружения).
  • -m parser (зеркало tabular-parser): 7 passed. Через парсер прошли все 9 счетов ОСВ и ББ/ОФР. На финальном ревью отдельно: набор по умолчанию — ОСВ 180/180, ББ/ОФР 40/40; крупный — ОСВ 810/810, ББ/ОФР 180/180.
  • -m slow: крупный прогон (15 компаний, 6 периодов, mean 150) — 198 с при лимите 300.
  • Детерминированность: два прогона в разных процессах с разным PYTHONHASHSEED дают побайтно одинаковые файлы.
  • Ревью: каждая задача и вся ветка (opus). Critical — 0, important I-1…I-4 исправлены в 0abe99b. После ревью исправлен формат сумм ОСВ (#,##0.00 у сальдо) и оформление шапки ИНН — 25b1e9f.

Rulings I made

  • R-1 (решение 13). Снятие расхождения 31 января проверяется, только если январь следующего года входит в книгу.
  • R-2 (решение 14). Скрипт шаблонов называется build_forms_templates.py, как в плане.
  • R-3 (решение 32). Расхождение по займу ставится на основном долге, проценты симметричны.
  • R-4. Task 5 после обрыва контроллера (ECONNRESET) доделан новым исполнителем поверх черновика, начиная с тестов (O-4).
  • R-5. Фикс-раунд Task 5 принят по scoped re-review.
  • R-6. Тексты README про поведение ядра (M-4/M-5) проверены финальным ревью и исправлены в 0abe99b.
  • R-7. Минорные находки Tasks 1–6 разобраны на финальном ревью: исправлены I-1…I-4, M-1, T6.1, T6.4, остальное отложено.

Deferred

  • Наблюдения:
    • O-3 — в 58 есть внешние контрагенты; 76.05 только Кт.
    • O-6 — подпись колонки «За 3 месяца» в ББ/ОФР не сверена с реальной 1С; 2340/2350 всегда нулевые.
  • Тесты задач:
    • T1.1 — dump_config переводит Decimal во float.
    • T1.2 — абсолютный путь к seed в test_ledger.
    • T1.3 — мало негативных тестов конфигурации.
    • T2.7 — test_variant_name проверяет тривиальное условие.
    • T2.8 — у ~15 ИП фамилии совпадают с реальными, инициалы другие.
    • T3.3–T3.6 — слабые тесты, доли 3/20/5 % без тестов, float до Decimal.
    • T4.5 — test_dividends жёстко привязан к 2025 Q2.
    • T4.8, T4.9 — слабый тест займа; условие проверяется по моменту проводки.
    • T4.10 — 80 у головной без аналитики (описано в README).
    • T5.4 — TP_WT по умолчанию недостижим.
    • T5.5 — ИНН внешних контрагентов не сверяются с парсером.
    • T5.6–T5.8 — проверка 10-значных чисел, _DIRECTORY, _natural_key.
    • T6.2 — слабый допуск в test_net_profit.
    • T6.3 — налог 2410 масштабируется независимо от прибыли.
    • T6.5 — Ledger.post не проверяет kind; ruff не прогонялся.
    • T7.2 — поиск расхождений в README по подстроке.
    • T7.3 — граничные конфиги проверяются только на отсутствие ошибок.
    • T7.4 — крупный прогон 198 с близок к лимиту 300.
    • T7.5 — README добавляется в manifest.files вручную.
  • Финальное ревью:
    • M-2 — 90.01–90.08 закрываются ежемесячно, это влияет на вид ОСВ 90.
    • M-3 — префиксы, различающиеся только регистром.
    • M-4 — абсолютные пути автора в скриптах и тестах.

Полная таблица находок со статусами — в ledger SDD, при закрытии всё отложенное уйдёт в follow-up.

🤖 Generated with Claude Code

Closes #38 Настраиваемый генератор синтетики ГСК — пакет `synthgen/`. По настройкам строит согласованный набор одной ГК в виде выгрузок 1С: ОСВ по 9 счетам, ББ и ОФР (форма 66н) по каждой компании и периоду, файл состава ГК для импорта ЕЦП, README прогона. Наборы в git не попадают, коммитятся код, словарь и шаблоны. Спека: `docs/superpowers/specs/2026-11-12-synthgen-design.md` (решения 1–43). План: `docs/superpowers/plans/2026-11-12-synthgen.md`. ## Настройки | Ключ | Что | По умолчанию | |---|---|---| | `group_size` | компаний в ГК (все в ГСК) | 5 | | `prefix` | префикс ГК, уникальность имён и ИНН на стенде | `SYN` | | `periods` / `start` | число кварталов и первый (нарастающим итогом, как 1С) | 4 / `2025-Q1` | | `osv_counterparties_mean` | среднее внешних контрагентов на ОСВ (≤ 150) | 60 | | `no_inn_companies` | компаний с ОСВ без ИНН контрагентов | 1 | | `vgo_mismatch_share` | доля пар ВГО с расхождением, вперемешку 1–4 % и 8–25 % | 0.1 | ``` uv run --with openpyxl==3.1.5 --with pyyaml==6.0.2 python -m synthgen --set group_size=10 --set prefix=DEMO --out <папка> ``` ## Что внутри - Словарь из 400 вымышленных организаций (30 банков, около 40 ИП). ИНН с регионом `00`, не пересекаются с #35. У компаний группы ИНН вычисляются из префикса. - Книга проводок у каждой компании. ОСВ, ББ и ОФР — свёртки этой книги, поэтому сходятся между собой. Внутри группы: торговля 62↔60, займы 58.03↔66/67 с процентами, дивиденды через 76.03, доли 58.01↔80. - ОСВ оформлены по образцу РБ (`osv/rb/2024-Q1/сч 60_…`): Arial, заливки, рамки, сетка объединений, группировки. Колонка ИНН стоит между наименованием и суммами. В ОСВ без ИНН одна компания группы записана другим написанием, её сопоставляют вручную. - ББ и ОФР собраны по шаблону выгрузки Межениновской. Шаблон очищен от реквизитов, формул и ФИО образца. ## Проверка - `pytest synthgen/tests`: 134 passed, 8 skipped (skipped — приёмка парсером и slow без окружения). - `-m parser` (зеркало tabular-parser): 7 passed. Через парсер прошли все 9 счетов ОСВ и ББ/ОФР. На финальном ревью отдельно: набор по умолчанию — ОСВ 180/180, ББ/ОФР 40/40; крупный — ОСВ 810/810, ББ/ОФР 180/180. - `-m slow`: крупный прогон (15 компаний, 6 периодов, mean 150) — 198 с при лимите 300. - Детерминированность: два прогона в разных процессах с разным PYTHONHASHSEED дают побайтно одинаковые файлы. - Ревью: каждая задача и вся ветка (opus). Critical — 0, important I-1…I-4 исправлены в 0abe99b. После ревью исправлен формат сумм ОСВ (`#,##0.00` у сальдо) и оформление шапки ИНН — 25b1e9f. ## Rulings I made - **R-1 (решение 13).** Снятие расхождения 31 января проверяется, только если январь следующего года входит в книгу. - **R-2 (решение 14).** Скрипт шаблонов называется `build_forms_templates.py`, как в плане. - **R-3 (решение 32).** Расхождение по займу ставится на основном долге, проценты симметричны. - **R-4.** Task 5 после обрыва контроллера (ECONNRESET) доделан новым исполнителем поверх черновика, начиная с тестов (O-4). - **R-5.** Фикс-раунд Task 5 принят по scoped re-review. - **R-6.** Тексты README про поведение ядра (M-4/M-5) проверены финальным ревью и исправлены в 0abe99b. - **R-7.** Минорные находки Tasks 1–6 разобраны на финальном ревью: исправлены I-1…I-4, M-1, T6.1, T6.4, остальное отложено. ## Deferred - **Наблюдения:** - O-3 — в 58 есть внешние контрагенты; 76.05 только Кт. - O-6 — подпись колонки «За 3 месяца» в ББ/ОФР не сверена с реальной 1С; 2340/2350 всегда нулевые. - **Тесты задач:** - T1.1 — dump_config переводит Decimal во float. - T1.2 — абсолютный путь к seed в test_ledger. - T1.3 — мало негативных тестов конфигурации. - T2.7 — test_variant_name проверяет тривиальное условие. - T2.8 — у ~15 ИП фамилии совпадают с реальными, инициалы другие. - T3.3–T3.6 — слабые тесты, доли 3/20/5 % без тестов, float до Decimal. - T4.5 — test_dividends жёстко привязан к 2025 Q2. - T4.8, T4.9 — слабый тест займа; условие проверяется по моменту проводки. - T4.10 — 80 у головной без аналитики (описано в README). - T5.4 — TP_WT по умолчанию недостижим. - T5.5 — ИНН внешних контрагентов не сверяются с парсером. - T5.6–T5.8 — проверка 10-значных чисел, `_DIRECTORY`, `_natural_key`. - T6.2 — слабый допуск в test_net_profit. - T6.3 — налог 2410 масштабируется независимо от прибыли. - T6.5 — Ledger.post не проверяет kind; ruff не прогонялся. - T7.2 — поиск расхождений в README по подстроке. - T7.3 — граничные конфиги проверяются только на отсутствие ошибок. - T7.4 — крупный прогон 198 с близок к лимиту 300. - T7.5 — README добавляется в manifest.files вручную. - **Финальное ревью:** - M-2 — 90.01–90.08 закрываются ежемесячно, это влияет на вид ОСВ 90. - M-3 — префиксы, различающиеся только регистром. - M-4 — абсолютные пути автора в скриптах и тестах. Полная таблица находок со статусами — в ledger SDD, при закрытии всё отложенное уйдёт в follow-up. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 17 commits 2026-11-13 11:09:34 +03:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- synthgen/config.py: Config, load_config (YAML + --set), dump_config, проверки диапазонов §3
- synthgen/rng.py: rng_for (SHA-256 → Random), stable_hash
- synthgen/__main__.py: разбор --config/--set/--out/--force, ошибка конфигурации → код 2
- synthgen/examples/default.yaml: все ключи §3 со значениями по умолчанию
- копии из synthetic-group/gen (#35): inn, xlsx, ledger, chart (+80.09, 91.09 из seed arm-core)
- тесты: config, inn, ledger; conftest с маркерами parser/slow
- .gitignore: out/
- спека: решения 15–16

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Сальдо брало формат ячейки строки-образца, где сумма пустая, — «Общий»; шапка ИНН была без заливки и рамок.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep merged commit cc1bc59dd5 into main 2026-11-13 18:53:31 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/arm-ka-fixtures#39
No description provided.