---
name: zemlya-settlement-resolution-chain
description: "ЗБР: опознание посёлка. connectgas покупает поиск у DaData; цепочка индекс→обученное→DaData (D-70); район в индексе ГАР + регулярка под «м.о. Имя» — 53%→66% своими данными (D-71)"
metadata: 
  node_type: memory
  type: project
  originSessionId: d0c6c5aa-4d05-42e2-a1f9-034482b88603
  modified: 2026-08-02T13:58:48.586Z
---

**2026-08-02, «Земля без риска».** Владелец возразил на вывод D-54: «на сайте вижу, что авторизация не нужна». Прогнал их форму в браузере с перехватом `fetch`/`XHR` — возражение справедливо, объяснение в D-54 было неполным.

**На странице `connectgas.ru/gasification_program` два разных запроса:**
1. Ввод названия → `POST https://dadata.connectgas.ru/suggestions/api/4_1/rs/suggest/address` — это **DaData**, проксированная через их поддомен, ключ на их стороне. Отсюда «вход не нужен».
2. Выбор подсказки → `POST /v1/settlements/find?included[]=…` с телом `{"data": {"fias_id": "<GUID>"}}` — эту ручку мы и так зовём.

**Своего поиска по названию у connectgas нет вообще** — они покупают его у DaData. Их прокси не используем: чужая платная квота, как и ключ DaData из их публичного JS.

**Замер на 118 реальных адресах:** опознан 53%, одноимённые 19%, не найден 28%.

**Главное в замере — не про connectgas.** `fias_settlements.db` содержит только `region, name, name_norm, typename, level` — **района нет**, а матчер ищет по паре «регион + имя». «поселок Апраксин» в Кировском районе Ленобласти однозначен, а мы отвечали «одноимённых 2». Все 19% — наш дефект, не свойство мира.

**Сделано (D-70):** цепочка `основной индекс → обученный индекс → DaData на НАШЕМ ключе`; найденное сразу пишется в обученный индекс (`data/geo_local/fias_learned.db`, внутри бота — основной пересобирается и лежит на Ext). Потолок 5000/сутки, регион ответа сверяется с первым сегментом КН — иначе на адресе «Республика Карелия» DaData уводит в другой субъект.

**Гоча теста:** `candidates_from_address` требует явного типа НП. «Апраксин» и «гп Токсово» дают `[]`, а «поселок Апраксин» и «городской поселок Токсово» — работают. Тестовые адреса брать ИЗ БАЗЫ, а не сочинять.

**Ключ не понадобился.** Владелец указал, что ручка открытая — проверил: `POST` отвечает 200 **без ключа, без Referer и без Origin**, притворяться их сайтом не требуется. Пользуемся честно: свой `User-Agent`, спрашиваем только при промахе индекса, всё найденное — в обученный индекс (один посёлок = один запрос за всю историю), потолок 300/сутки, пауза 0.4 с. Свой `DADATA_API_KEY` при появлении имеет приоритет.

**Две вещи, без которых не работает:**
1. Подсказка — **typeahead**. Полная строка ЕГРН даёт НОЛЬ подсказок. Нужен короткий собранный запрос «регион район тип-и-имя».
2. **Тип НП обязателен:** «Кировский район Апраксин» → массив Апраксин, «…поселок Апраксин» → посёлок. Разные объекты, разные газовые сети.

**Результат на тех же 118 адресах:** опознан 53% → **79%**, одноимённые 19% → **0%**, не нашли 28% → 21%. Тридцать один запрос наружу на 118 участков.

**Догадка помечается:** для СНТ/тер/внутригородских округов берётся имя товарищества или округа, источник получает суффикс `-nearby` и поднимает `matched_by_map` — отчёт не выдаёт её за точное совпадение.

**Сделано в тот же вечер (D-71): индекс пересобран с районом.** `AS_ADM_HIERARCHY` даёт `PATH` — цепочку `OBJECTID` от корня; поднимаемся до ближайшего предка уровня 2 или 3. 172 855 НП, район у 152 866 (**88%**), 43 МБ, 244 с. Старый код с четырьмя именованными колонками работает с новой схемой без правок.

**Но пересборка дала всего +4 — прирост оказался не в данных, а в извлечении.** Район в ГАР был у ВСЕХ кандидатов; из адреса он не извлекался в 16 случаях из 24. Регулярка ждала «Имя + район», а в ЕГРН пишут наоборот и через округа: «муниципальный округ Гатчинский», «м.о. Шаховская», «р-н Кунгурский», «г.о. Находкинский», «Талицкий муниципальный округ». **Районы массово становятся округами — это растущий случай, не редкий.** Голое «округ X» районом считать нельзя: так пишут автономные округа, то есть регионы.

**После починки, только свой индекс, ноль внешних запросов:** опознан 53% → **66%**, одноимённые 19% → **6%**. Цепочка целиком держит те же 79%, но внешних ответов **15 вместо 27**.

**Урок метода:** прежде чем строить дорогое решение (57 ГБ, 244 с), продиагностируй КАЖДЫЙ провальный случай — узкое место было в трёх строках регулярки, а не в схеме базы.

См. [[zemlya_fias_gar_index]], [[zemlya_utilities_sources_recon]], [[harvested_free_key_repos_refuse]], [[env_source_defeats_test_setdefault]].
