С 1 января ФНС перестанет обновлять адресный справочник КЛАДР. Он официально устареет, останется один ФИАС. Но многие промышленные системы до сих пор работают с КЛАДР. Поставщики не собираются их обновлять, а переделывать своими руками бизнесу выходит долго и дорого.

Мы послушали клиентов и придумали решение: взять ФИАС, который живее всех живых, и написать перекодировщик в КЛАДР.

Со стороны задача кажется легкой. Нам так и говорили: «То есть вы просто берете ФИАС и переделываете в КЛАДР?». На деле никакого «просто» нет. У справочников совсем разные структуры и непонятно, как из подкачанного ФИАС раскидать данные в неказистый КЛАДР. При этом общей документации для справочников нет.

Это было веселье, которым мы сейчас щедро поделимся.

Сопоставили структуры справочников


ФИАС весит порядка 28 Гб, в нем около 450 таблиц. КЛАДР — это примерно 500 Мб и 6 табличек. Данные для КЛАДР лежат всего в трех таблицах ФИАС. Остальные для перекодирования не нужны, их КЛАДР не предусматривает.



Если на схеме в скобках стоит «<i>», значит, для каждого региона есть своя табличка с подобным названием

Переносить запись за записью не получится: сломаются или связи между таблицами, или логика внутри таблиц, или еще что-нибудь.

Например, в ФИАС один дом — это одна запись в таблице. Мы на радостях перекидали дома один за другим в КЛАДР, и справочник фатально разбух: 3,5 Гб против нормальных 500 Мб.

КЛАДР — скромняга, он не может себе позволить отдельную запись под каждый дом. Поэтому похожие дома в справочнике сгруппированы в одну строку. При этом их номера на голубом глазу хранят в поле NAME через запятую.



Когда дома находятся на одной улице и различаются только номером, их записывают в одну строку

Тогда мы принялись загружать из ФИАС улицу за улицей и группировать дома по записям. Отсчитываешь, столько номеров влезет через запятую в NAME, и создаешь в КЛАДР общую запись для этих домов. (В NAME, к слову, 40 символов.) Дело пошло?.



Для тех, кто решится повторить наш путь: так выглядит диаграмма зависимостей ФИАС и КЛАДР

Обычная проблема перекодировки: неясно, как переносить поля между похожими таблицами, а документация не выручает. Удивляться нечему, потому что документацию писали явно не для перепиливания одного справочника в другой.

Например, в ФИАС есть поля:

  • «Код ИФНС ФЛ»;
  • «Код ИФНС ЮЛ»;
  • «Код территориального участка ИФНС ФЛ»;
  • «Код территориального участка ИФНС ЮЛ».

В КЛАДР для этих же целей только два поля:

  • «Код ИФНС»;
  • «Код территориального участка ИФНС».

Какой код куда переносить — непонятно.

Еще пример. Это описание полей в ФИАС:

  • «Официальное наименование адресного объекта» содержит наименование и тип адресного объекта, введенное соответствующим нормативным документом органом исполнительной власти, решением, постановлением муниципального образования. Используется при формировании документов и почтовых отправлений;
  • «Наименование адресного объекта» содержит формализованное наименование адресного объекта.

Такое даже прочитать сложно, но, положим, у нас не было выбора. Провал в том, что описание ничего не проясняет. Что такое «формализованное наименование»? На что влияет формализация? Главное, какое поле переносить в КЛАДР?

В итоге мы брали КЛАДР и ФИАС от ФНС и смотрели, как значения полей перетекают из одного справочника в другой. Универсального рецепта нет, поэтому получилась тьма разнородных правил переноса.

Нашли, где брать КЛАДР-коды


КЛАДР-код — главный идентификатор справочника КЛАДР. Только по нему можно однозначно определить адресный объект.

