feat(seed): полный план счетов 1С (488 строк) #25

Merged
aep merged 2 commits from feat/23-chart-seed-1c into main 2026-10-06 14:01:11 +03:00
Owner

Closes #23. ASSUMPTION(OQ-113): выгрузка 1С fixtures/directories/chart-of-accounts-1c.xlsx считается полным планом счетов (подтверждения владельца ещё нет).

Что сделано

  1. api/scripts/convert_chart_1c.py — одноразовый конвертер xlsx -> csv (колонки по заголовкам «Код счета», «Наименование счета», «Вид», «Заб.»; порядок строк как в выгрузке; parent_code по структуре кода; row_type по глубине; kind А/П/АП -> A/P/AP; is_off_balance = «Заб.»=Да).
  2. api/seed/core/chart_of_accounts.csv: 122 -> 488 строк (буквенные 01.К, 62.ОТ, 76.АВ, забалансовые 001–012, МЦ, ГТД, НЕ…, Я68…).
  3. Валидатор seed (scripts/seed_lib/loaders.py): принимает буквенные коды (кириллица), 000 и 012; забалансовые = 001–012 и буквенные корни; «сироты» выгрузки без родителя (Я68.01, Я68.21, Я68.32, Я68.42, Я01.К, Я69.06.5) загружаются с пустым parent_code (родителей не выдумываем); пустой parent при наличии предка по-прежнему ошибка.
  4. Тесты: test_seed_chart.py (488 строк, иерархия без циклов, сироты, буквенные/забалансовые, kind по 1С, субсчета ОСВ), test_convert_chart_1c.py (конвертер + дрейф «csv == конвертер(xlsx)», skip без fixtures), test_mapping_golden.py (вне плана остаётся только 60.АВ), test_domain_osv_mapping.py (66.01 теперь резолвится).
  5. Спека reference-data-seed: требование о плане счетов обновлено (1С-план, 001–012, сироты), сценарий «Субсчета реальных ОСВ».
    Миграции не нужны; run_seed — upsert по code (уже существующие строки не дублируются), идемпотентность проверена test_second_run_keeps_chart_row_count.

Как проверить

make -C arm-core check
cd arm-core/api && .venv/bin/pytest -m integration tests/test_seed_chart.py tests/test_mapping_golden.py
.venv/bin/python -I -c "from scripts.convert_chart_1c import main; main(['x','<abs>/fixtures/directories/chart-of-accounts-1c.xlsx','/tmp/c.csv'])"   # воспроизведение csv

Результаты: make check — 1122 passed (678 deselected); pytest -m "integration and not e2e" — 677 passed, 1123 deselected (4:22); golden: снимков 88, вне плана 1 (60.АВ).

Расхождения с прежним seed (брали 1С)

Коды/иерархия/row_type/is_off_balance всех 122 прежних строк не изменились. Изменились имена 24 строк:
19, 60.03, 60.31, 60.32, 62.03, 62.31, 62.32 (в у.е. / «Векселя …»), 66.06/66.22/66.24/66.26, 67.06/67.22/67.24/67.26 (в seed были «(субсчет NN)», в 1С — настоящие названия), 76.07, 76.07.1, 76.07.2, 76.07.5, 76.07.9 (в seed «лизинг», в 1С — «аренда»), 76.08, 76.28, 76.38 («по рассрочке»), 90.09. И kind у 28 строк: субсчета 60.0x/62.0x/76.07.x/76.08/76.28/76.38/90.0x/91.0x были AP (наследие родителя), в 1С — А или П; 70 и 96 были P, в 1С — АП. kind в коде нигде не читается (только в модели), поведение не меняется.

Находки

