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

73 lines
5.6 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.

# 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`), путь можно передать аргументом;
реквизитов образца в шаблонах нет.