Andrey Epifancev 004c21041c synthgen: сборка набора, README, детерминированность (#38)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-13 00:37:42 +04:00
..

synthgen — настраиваемый генератор синтетической ГСК

Строит вымышленный набор для АРМ КА: состав группы (ЕЦП), ОСВ по счетам, ББ и ОФР по компаниям и периодам. Все числа выведены из одной двойной записи на компанию (книга проводок), поэтому ББ, ОФР и ОСВ согласованы между собой. Назначение — объём и демо (десятки компаний, до 150 внешних контрагентов в ОСВ); это не оракул: ожидаемых итогов консолидации генератор не даёт. Проект: docs/superpowers/specs/2026-11-12-synthgen-design.md.

Запуск

uv run --with openpyxl==3.1.5 --with pyyaml==6.0.2 python -m synthgen \
    --config synthgen/examples/default.yaml --set group_size=12 --set prefix=DEMO2 --out /tmp/demo2

Из корня репозитория fixtures. Без --out результат — ./out/<prefix>. Непустой каталог без --force — код 3; --force очищает его содержимое целиком. Код 2 — ошибка настроек. Тесты: python -m pytest synthgen/tests -q (-m parser — приёмка парсером, нужен TP_WT; -m slow — крупный прогон).

Настройки

Любой ключ переопределяется --set ключ=значение; неизвестный ключ или значение вне диапазона — ошибка.

Ключ Смысл По умолчанию Диапазон
group_size число компаний в ГК (все входят в ГСК) 5 2–40
prefix префикс ГК: в названиях и диапазон ИНН SYN 2–12 букв/цифр
periods число отчётных периодов 4 1–12
start первый период 2025-Q1 2020-Q1 … 2030-Q4
osv_counterparties_mean среднее число внешних контрагентов в одной ОСВ 60 0–150
no_inn_companies сколько компаний выгружают ОСВ без ИНН 1 0–group_size
vgo_mismatch_share доля пар ВГО с расхождением 0.1 0–1
seed зерно случайности 1 целое
out каталог результата ./out/<prefix> —

Одинаковые настройки и seed дают побайтно одинаковые файлы (путь результата в файлы не попадает).

Что получается

<out>/
  README.md                       журнал прогона: настройки, состав группы, пары ВГО с расхождениями, контрагенты
  config.yaml                     фактические настройки
  directories/ecp-<prefix>.xlsx   выгрузка ЕЦП: состав ГК
  osv/<КОД>/<период>/сч NN_….xlsx ОСВ по счетам 01, 58, 60, 62, 66, 67, 76, 80, 90
  statements/<КОД>/<период>/      ББ_….xlsx и ОФР_….xlsx (форма 66н, тыс. руб.)

<КОД> — C01…Cnn, головная — C01; периоды — нарастающим итогом с 1 января (2025-Q1, 2025-Q2, 2025-Q3, 2025-FY). Набор сам в git не коммитится (out/ в .gitignore).

Как загрузить на стенд

  1. Импорт ЕЦП: directories/ecp-<prefix>.xlsx (справочник групп и юрлиц).
  2. Документы по компаниям: ОСВ, затем ББ и ОФР из osv/<КОД>/… и statements/<КОД>/…. Компании без ИНН в ОСВ и пары ВГО с расхождениями перечислены в README набора.

Ограничения

  • Не оракул; только форма 66н (ФСБУ 4/2023 не покрыта).
  • Среднее число контрагентов ограничено словарём (≤ 150): при потолке README набора пишет «среднее ограничено словарём».
  • ИНН компаний группы берутся из диапазона по хешу префикса; два префикса могут столкнуться (малая вероятность).
  • ВГО по выручке 90.01 без аналитики; правило 6 ядра суммирует 62↔60 и 76↔76; счёт 80 головной без аналитики; парсером проверены ОСВ 60/62/76; подпись «За 3 месяца» ОФР не сверена с реальной выгрузкой — подробности в README каждого прогона.

Как пересобрать словарь и шаблоны

  • Словарь организаций: python -m synthgen.dictionary.build → synthgen/dictionary/companies.csv (коммитится).
  • Стиль ОСВ: python synthgen/templates/build_osv_style.py → osv_style.json; шаблоны ББ/ОФР: python synthgen/templates/build_forms_templates.py → bb_1c.xlsx, ofr_1c.xlsx. Образцы — из этого же репозитория (osv/rb/2024-Q1, statements-xlsx/mezheninovskaya/2025-Q3), путь можно передать аргументом; реквизитов образца в шаблонах нет.