Маркер Суть Статус
C23-1 60.АВ есть только в синтетическом снимке s09, в плане 1С его нет: account_id = NULL (из 19 кодов OQ-113 резолвятся 18) deferred (решает владелец: заводить ли в seed или считать синтетику нестандартной)
C23-2 normalize_account_code дополняет РВ.1 до РВ.01, а в плане 1С код РВ.1 (одна цифра у буквенного корня): ОСВ с РВ.1 не сопоставится со строкой плана deferred (редкий забалансовый счёт розницы; правка нормализации — отдельная задача)
C23-3 Имена 24 и kind 28 прежних строк заменены данными 1С (список выше) fixed 096d53b
C23-4 test_build_entries_on_golden_osv_66 ожидал account_id is None для 66.01 fixed 096d53b
C23-5 Спека reference-data-seed говорила «is_off_balance для 001–011» fixed 096d53b

Decisions made without discussion

  • 06.10.2026: kind берётся из «Вид» 1С для всех строк, включая прежние (обоснование: источник — 1С; ошибка стоит неверный kind в справочнике, нигде пока не читаемый).
  • 06.10.2026: is_off_balance = «Заб.» 1С: 012 и буквенные корни (МЦ, НЕ, ГТД, ИНВ, КВ, ОТ, РВ, УСН) забалансовые, 000 и Я… нет (ошибка: неверный флаг забалансовости у редких счетов).
  • 06.10.2026: сироты выгрузки (Я68.01…) — пустой parent_code, а не выдуманные родители.
  • 06.10.2026: прежнее требование «субсчёт наследует kind родителя» снято (в 1С kind субсчёта своё).

Что проверить человеку

Подтвердить полноту плана (OQ-113); решить судьбу 60.АВ (C23-1) и РВ.1 (C23-2); просмотреть список изменённых имён.

🤖 Generated with Claude Code

