Легальный обход блокера ЕГРН: сведений о правообладателях-физлицах в открытом
доступе не существует (218-ФЗ ст. 62), а по ЮЛ данные открыты и типовые условия
ФНС разрешают переработку и перераспространение со ссылкой на источник.
Наборы 7707329152-{revexp,sshr2019,debtam,snr}. URL дампа НЕ хардкодится —
дата в имени файла меняется при каждой публикации, ссылка резолвится со
страницы каталога; загруженная версия трекается в fns_dataset_versions, чтобы
не перекачивать одно и то же. Обход XML внутри ZIP потоковый (lxml iterparse
с очисткой), архив не распаковывается ни в память, ни на диск.
ДВА ДЕФЕКТА, найденные прогоном на реальном дампе (revexp, data-20260825,
104 МБ, 2118 XML) — до этого парсер извлекал НОЛЬ записей при 17 зелёных
тестах, потому что фикстуры были написаны по выдуманной форме:
1. ИНН и показатели лежат на РАЗНЫХ соседних элементах внутри <Документ>:
ИНН на <СведНП ИННЮЛ="...">, суммы на <СведДохРасх СумДоход="...">.
Харвестер требовал их на одном элементе — совпадений не было ни одного.
Теперь носители ИНН ищутся по поддереву, а значения без собственного ИНН
привязываются к организации только когда носитель в документе один.
2. Безусловный elem.clear() на каждом элементе вычищал детей ДО закрытия
<Документ> (end-события детей приходят раньше родительского). Чистка
теперь только на границе записи.
Отчётный период берётся из ДатаСост документа, а не из подставленного
значения. Служебные атрибуты (ИдДок, ДатаДок, ВерсФорм, КолДок) фактами
не считаются.
Проверено: 40 002 факта на первых 20 001 организаций, серии СумДоход/СумРасход,
период 31.12.2025, нечисловых ИНН — ноль.
СКОУП: только загрузка и lookup по ИНН. Потребителя нет и он не изобретается —
estimator.py не тронут, ручек API не добавлено. Подключение к скорингу
застройщика/УК — отдельная задача.
Миграции 296 (таблицы) и 297 (сид расписания, enabled=false, interval_days 30).