Дата: 12.08.2026. Все числа получены запуском, сырые протоколы — в evidence/.
| Что | Команда | Результат |
|---|---|---|
| Автотесты | python3 -m pytest -q | 41 passed (40 прежних + регресс «лист периода совпадает с эталоном») |
| Сплошная сверка расчётного ядра | python3 reconcile_punc.py | 156 показателей, СОШЛОСЬ ПОЛНОСТЬЮ (evidence/reconcile-punc-run.txt) |
| Построчная сверка выгрузки с эталоном | python3 verify_punc_etalon.py | лист «август 2024» — 0 расхождений на 468 ячейках; лист «Сравнение» — 20 расхождений, все объясняются отсутствием данных за сентябрь (см. §3). Протокол: evidence/verify-punc-etalon.txt |
| Сервис по HTTP | python3 app.py --port 8907, curl | /healthz → {"ok": true, "db": true}; GET /api/punc/export?contract_id=20&year=2024&month=8 → HTTP 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.
| Было | Стало | Основание |
|---|---|---|
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 не совпадает с эталоном.
Ничего сверх спецификации не добавлено: КАПП/КСЧФ не подмешиваются, округления нет, строк «Итого» на листе периода нет, единицы не пересчитываются, НДС не участвует.
468 ячеек (A1:R26) совпали побайтно по значениям, включая полную двоичную точность (59921.393000000004, 4.3172822696) и все прочерки.
| Ячейки | Конструктор | Эталон | Причина |
|---|---|---|---|
| B5/E5, C5/F5 | 4.605 / 3 965 543.75955 | 9.629 / 8 368 852.07187 | эталон агрегирует август и сентябрь |
| B6/E6, C6/F6 | 3 437 811 / 5 842 311.5903787 | 7 130 126 / 12 896 242.430418974 | то же |
| B7/E7, C7/F7 | 3 432 410 / 8 067 566.61238 | 7 118 689 / 16 872 905.76768 | то же |
| C8/F8 | 901 881.397263 | 1 905 244.7550360002 | то же |
| C9/F9 | 16 535.87091 | 34 295.90606 | то же |
| B10/E10, C10/F10 | 5 401 / 3.99674 | 11 437 / 6.65258 | то же |
Доказательство причины (в протоколе evidence/verify-punc-etalon.txt, блок «Диагностика»): если к посчитанному августу добавить строки сентября, **взятые из эталонной выгрузки** (не расчёт, а подстановка чисел заказчика), лист «Сравнение» совпадает с эталоном полностью — 0 расхождений на 143 ячейках. То есть агрегаты, единицы (объём мощности /1000) и формулы (H11=SUM(H5:H9) без строки УИРП) перенесены верно, не сходится только состав периодов.
accrual_00102 есть единственный период — D_Year=2024, D_Month=8 (проверено: SELECT D_Year, D_Month, D_Type, COUNT(*) … GROUP BY даёт только 2024-08 по всем типам документов). Строк за сентябрь нет ни по одному договору и ни по одному типу документа, поэтому отчёт за сентябрь не может быть сформирован — сервис на такой запрос отвечает 400 с текстом причины (evidence/live-punc-export-sep.json), а не отдаёт пустой бланк. Что нужно, чтобы закрыть: выгрузка наборов 00102/00101 за сентябрь 2024.август 2024_1, сентябрь 2024_1 в эталоне) не воспроизводится: чем он отличается от первого, из эталонов не определяется ([ВОПРОС 1]). Конструктор делает по одному листу на каждый запрошенный период.[ВОПРОС 7]).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?...).