Closes #23. ASSUMPTION(OQ-113): выгрузка 1С `fixtures/directories/chart-of-accounts-1c.xlsx` считается полным планом счетов (подтверждения владельца ещё нет). ## Что сделано 1. `api/scripts/convert_chart_1c.py` — одноразовый конвертер xlsx -> csv (колонки по заголовкам «Код счета», «Наименование счета», «Вид», «Заб.»; порядок строк как в выгрузке; `parent_code` по структуре кода; `row_type` по глубине; `kind` А/П/АП -> A/P/AP; `is_off_balance` = «Заб.»=Да). 2. `api/seed/core/chart_of_accounts.csv`: 122 -> 488 строк (буквенные `01.К`, `62.ОТ`, `76.АВ`, забалансовые `001–012`, `МЦ`, `ГТД`, `НЕ`…, `Я68…`). 3. Валидатор seed (`scripts/seed_lib/loaders.py`): принимает буквенные коды (кириллица), `000` и `012`; забалансовые = 001–012 и буквенные корни; «сироты» выгрузки без родителя (`Я68.01`, `Я68.21`, `Я68.32`, `Я68.42`, `Я01.К`, `Я69.06.5`) загружаются с пустым `parent_code` (родителей не выдумываем); пустой parent при наличии предка по-прежнему ошибка. 4. Тесты: `test_seed_chart.py` (488 строк, иерархия без циклов, сироты, буквенные/забалансовые, kind по 1С, субсчета ОСВ), `test_convert_chart_1c.py` (конвертер + дрейф «csv == конвертер(xlsx)», skip без fixtures), `test_mapping_golden.py` (вне плана остаётся только `60.АВ`), `test_domain_osv_mapping.py` (66.01 теперь резолвится). 5. Спека `reference-data-seed`: требование о плане счетов обновлено (1С-план, 001–012, сироты), сценарий «Субсчета реальных ОСВ». Миграции не нужны; `run_seed` — upsert по `code` (уже существующие строки не дублируются), идемпотентность проверена `test_second_run_keeps_chart_row_count`. ## Как проверить ``` make -C arm-core check cd arm-core/api && .venv/bin/pytest -m integration tests/test_seed_chart.py tests/test_mapping_golden.py .venv/bin/python -I -c "from scripts.convert_chart_1c import main; main(['x','<abs>/fixtures/directories/chart-of-accounts-1c.xlsx','/tmp/c.csv'])" # воспроизведение csv ``` Результаты: `make check` — 1122 passed (678 deselected); `pytest -m "integration and not e2e"` — 677 passed, 1123 deselected (4:22); golden: снимков 88, вне плана 1 (`60.АВ`). ## Расхождения с прежним seed (брали 1С) Коды/иерархия/row_type/is_off_balance всех 122 прежних строк не изменились. Изменились **имена 24 строк**: 19, 60.03, 60.31, 60.32, 62.03, 62.31, 62.32 (в у.е. / «Векселя …»), 66.06/66.22/66.24/66.26, 67.06/67.22/67.24/67.26 (в seed были «(субсчет NN)», в 1С — настоящие названия), 76.07, 76.07.1, 76.07.2, 76.07.5, 76.07.9 (в seed «лизинг», в 1С — «аренда»), 76.08, 76.28, 76.38 («по рассрочке»), 90.09. И **kind у 28 строк**: субсчета 60.0x/62.0x/76.07.x/76.08/76.28/76.38/90.0x/91.0x были AP (наследие родителя), в 1С — А или П; 70 и 96 были P, в 1С — АП. `kind` в коде нигде не читается (только в модели), поведение не меняется. ## Находки | Маркер | Суть | Статус | |---|---|---| | C23-1 | `60.АВ` есть только в синтетическом снимке s09, в плане 1С его нет: `account_id = NULL` (из 19 кодов OQ-113 резолвятся 18) | deferred (решает владелец: заводить ли в seed или считать синтетику нестандартной) | | C23-2 | `normalize_account_code` дополняет `РВ.1` до `РВ.01`, а в плане 1С код `РВ.1` (одна цифра у буквенного корня): ОСВ с `РВ.1` не сопоставится со строкой плана | deferred (редкий забалансовый счёт розницы; правка нормализации — отдельная задача) | | C23-3 | Имена 24 и kind 28 прежних строк заменены данными 1С (список выше) | fixed 096d53b | | C23-4 | `test_build_entries_on_golden_osv_66` ожидал `account_id is None` для 66.01 | fixed 096d53b | | C23-5 | Спека `reference-data-seed` говорила «is_off_balance для 001–011» | fixed 096d53b | ## Decisions made without discussion - 06.10.2026: `kind` берётся из «Вид» 1С для всех строк, включая прежние (обоснование: источник — 1С; ошибка стоит неверный kind в справочнике, нигде пока не читаемый). - 06.10.2026: `is_off_balance` = «Заб.» 1С: 012 и буквенные корни (МЦ, НЕ, ГТД, ИНВ, КВ, ОТ, РВ, УСН) забалансовые, `000` и `Я…` нет (ошибка: неверный флаг забалансовости у редких счетов). - 06.10.2026: сироты выгрузки (`Я68.01`…) — пустой `parent_code`, а не выдуманные родители. - 06.10.2026: прежнее требование «субсчёт наследует kind родителя» снято (в 1С kind субсчёта своё). ## Что проверить человеку Подтвердить полноту плана (OQ-113); решить судьбу `60.АВ` (C23-1) и `РВ.1` (C23-2); просмотреть список изменённых имён. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 2 commits 2026-10-06 11:57:43 +03:00
Одноразовый скрипт api/scripts/convert_chart_1c.py: xlsx выгрузки 1С -> chart_of_accounts.csv
(иерархия по структуре кода, kind из «Вид», is_off_balance из «Заб.»).
ASSUMPTION(OQ-113): выгрузка считается полным планом счетов.

Refs #23

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
Seed chart_of_accounts.csv заменён выгрузкой 1С: буквенные субсчета (01.К, 62.ОТ, 76.АВ),
забалансовые 001–012 и буквенные корни (МЦ, ГТД…), «Я…». Валидатор seed принимает буквенные
коды, 000 и 012, сирот выгрузки («Я68.01» без «Я68») с пустым parent_code; kind — из «Вида» 1С.
18 из 19 кодов реальных ОСВ теперь получают account_id (60.АВ — только в синтетике, в 1С нет).
ASSUMPTION(OQ-113): выгрузка считается полной.

Closes #23

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
aep merged commit dd8bae9952 into main 2026-10-06 14:01:11 +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-core#25
No description provided.