ФИАС тоже хранит КЛАДР-коды. Причем с оптимизацией в справочнике так себе, поэтому из одной только таблицы ADDROB можно получить коды тремя способами:

  • взять из поля PLAINCODE. Здесь хранится собственно КЛАДР-код объекта;
  • взять из CODE. Здесь лежит тот же КЛАДР-код плюс две цифры признака актуальности;
  • сделать подарок своими руками. КЛАДР-код объекта можно собрать из гранулярных кодов других объектов.

Сначала сунулись в PLAINCODE. Проверили, а он иногда не совпадает с тем кодом, что лежит в оригинальном КЛАДР.

Ничего страшного, у нас же есть CODE! Снова сюрприз: он пуст так часто, что со временем перестаешь удивляться. А если не пуст, расслабляться рано: код в нем может не совпадать с PLAINCODE.

Подобрались к последнему бастиону: начали склеивать КЛАДР-коды сами. И что бы вы думали? Да, собранный код частенько расходится с PLAINCODE или CODE.

Суровая реальность ФИАС: CODE != PLAINCODE != склеенному коду. Откуда брать правильный идентификатор, непонятно. Начали матчить эталонные справочники и через 50 кружек кофе нашли закономерность:

  • CODE != PLAINCODE > CODE;
  • PLAINCODE != склеенному > PLAINCODE;
  • в остальных случая подходит склеенный код.

И тогда КЛАДР-код совпадает с кодом в официальном справочнике.

Поняли, как переносить планировочные структуры и дополнительные территории


Разработчики предусмотрели в ФИАС больше уровней адресных объектов, чем в КЛАДР: 13 и 6 соответственно.

При этом в КЛАДР есть объекты «лишних» уровней: планировочные структуры и доптерритории. Это садовые товарищества, дачные кооперативы и т. д. Их переносят из ФИАС с изрядными костылями. Делают так: условное садовое товарищество превращают в улицу, а к названию подчиненных ему улиц в скобках добавляют название товарищества.

В теории сложно, объясню на примере. Допустим, в садовом товариществе «Массив N2 СТ Вишня» есть улица Луговая. При переносе этих объектов из ФИАС в КЛАДР происходит вот что:

  • товарищество превращается в улицу «Садовое товарищество „Массив N2 СТ Вишня“»;
  • название подчиненной улицы становится таким: «улица Луговая(Массив N2 СТ Вишня)».

С точки зрения человеческой логики выглядит ужасно, зато в КЛАДР появляются нужные данные. Кто мы такие, чтобы идти наперекор? Конечно, делаем так же.

Разобрались с переименованиями и переподчинениями


В России постоянно переименовывают и переподчиняют города, области, улицы. Например, подмосковный Железнодорожный 40 лет был городом, а потом внезапно стал районом Балашихи.

В адресных справочниках устаревшие сущности хранят для обратной совместимости. Получаются цепочки версий.



Был город V1. Его переименовали — в справочнике появилась версия V2. Переподчинили — V3. И так далее до V<k>

Цепочки подчинений переносят с учетом уровней, которых нет в КЛАДР. Например, цепочка «улица > район города > город» приходит из ФИАС в КЛАДР в виде «улица > город».

Иногда в ФИАС одна версия объекта отличается от другой только полями, которых вообще нет в КЛАДР. Например, у города Майкоп 20 февраля 2017 года сменился ОКТМО: был 79701000, стал 79701000001. Больше ничего не поменялось, но в ФИАС все равно появилась новая версия объекта. Если изменившиеся данные не предусмотрены в КЛАДР, правильно переносить только новую версию объекта. Мы делаем вид, что прошлой как бы и не было.

А порой объект из-за переподчинения переходит на уровень, которого нет в КЛАДР. Типичная история: поселок Обираловка > город Железнодорожный > район Железнодорожный города Балашиха. Уровня городских районов нет в КЛАДР, и Железнодорожный переселяют с 4-го уровня на 99-й. Казалось бы, повышение, но нет: на 99-м уровне хранят исчезнувшие адресные объекты. Был город, стал деклассированный элемент. Еще и улицы переподчинили, причем хитро: создали в КЛАДР несколько населенных пунктов, передали им улицы Железнодорожного, а населенные пункты — Балашихе.

