Приёмка шага 4: расчёт ПУНЦ перенесён в конструктор и считает на реальных данных

Дата: 12.08.2026. Все числа получены запуском, сырые протоколы — в evidence/.

1. Что запускалось и на каких данных

ЧтоКомандаРезультат
Автотестыpython3 -m pytest -q41 passed (40 прежних + регресс «лист периода совпадает с эталоном»)
Сплошная сверка расчётного ядраpython3 reconcile_punc.py156 показателей, СОШЛОСЬ ПОЛНОСТЬЮ (evidence/reconcile-punc-run.txt)
Построчная сверка выгрузки с эталономpython3 verify_punc_etalon.pyлист «август 2024» — 0 расхождений на 468 ячейках; лист «Сравнение» — 20 расхождений, все объясняются отсутствием данных за сентябрь (см. §3). Протокол: evidence/verify-punc-etalon.txt
Сервис по HTTPpython3 app.py --port 8907, curl/healthz{"ok": true, "db": true}; GET /api/punc/export?contract_id=20&year=2024&month=8HTTP 200, 13 537 байт, файл открывается openpyxl, листы август 2024 + Сравнение

Данные: data.db — выгрузки заказчика, наборы 00102 (начисления), 00101 (детализация), 00211 (договоры), 01112–01115 (справочники). Договор эталона — C_Id=20 «РУСЭНЕРГОСБЫТ» (Смоленск) Import_test, № Import_test 170/011-P/138Д-05. Отбор строк — строго по SPEC-PUNC §1: D_Type='АПП', R_CalcName='Текущий расчет', исключение R_Nomenclature LIKE 'Средневзвешенный%', связь 00101 по RowId = R_Id. 12 строк отчёта за август 2024 (из 17 строк АПП, 5 «Средневзвешенный…» отброшены).

Файл, реально отданный по HTTP: evidence/live-punc-export-aug.xlsx, заголовки ответа — evidence/live-punc-export-aug.headers.

2. Что доделано на этом шаге (расхождения шага 3, §10 спецификации)

БылоСталоОснование
B4 = C_Name («РУСЭНЕРГОСБЫТ» (Смоленск) Import_test)B4 = № Import_test 170/011-P/138Д-05 от 01.01.2024 г. (из C_Number + C_BeginDt, с хвостовым пробелом)эталон, лист «август 2024»
A7: «…(мощности) {C_Name} в границах Смоленская область»A7: «…(мощности) от 01.01.2024 г. № Import_test 170/011-P/138Д-05 в границах Смоленской области»эталон; порядок «от … № …» в A7 против «№ … от …» в B4 перенесён как есть
B5 «Регион» заполнялсяB5 пустаяэталон ([ВОПРОС 8] спецификации остаётся открытым)
I15:I20 = - у электроэнергииI = 0 у раздела «Электрическая энергия», - у мощности, значение у потерьматрица прочерков SPEC-PUNC §4 ([ВОПРОС 2])
L заполнялась у любой строки со скидкойL (−J) только у раздела «Электрическая энергия»эталон
Период без данных выгружался пустым бланком (HTTP 200)HTTP 400 с причиной и списком периодов, где данные естьтребование «без заглушек, выдаваемых за расчёт»

Склонение региона (Смоленская областьСмоленской области) сделано по регулярным окончаниям (область/республика/край/округ/город + прилагательное); незнакомая форма остаётся в именительном падеже. Поля со склонением в наборе 01115 нет — это остаётся [ВОПРОС 9], но без преобразования заголовок A7 не совпадает с эталоном.

Ничего сверх спецификации не добавлено: КАПП/КСЧФ не подмешиваются, округления нет, строк «Итого» на листе периода нет, единицы не пересчитываются, НДС не участвует.

3. Расхождения с эталонной выгрузкой — список

3.1 Лист «август 2024» — расхождений нет

468 ячеек (A1:R26) совпали побайтно по значениям, включая полную двоичную точность (59921.393000000004, 4.3172822696) и все прочерки.

3.2 Лист «Сравнение» — 20 ячеек, причина одна

ЯчейкиКонструкторЭталонПричина
B5/E5, C5/F54.605 / 3 965 543.759559.629 / 8 368 852.07187эталон агрегирует август и сентябрь
B6/E6, C6/F63 437 811 / 5 842 311.59037877 130 126 / 12 896 242.430418974то же
B7/E7, C7/F73 432 410 / 8 067 566.612387 118 689 / 16 872 905.76768то же
C8/F8901 881.3972631 905 244.7550360002то же
C9/F916 535.8709134 295.90606то же
B10/E10, C10/F105 401 / 3.9967411 437 / 6.65258то же

Доказательство причины (в протоколе evidence/verify-punc-etalon.txt, блок «Диагностика»): если к посчитанному августу добавить строки сентября, **взятые из эталонной выгрузки** (не расчёт, а подстановка чисел заказчика), лист «Сравнение» совпадает с эталоном полностью — 0 расхождений на 143 ячейках. То есть агрегаты, единицы (объём мощности /1000) и формулы (H11=SUM(H5:H9) без строки УИРП) перенесены верно, не сходится только состав периодов.

3.3 Чего нет в результате

4. Как проверить руками

python3 -m pytest -q                 # 41 passed
python3 reconcile_punc.py            # СОШЛОСЬ ПОЛНОСТЬЮ
python3 verify_punc_etalon.py        # 0 расхождений по листу периода
python3 app.py --port 8907
curl -o punc.xlsx "http://127.0.0.1:8907/api/punc/export?contract_id=20&year=2024&month=8"

На платформе разворачивается тем же кодом: Dockerfile (kind python, порт 8080, без инструкции VOLUME) и .project-os/project/deploy.yaml лежат в корне репозитория; адрес приложения после прогона — sol-msqct09w-2ae.apps.sreda-ai.ru (эндпоинт проверки — /healthz, выгрузка — /api/punc/export?...).