_build_zoning при пустом nspd_zoning берёт легаси result["zoning"], проверяет, что
там есть zone_code, — и дальше читает поля из так и оставшегося ПУСТЫМ nspd_zoning.
Все пары выходят None, отбрасываются фильтром, и §1 печатает «нет данных» ПОВЕРХ
имеющихся данных. То есть это не пустая таблица, а ложное утверждение об отсутствии.
Соседний full_report_docx._build_zoning — та же структура слово в слово — закрывает
эту ветку одной строкой `nspd_zoning = zoning`. В HTML её не было.
Достижимость называю честно: сегодня ветка на проде не срабатывает. Легаси-зонирование
заполняется из pzz_zones_ekb, а она пуста намеренно — задача pzz-sync отключена в
beat-расписании, потому что Росреестр закрыл PKK6 (#233, #259). Дефект латентный.
Чиню всё равно по двум причинам. HTML-сборка — основа полного PDF-отчёта
(full_report_pdf импортирует build_full_report_html), так что в день, когда таблицу
наполнят, зонирование молча пропадёт из главного документа. И правка — ровно одна
строка, приводящая функцию к её же соседу.
Тест против origin/main:
код зоны Ж-4 не попал в таблицу — вывод '<div class="no-data">нет данных</div>'
заглушка «нет данных» рядом с данными — то же самое, отдельным утверждением
приоритет nspd_zoning сохранён — контроль, зелёный на обеих сторонах
отсутствие данных честно названо — контроль, зелёный на обеих сторонах
Контроль «приоритет nspd_zoning» стоит не для симметрии: он ловит «починку», которая
слила бы два источника вместо того, чтобы оставить НСПД главным.
Прогоны: tests/services/exporters 224 passed rc=0; tests/services rc=0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>