Разрешили конфликты сокращений


В ФИАС хранятся все официальные сокращения типов адресных объектов.
LEVEL SOCRNAME SCNAME KOD_T_ST
3 Автономный округ АО 305
3 Территория тер 303
3 Район р-н 301
3 Улус у 302
3 Муниципальный р-н м р-н 309
В КЛАДР таблица сокращений тоже есть, но записей там поменьше. Просто перенести сокращения из ФИАС в КЛАДР нельзя: уровни не совпадают. Некоторых вообще нет, у других разные номера.

Мы долго сравнивали справочники и все-таки вывели ФНС на чистую воду. Вот как она сдвигает уровни сокращений.
ФИАС КЛАДР
0 X
1 1
2 1
3 2
4 3
5 X
6 4
7 5
8 6
9 X
35 X
65 5
75 X
90 X
91 X
«X» значит, что уровень просто закрывается. Все сокращения, что были в ФИАС на этом уровне, не попадают в КЛАДР. Например, в справочнике нет внутригородских территорий, помещений в пределах зданий, земельных участков и т. д.

Из-за сдвига уровней появляются проблемы с KOD_T_ST — уникальным идентификатором сокращения. KOD_T_ST состоит из двух частей: уровня сокращения и собственно ID сокращения. При переходе с ФИАС на КЛАДР уровни сдвигаются и появляются конфликты.

Например, в ФИАС:

  • набережная: 711;
  • район: 6511.

В КЛАДР после сдвига уровней:

  • набережная: 711 > 511;
  • район: 6511 > 511.

И вот мы уже не знаем, на набережную ехать или на район.

В официальном КЛАДР проблему решают лихо: в код одного из конфликтующих сокращений вместо уровня подставляют девятку. Потому что могут. Из-за этого в эталонном КЛАДР код сокращения для района — 911 вместо 511, причем в поле LEVEL остается пятерка.

В документации об этом ничего, конечно же, не написано.

Протестировали в полях


Мы делали из ФИАС такой же КЛАДР, какой поставляет ФНС. Проверяли по трем параметрам:

  1. Структура.
  2. Объем таблиц.
  3. Работа со спецсофтом.

Третий пункт тестировали утилитой ASVCheck. Она проверяет соответствие формата адресов указаниям Банка России. В ASVCheck загружают КЛАДР, а потом — список адресов. Утилита проверяет адреса по справочнику и отмечает ошибки.

Через ASVCheck мы проверяли адреса из живого банковского реестра. Сначала прогоняли по официальному КЛАДР, а потом по своему?. Затем, понятное дело, смотрели на отличия.

Тут надо сказать, что ASVCheck — таинственный парень. Он не говорит, почему пометил адрес как неправильный. Отлаживали наугад. Некоторые ошибки вообще выглядели как баг утилиты: она перестала браковать часть адресов, когда мы просто отсортировали записи в своем справочнике по КЛАДР-коду.

Но закончилось все успешно: теперь ASVCheck выдает одинаковый результат на нашем КЛАДР и на справочнике ФНС.

Получили КЛАДР с преферансом и обновлениями


Теперь у нас есть КЛАДР, который будет жить в веках. Нашим клиентам не нужно спешно переделывать ПО под ФИАС: они подключают новый справочник и все работает как раньше.

У КЛАДР HFLabs:

  • та же структура, что у официального КЛАДР от ФНС;
  • поставка в том же виде, что у ФНС;
  • обновления через день после выхода свежей версии ФИАС, не реже одного раза в две недели;
  • платная подписка на обновления.

Полную декабрьскую версию мы раздаем бесплатно, можно развернуть ее на живой системе и потестировать.

