Как перейти от КЛАДР к ФИАС и ничего себе не сломать

    ГНИВЦ ФНС сообщает, что с начала 2018 года КЛАДР перестанет существовать и скачать его будет нельзя.

    Дисклеймер:
    Если вы совсем не поняли, что означают эти наборы букв, ничего страшного. Ниже мы расскажем о реалиях работы с адресами в России. Если вам это неинтересно, почитайте про топографические каламбуры.

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



    Зачем нужны классификаторы адресов


    Компаниям нужны адреса клиентов, чтобы рассылать письма, указывать в договорах и соглашениях. Но мало просто отправить письмо: желательно, чтобы его получили и прочитали. Поэтому адреса должны быть правильными и понятными.

    Как вы думаете, какой государственный орган наиболее заинтересован в том, чтобы вы получали от него письма? Правильно! Налоговая. Поэтому ФНС России много лет разрабатывает и поддерживает ведомственные общероссийские классификаторы адресов. И так как более полных справочников нет, их стали использовать повсеместно.

    Сначала был КЛАДР, и было в нем 6 уровней:

    Регион → Район → Город → Населенный пункт → Улица → Дом со строениями и корпусами

    С 2012 года в эксплуатацию ввели новый классификатор — ФИАС. Про основные отличия мы писали три года назад в статье «ФИАС или КЛАДР: выбираем справочник адресов». В ФНС к разработке нового классификатора подошли основательнее и постарались учесть все грабли минусы КЛАДР. Из интересного добавили дату начала и окончания записи, ввели фиксированный ID для каждого дома (предполагается, что он не будет меняться).

    До сих пор продолжают обновляться оба классификатора, но поддерживать совместимость становится сложнее. В прошлом году в ФИАС начали добавлять новые уровни. Например, планировочные структуры — это всякие дачные товарищества и микрорайоны, в классификаторе их уже больше 81 000. В конечном итоге в ФНС приняли логичное решение прекратить поддержку КЛАДР и удалить его в конце 2017 года.



    Как адреса хранятся в ФИАС и КЛАДР


    Мы видели много способов хранения адресов в структуре КЛАДР. В основном они сводятся к двум вариантам:

    1. Код КЛАДР до улицы + домовая часть вида «дом 1 строение 3 квартира 33», так как части домов в классификаторе хранятся как диапазоны
    2. Адрес в виде текста — одним полем или разбитый по структуре КЛАДР.

    Так как в ФИАС нет части домов, мы рекомендуем хранить адрес как:

    1. Код ФИАС до улицы + дом + квартира для идентификации адреса (подробные рекомендации).
    2. Адрес одной строкой в формате ФИАС. При этом лучше сохранять исходный адрес. ФИАС — это все-таки справочник налоговой, и там есть не всё.

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

    Классификационные коды выглядят так:

    • КЛАДР: СС+РРР+ГГГ+ППП+УУУУ+ДДДД;
    • ФИАС: СС+РРР+ГГГ+ППП+СССС+УУУУ+ДДДД (или ЗЗЗЗ)+ОООО.

    Смотрится страшно, рассмотрим пример: Ленинградская обл, Всеволожский р-н, деревня Кудрово, мкр Новый Оккервиль. Адрес реально существует, вот он на Яндекс.Картах. Классификационный код КЛАДР и ФИАС на первый взгляд для него выглядит одинаково: 470050000550023. Разложим его на составляющие.
    Уровень Пример код ФИАС код КЛАДР
    1 Регион Ленинградская область СС: 47 СС: 47
    2 Автономный округ
    3 Район Всеволожский р-н РРР: 005 РРР: 005
    4 Город ГГГ: 000 ГГГ: 000
    5 Внутригородская территория
    6 Населенный пункт деревня Кудрово ППП: 055 ППП: 055
    65 Планировочная структура мкр Новый Оккервиль СССС: 0023
    7 Улица УУУУ УУУУ: 0023
    75 Земельный участок ЗЗЗЗ
    8 Здание, сооружение, объект незавершенного строительства ДДДД ДДДД
    9 Помещение в пределах здания, сооружения ОООО
    90 Дополнительная территория
    91 Подчинённые дополнительных территорий
    Раскладываем адрес по уровням ФИАС и КЛАДР

    Из примера видно, что даже в простых ситуациях между классификаторами возникает недопонимание. Но есть еще один очень важный момент.

    Классификационный код отражает текущую структуру адреса, а она может измениться. Например, у Оккервиля изменится район и весь код станет недействительным, мы его уже не найдем.

    Чтобы избавиться от этого, в ФИАС добавили еще идентификационный код ФИАС. Это глобальный идентификатор для каждого объекта: города, улицы, района и т. д. Выглядит он как набор букв и цифр, который формируется по стандарту GUID (Globally Unique Identifier). Типичный GUID в ФИАС выглядит так: f77948dc-7bc8-42cb-979e-2c958d162d63.

    Код КЛАДР → идентификационный код ФИАС


    Если адрес у вас хранится как код КЛАДР улицы + домовая часть («дом 1 строение 3 квартира 44»), то для него все относительно просто.


    Таблица ADDROBJ хранит все адресные объекты с их идентификаторами

    Для работы понадобится таблица ADDROBJ из выгрузки ФИАС в формате xml или dbf. В ней хранятся все объекты (города, улицы и т. д.) подряд с уникальными идентификаторами GUID.
    Будем использовать следующие колонки:

    • код КЛАДР (PlainCode);
    • наименование и тип текстом (FormalName и ShortName);
    • актуальность объекта (CurrStatus);
    • почтовый индекс (PostalCode);
    • собственный и родительский идентификатор ФИАС (AoGuid и ParentGuid);
    • уровень (AoLevel).

    Пример: Москва, ул Александра Солженицына. Код КЛАДР: 77000000000151900.

    Шаг 1. Выделяем из кода КЛАДР код до улицы, то есть берем первые 15 цифр: 77000000000151900.

    • Если КЛАДР меньше 15 цифр, берем 11 и дополняем нулями — это код до населённого пункта: 770000000000000;
    • Меньше 11 цифр — берем 8: 77000000000000000;
    • Меньше 8 — берем 5: 77000000000000000;
    • Меньше 5 — берем 2 цифры кода региона: 77000000000000000.

    Шаг 2. Ищем код КЛАДР в поле PlainCode. Если нашлась одна запись, то сохраняем значение поля AoGuid и пропускаем следующий пункт. Но по нашему коду 770000000001519 находится три записи, нужна дополнительная проверка.

    Шаг 3. Находим актуальную запись. Значение поля CurrStatus = 0 означает, что запись актуальна. Выбираем ее и сохраняем значение поля AoGuid. Идентификационный код ФИАС найден!

    • Александра Солженицына, CurrStatus = 2;
    • Коммунистическая Б., CurrStatus = 1;
    • Александра Солженицына, CurrStatus = 0, AuGuid = f77948dc-7bc8-42cb-979e-2c958d162d63.

    В качестве бонуса соберем текстовый адрес по найденному AoGuid:

    • берем PostalCode — это почтовый индекс: 109004
    • добавляем ShortName и FormalName: 109004, ул. Александра Солженицына
    • если объект является регионом (поле AoLevel = 1), то адрес готов. Но в нашем случаем AoLevel = 7 — это улица. Поэтому ищем родительский элемент по полю ParentGuid и повторяем предыдущий пункт;
    • для улицы Александра Солженицына родительская запись сразу имеет уровень региона — это Москва. Сохраняем ShortName и FormalName и собираем адрес: 109004, г. Москва, ул. Александра Солженицына

    Но можно поступить еще проще и воспользоваться готовым сервисом. DaData.ru умеет подсказывать адреса в конкретных регионах, районах, городах и населенных пунктах. Понимает названия («Петергоф»), коды КЛАДР («7800000800000») и ФИАС («8f238984-812b-4bb1-850b-49749fb5c56d»).


    Строчный адрес КЛАДР → код ФИАС


    Самый простой вариант — воспользоваться DaData.ru. Сервис сделает все за вас автоматически. Но можно и развлекаться самостоятельно.

    Адреса одной строкой


    Если адреса у вас хранятся одной строкой, вроде этой:
    г Москва, улица Большая Коммунистическая, дом 3, то поздравляем, это самая интересная задача. Нужно писать свой адресный парсер, который будет разделять строку в формате КЛАДР на части, искать каждый ее компонент в ФИАС с учетом опечаток, сокращений, исторических названий и определять по ним ФИАС-код. Легче это сделать уже готовым адресным парсером. Как выбрать алгоритм для адресного фильтра, мы рассказывали раньше.

    Адреса по КЛАДР


    Если адреса у вас хранятся разложенными по КЛАДР, то задача немного проще.
    Тип региона Название региона Тип улицы Название улицы Тип дома Номер дома
    г Москва улица Коммунистическая Б. дом 3
    Примерно так выглядит адрес, разложенный по КЛАДР

    Код ФИАС можно собрать, используя всё ту же таблицу ADDROBJ. Но в этом случае двигаться по уровням нужно от большего к меньшему.

    Шаг 1. Берем название региона и ищем его в поле FormalName таблицы ADDROBJ.

    FormalName = Москва
    AoGuid = 0c5b2444-70a0-4932-980c-b4dc0d3f02b5


    Шаг 2. Идем дальше по уровням вниз и ищем по FormalName с фиксированным родителем — найденным AoGuid на предыдущем шаге. В нашем случае уровни «город» и «населенный пункт» пустые, а следующий непустой уровень — улица.

    ParentGuid = 0c5b2444-70a0-4932-980c-b4dc0d3f02b5,
    FormalName = Коммунистическая Б. → AoGuid=f77948dc-7bc8-42cb-979e-2c958d162d63


    Шаг 3. Если дошли до улицы, то можно найти и дом. Для этого в таблице HOUSE ищем номер дома с фиксированным AoGuid улицы. ФИАС не полон домами, поэтому не расстраивайтесь, если нужный номер не найдется.

    AoGuid = f77948dc-7bc8-42cb-979e-2c958d162d63,
    дом номер 3
    HouseGuid = bce8be1f-f2f7-4cce-836e-08daac0b931e


    Подводные камни


    Может ли что-то пойти не так? Конечно. Например, по названию может легко найтись несколько объектов. «Москва, Тверская» — это про площадь или про улицу? Тогда нужно сравнивать типы, но не все так просто.
    LEVEL SCNAME SOCRNAME KOD_T_ST
    7 тракт Тракт 727
    7 туп Тупик 728
    7 ул Улица 729
    7 уч-к Участок 730
    7 ф/х Фермерское хозяйство 789
    7 ферма Ферма 769
    7 х Хутор 758
    7 ш Шоссе 731
    Таблица SOCRBASE хранит полные и сокращенные типы объектов

    Тип по КЛАДР может быть сокращенным и полным: «ул» — «Улица», «х» — «Хутор». В ФИАС в явном виде хранится только сокращенный тип (в поле ShortName). Полный тип в сокращенный можно превратить с помощью таблицы SOCRBASE, в ней для каждого уровня хранится соответствие сокращённых и полных типов.

    § § §

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

    P.S. Благодарю за неоценимую помощь в создании этой статьи моих коллег по HFLabs Михаила Березина, Елену Расторгуеву и Антона Жиянова.

    HFLabs

    121,00

    Качество и интеграция клиентских данных

    Поделиться публикацией
    Комментарии 26
      +2

      Спасибо ГНИВЦу, что заранее сообщил. Обычно он предпочитает вносить изменения молча ツ Например, недавно из ФИАСа тихо пропали интервалы домов (и больше уже не вернутся, судя по всему).

        +2
        Год назад под другой статьей про адреса я сказал, что банки обязаны использовать ФИАС. Так вот, это ещё не было правдой, но я-то знал! Ребята в ГНИВЦ — милахи!
          +1
          Подскажите, пожалуйста, а не планируется ли заодно связать адресный справочник со справочником судебных участков (если этого еще нет, конечно)? А то там (в справочнике СУ) данные в таком виде, что черт ногу сломит.
            +1

            Запрос такой есть, но не слишком востребован. А для чего вы бы стали его использовать?

              0
              есть такая задача… К сожалению, подробности раскрыть не могу. Пока развлекаюсь тем, что текст с ГАС «Правосудие» парсю и пытаюсь находить для адреса (передается в фиксированном формате) нужный СУ с учетом исключений, особенностей и т.п. Задача нетривиальная, по крайней мере на мой взгляд.
                0
                Рискну предположить, что для автоматизации претензионно-исковой работы.
                0
                Мы ведём справочник домов, и вручную (по возможности) проставляем для каждого дома атрибут судебного участка.
                Такие дела.
                0
                А «мы планируем выпустить ФИАС в формате КЛАДР» и «БД в формате КЛАДР 4.0» на http://fias.nalog.ru/Updates.aspx — это разные ФИАСы?
                  +1
                  а вот эта БД в формате КЛАДР 4.0 как раз с нового года обратится в тыкву, первая строка статьи про это :-)
                    +1
                    https://www.nalog.ru/rn77/program//5961265/, да.
                    Еще 5 месяцев можно насладиться ФИАС в формате КЛАДР haute FNS.
                      0
                      Точно!
                      Но по некоторым нашим заказчикам мы видим, что не все успеют перейти за это время, поэтому решили некоторое время продолжать выкладывать ФИАС в формате КЛАДР, если кто не успеет.
                        0
                        Есть ещё такое предположение, что ФНС не успеет (или не догадается) поменять структуру адреса в своих формах отчётности, чтобы привести её в соответствие с ФИАС: сейчас она там КЛАДР-овская. Возможно, таки на этот период 4.0 продлят.
                          0
                          Возможно :-) Но это пока только предположение.
                  +1
                  Недавно сталкивался с разбором ФИАС, даже думал написать сюда статью, но лени хватает только на комментарии сюда. tl;dr — информация внутри базы разрознена, документация не отражает реальное положение дел. Что бы я выделил из своего опыта:

                  — Формат dbf — нормально прочитать его в Python у меня не получилось, оптугнуло вот что. Но разбор XML это тоже еще та головная боль. Файл ADDROBJ занимает больше 21 гигабайта, это значит прогонять через DOM — совсем не вариант
                  — Часть полей объявленных как обязательные, по факту отсутствуют. Другие (необязательные) — присутствуют всегда.
                  — Опираться на код КЛАДР для записей — плохо. Например ряд улиц из новой Москвы, проходят по AREACODE (входит в код кладр) как Подмосковье. При этом города, которым подчинены эти улицы, могут иметь уже другой AREACODE (то есть принадлежать другому региону).
                  — Необходимо учитывать ACTSTATUS (не CURRSTATUS) или использовать STARTDATE, ENDDATE, UPDATEDATE. Адресные объекты могут переименовываться, чтобы не копаться в истории — крайне важно искать только актуальные записи.
                  — Существующая отдельная база для «раскрытия» сокращений (SOCRBASE), т.е перевода из SHORTNAME 'г.' в 'Город', не содержит всех реально используемых сокращений в базе ADDROBJ
                    +2
                    — Часть полей объявленных как обязательные, по факту отсутствуют. Другие (необязательные) — присутствуют всегда.
                    О да. Документация часто расходится с реальным положением дел, например:
                    1. Есть описание интервалов домов, но интервалов в выгрузках уже нет.
                    2. В классификационном коде ФИАС предусмотрен номер помещения ОООО, но поля с четырёхзначным номером помещения не существует.

                    — Опираться на код КЛАДР для записей — плохо. Например ряд улиц из новой Москвы, проходят по AREACODE (входит в код кладр) как Подмосковье. При этом города, которым подчинены эти улицы, могут иметь уже другой AREACODE (то есть принадлежать другому региону).

                    Случается, что в ФИАСе забывают перенести подчиненные объекты к актуальной версии родителя. А у вас остались примеры таких улиц, которые висят в Подсмосковье?

                    — Необходимо учитывать ACTSTATUS (не CURRSTATUS) или использовать STARTDATE, ENDDATE, UPDATEDATE. Адресные объекты могут переименовываться, чтобы не копаться в истории — крайне важно искать только актуальные записи.

                    ACTSTATUS относится не к объекту, а к записи о нем в базе. Как написано в документации: «Обычно последняя запись об адресном объекте».
                    Запись об объекте может быть актуальна (ACTSTATUS=1), но сам объект удалён (CURRSTATUS=99) или переподчинён (CURRSTATUS=51).
                    Если искать по наименованиям, то сначала стоит найти историческую запись, а затем подняться до актуальной. Переименованные записи без копания в истории не найти.

                    — Существующая отдельная база для «раскрытия» сокращений (SOCRBASE), т.е перевода из SHORTNAME 'г.' в 'Город', не содержит всех реально используемых сокращений в базе ADDROBJ

                    Да, нам иногда приходится пополнять сокращения при конвератции в свои структуры.
                    Часто встречается обратная ситуация: в SOCRBASE под сотни пар значений (тип, уровень), которые в реальных данных не встречаются.
                      0
                      Список объектов скинул сюда. Впрочем все найденные мною объекты имели CURRSTATUS равный 99. Но тут есть ньюанс, как я понимаю.

                      К примеру, там есть запись (4-ая по порядку) — ул. Адмирала Горшкова, находившаяся в городе Щербинка. К слову, город Щербика по базе до сих пор город, а вот согласно вики — поселение. Так вот изменилась это запись в сентябре прошлого года. С точки зрения логики, тогда эту запись и могли сделать исторической. И вопрос — как много документов, в которых эта улица все еще существует? Тут видимо надо пологаться из задачи, использовать CURRSTATUS или ACTSTATUS. В самом начале документации (не в описании таблицы) сказано следующее:

                      ACTSTATUS — определяет, является ли эта запись по адресному объекту актуальной на текущую дату (0 – не актуальный, 1- актуальный).
                      CURRSTATUS — «Статус актуальности в соответствии » с классификацией адресных элементов и адресных объектов. Содержит значение признака актуальности адресного элемента и объекта адресации

                      Из «смешного» я еще помню улицы, у которых родительскими объектами были другие улицы — но этого я быстро не найду. Да городской округ в качестве административно территориального деления, согласно закону (еще можно посмотреть здесь), городской округ — это муниципальное деление. В качестве примера — городской округ Егорьевский из Московской области (AOGUID: 96036cfc-7acb-4de8-9004-3ae4c1c232c0).

                      А вот с домами базы я не смотрел — не было острой необходимости в задаче но напугало наличие _ДВУХ_ баз про дома HOUSE и HOUSEINT. Выдержка из документации:

                      Таблица HOUSE (House) содержит записи с номерами домов улиц, элементов планировочной структуры, городов и населенных пунктов. При выгрузке сведений по домам в формате DBF именам файлов присваиваются имена HOUSE01 – HOUSE99, где 01-99 коды регионов в соответствии с Приложением 3.
                      Таблица HOUSEINT (HouseInterval) содержит записи с интервалами домов улиц городов и населенных пунктов.

                      PS актуальность — от позднелат. actualis — фактически существующий, настоящий, современный =)
                        0
                        Список объектов скинул сюда. Впрочем все найденные мною объекты имели CURRSTATUS равный 99. Но тут есть ньюанс, как я понимаю.

                        К примеру, там есть запись (4-ая по порядку) — ул. Адмирала Горшкова, находившаяся в городе Щербинка.

                        Круто! Как будто улица Адмирала Горшкова исчезла и из ФИАС, и с карт. Непонятная история.

                        наличие _ДВУХ_ баз про дома HOUSE и HOUSEINT.

                        Больше месяца в ФИАСе интервалов домов (таблицы HOUSEINT) нет, и, видимо, уже не будет.

                        Из «смешного» я еще помню улицы, у которых родительскими объектами были другие улицы

                        Да, есть такие улицы, их 12 штук, но все уже неактуальные. Например: «Город Тюмень, Улица Дальняя, Улица Медиков», улица Медиков удалена.
                          0
                          Мне ещё понравились записи, где планировочная структура напрямую привязана к региону:
                          • Область Ленинградская, Дачное неком-е партнерство Верхняя Ропша, Улица Главная
                          • Область Ленинградская, Дачное неком-е партнерство Ропшинские Горки, Улица Южная
                          • Край Краснодарский, Садовое товарищество ДНТ Нептун
                          • Край Хабаровский, Гаражно-строительный кооп. 135
                          • Край Хабаровский, Гаражно-строительный кооп. 89
                          • Край Хабаровский, Гаражно-строительный кооп. 723
                          • Край Хабаровский, Гаражно-строительный кооп. 712

                          Таких 860 штук, все актуальные
                      0
                      Но разбор XML это тоже еще та головная боль. Файл ADDROBJ занимает больше 21 гигабайта, это значит прогонять через DOM — совсем не вариант

                      Используйте SAX-парсер XML (потоковый) для разбора XML и будет вам счастье. Архив тоже можно не распаковывать, а считывать файл напрямую из него с помощью libarchive (умеет в RAR начиная с версии 3.0, для большинства популярных языков должны быть библиотеки-обёртки, на предыдущей работе я для проекта на Ruby использовал https://github.com/AMekss/archive_io). А ещё можно парсинг XML и запись в бд разнести в разные потоки…

                        0
                        Я тогда воспользовался iterparse из lxml.etree — что-то вроде SAX.

                        А по поводу потоков, разбор XML — не самая трудная задача. Там, в 21 гигабайте, содержится чуть больше 3.2 миллионов записей, если использовать только с атрибутом ACTSTATUS равным 1, то таких записей, на память, что-то около 1.5 миллиона. А вот обработка таких данных — другое дело, для выстраивания иерархии используются строковые UID'ы (атрибут AOGUID). Причем разные объекты могут иметь одинаковые значения AOGUID, тогда «правильная» запись выбирается исходя из других атрибутов.
                          0

                          Уникальный ключ — это AOID. А вот AOGUID будет одинаковый у нескольких записей об одном и том же объекте, кажется (из них максимум одна будет актуальной, но это я тоже из памяти достаю обрывки).

                            0
                            AOID — идентификатор записи как таковой, а вот AOGUID и PARENTGUID используются для создания иерархии. Так, один и тот же адресный объект может иметь несколько записей. В этом случае, каждая запись будет иметь разный AOID и одинаковый AOGUID
                              0
                              Да, для каждого AOGUID одна уникальная запись, это выполняется, ура! :)
                        0
                        Меня вопрос ФИАСа интересует в плане учета помещений. Доведут ли ФИАС до квартиры/помещения, для полной идентификации? Сегодня разрозненной получается информация у разных РСО для квартир.
                          0

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

                            0
                            В июне 2017, передали в местную администрацию по домовую информацию по помещениям. Что то вносят. Будем надеяться, что заработает, иначе гис жкх не взлетит. Тут еще с гис жкх пляски пошли по елс, но это уже другая история.

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                        Самое читаемое