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