Если интересно, напишите на elenar@hflabs.ru Елене Расторгуевой. Елена задаст уточняющие вопросы и через день пришлет новый КЛАДР.

Комментарии (11)


  1. sam002
    20.12.2017 14:42

    Очень большой объем работы, молодцы. Не в курсе как насчет обычных юр.лиц, а госов обязали с 1 января 2018 использовать ФИАС (имхо, об этом вспомнят только под конец наступающего года).
    Всё бы хорошо, но качество справочника не меняется — ФНС регулярно на муниципалитеты кляузы катает, и при том сами не могут нормальные выгрузки организовать. Может вы чего слышали как там дела с проектом адресного справочника почты?


    1. shaddyk
      20.12.2017 16:53

      ФНС мало того что грозится принимать всю отчетность по ФИАС, так они ещё и сам ФИАС должны с административного на муниципальное деление перевести. Не знаю как именно это будет выглядеть, но что-то такое было.
      А с Почтой пока нет новостей — коллеги не горят желанием публиковать собственную базу, к сожалению.


      1. sam002
        21.12.2017 17:23

        Да, написано в памятке на сайте, что только в муниципальном делении останется справочник. Как его теперь нормально на ввод предоставлять?
        Этот формат адреса теперь придется указывать для всех гос.услуг, но люди не знают своих адресов в муниципальном делении, даже о делении таком не знают((


        1. shaddyk
          22.12.2017 12:34

          Так можно наши же подсказки и подключить — dadata.ru/suggestions/#address
          Люди будут вводить привычные адреса, а сервис подтянет всю обвязку.


  1. FadeToBlack
    21.12.2017 09:06

    Ребята, такие статьи лучше начать с расшифровки что есть эти самые аббревиатуры. Надо понимать, что хабр для людей, которые хотят знать больше, в том числе и в тех областях, в которых не разбираются. Я, например, не в курсе, что это такое, но очень хочу узнать. По диагонали просмотрев эту статью я не смог понять, о чем идет речь, а значит те, кто и так знал — знают больше, а я вынужден гуглить (то есть, я почитаю про это где-то в другом месте, а эту статью не буду читать). Не надо так.


    1. DEADStop Автор
      21.12.2017 12:57

      Мы несколько раз писали об основах, поэтому решили не повторяться. Что действительно нужно было сделать, так это дать ссылки на предыдущие статьи:


      Учтем в будущем, спасибо за комментарий!


      1. FadeToBlack
        21.12.2017 13:30

        Да, спасибо, то, что надо. Каждую статью лучше начинать сначала — т.е. со ссылки на предыдущие.


  1. justhabrauser
    21.12.2017 11:31

    Читается, как детектив. Отличная работа!
    И таки да — читая «документацию» к КЛАДР и ФИАС не покидает ощущение, что пограммистам ГНИВЦ (или кто там это всё придумал, дай бог ему здоровья) было дано ТЗ «чем дитя не тешилось — лишь бы руки на одеяле держало».


  1. ALIron
    21.12.2017 11:48

    А как таинственный парень ASVCheck будет обновлять КЛАДР?
    Он уже купил подписку у вас?=)


    1. DEADStop Автор
      21.12.2017 12:59
      +1

      ASVCheck сейчас перепиливают под ФИАС, есть даже бета-версия. Но когда закончат и что будет в итоге, как водится, никто никто не знает :). А кто знает, тот молчит.


      1. DEADStop Автор
        21.12.2017 13:34

        Пришли подробности от наших технарей.

        «Пробовала тестировать на асвчеке с ФИАС, и эта версия пока кажется еще странней предыдущей. Адрес корректный и актуальный прога „распарсила“ в неактуальный и присвоила код 114 — „В адресе используются устаревшие наименования“. У саппорта АСВ спросила об этом адресе и что с ним надо сделать, чтоб он не был ошибочным. Мне ответили, чтоб я пока не пользовалась бетой с ФИАС))».

        ?\_(?)_/?