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

- КиТ :: Будь в СЕТИ!

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

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

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

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



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

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

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

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

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

КЛАДР: СС+РРР+ГГГ+ППП+УУУУ+ДДДД; ФИАС: СС+РРР+ГГГ+ППП+СССС+УУУУ+ДДДД (или ЗЗЗЗ)+ОООО.
Смотрится страшно, рассмотрим пример: Ленинградская обл, Всеволожский р-н, деревня Кудрово, мкр Новый Оккервиль. Адрес реально существует, вот . Классификационный код КЛАДР и ФИАС на первый взгляд для него выглядит одинаково: 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»).


Строчный адрес КЛАДР -> код ФИАС
Самый простой вариант — воспользоваться . Сервис сделает все за вас автоматически. Но можно и развлекаться самостоятельно.

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

Если адреса у вас хранятся одной строкой, вроде этой:
г Москва, улица Большая Коммунистическая, дом 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 , Елену Расторгуеву и .

ПодпискаБудь в СЕТИ! Новости социальных сетей - всегда актуальное
 
Группы: ВК | OK | Tg