Для нахождения Кода дома по ФИАС необходимо выполнить следующие пункты:
1. Перейти по ссылке http://fias.nalog.ru/.
2. Перейти по ссылке “Расширенный поиск” (рис.1).
Рисунок 1. Главная страница сайта fias.nalog.ru
3. В новой вкладке ввести адрес дома (район, город, улица, дом) -> “Найти” (рис.2).
4. В нижней части вкладки высветится строка с кодом ФИАС (рис.3).
Рисунок 2. Поиск кода дома по ФИАС
Рисунок 3. Результаты поиска кода дома по ФИАС
Как перейти от КЛАДР к ФИАС и ничего себе не сломать
Время на прочтение
7 мин
Количество просмотров 99K
ГНИВЦ ФНС сообщает, что с начала 2018 года КЛАДР перестанет существовать и скачать его будет нельзя.
Дисклеймер:
Если вы совсем не поняли, что означают эти наборы букв, ничего страшного. Ниже мы расскажем о реалиях работы с адресами в России. Если вам это неинтересно, почитайте про топографические каламбуры.
Правильные адреса нужны компаниям, которые любят своих клиентов. Знакомые банки, страховые и интернет-магазины, которые сейчас используют справочник КЛАДР, спрашивают нас, что же делать дальше. Поэтому мы запарились и написали пошаговое руководство по переходу
с одних букв на другие
от КЛАДР к ФИАС.
Зачем нужны классификаторы адресов
Компаниям нужны адреса клиентов, чтобы рассылать письма, указывать в договорах и соглашениях. Но мало просто отправить письмо: желательно, чтобы его получили и прочитали. Поэтому адреса должны быть правильными и понятными.
Как вы думаете, какой государственный орган наиболее заинтересован в том, чтобы вы получали от него письма? Правильно! Налоговая. Поэтому ФНС России много лет разрабатывает и поддерживает ведомственные общероссийские классификаторы адресов. И так как более полных справочников нет, их стали использовать повсеместно.
Сначала был КЛАДР, и было в нем 6 уровней:
Регион → Район → Город → Населенный пункт → Улица → Дом со строениями и корпусами
С 2012 года в эксплуатацию ввели новый классификатор — ФИАС. Про основные отличия мы писали три года назад в статье «ФИАС или КЛАДР: выбираем справочник адресов». В ФНС к разработке нового классификатора подошли основательнее и постарались учесть все
грабли
минусы КЛАДР. Из интересного добавили дату начала и окончания записи, ввели фиксированный ID для каждого дома (предполагается, что он не будет меняться).
До сих пор продолжают обновляться оба классификатора, но поддерживать совместимость становится сложнее. В прошлом году в ФИАС начали добавлять новые уровни. Например, планировочные структуры — это всякие дачные товарищества и микрорайоны, в классификаторе их уже больше 81 000. В конечном итоге в ФНС приняли логичное решение прекратить поддержку КЛАДР и удалить его в конце 2017 года.
Как адреса хранятся в ФИАС и КЛАДР
Мы видели много способов хранения адресов в структуре КЛАДР. В основном они сводятся к двум вариантам:
- Код КЛАДР до улицы + домовая часть вида «дом 1 строение 3 квартира 33», так как части домов в классификаторе хранятся как диапазоны
- Адрес в виде текста — одним полем или разбитый по структуре КЛАДР.
Так как в ФИАС нет части домов, мы рекомендуем хранить адрес как:
- Код ФИАС до улицы + дом + квартира для идентификации адреса (подробные рекомендации).
- Адрес одной строкой в формате ФИАС. При этом лучше сохранять исходный адрес. ФИАС — это все-таки справочник налоговой, и там есть не всё.
То есть задача миграции сводится к тому, чтобы перевести код или текстовый адрес в формате КЛАДР в код ФИАС.
Классификационные коды выглядят так:
- КЛАДР: СС+РРР+ГГГ+ППП+УУУУ+ДДДД;
- ФИАС: СС+РРР+ГГГ+ППП+СССС+УУУУ+ДДДД (или ЗЗЗЗ)+ОООО.
Смотрится страшно, рассмотрим пример: Ленинградская обл, Всеволожский р-н, деревня Кудрово, мкр Новый Оккервиль. Адрес реально существует, вот он на Яндекс.Картах. Классификационный код КЛАДР и ФИАС на первый взгляд для него выглядит одинаково: 470050000550023. Разложим его на составляющие.
Раскладываем адрес по уровням ФИАС и КЛАДР
Из примера видно, что даже в простых ситуациях между классификаторами возникает недопонимание. Но есть еще один очень важный момент.
Классификационный код отражает текущую структуру адреса, а она может измениться. Например, у Оккервиля изменится район и весь код станет недействительным, мы его уже не найдем.
Чтобы избавиться от этого, в ФИАС добавили еще идентификационный код ФИАС. Это глобальный идентификатор для каждого объекта: города, улицы, района и т. д. Выглядит он как набор букв и цифр, который формируется по стандарту 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, то поздравляем, это самая интересная задача. Нужно писать свой адресный парсер, который будет разделять строку в формате КЛАДР на части, искать каждый ее компонент в ФИАС с учетом опечаток, сокращений, исторических названий и определять по ним ФИАС-код. Легче это сделать уже готовым адресным парсером. Как выбрать алгоритм для адресного фильтра, мы рассказывали раньше.
Адреса по КЛАДР
Если адреса у вас хранятся разложенными по КЛАДР, то задача немного проще.
Примерно так выглядит адрес, разложенный по КЛАДР
Код ФИАС можно собрать, используя всё ту же таблицу 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
Подводные камни
Может ли что-то пойти не так? Конечно. Например, по названию может легко найтись несколько объектов. «Москва, Тверская» — это про площадь или про улицу? Тогда нужно сравнивать типы, но не все так просто.
Таблица SOCRBASE хранит полные и сокращенные типы объектов
Тип по КЛАДР может быть сокращенным и полным: «ул» — «Улица», «х» — «Хутор». В ФИАС в явном виде хранится только сокращенный тип (в поле ShortName). Полный тип в сокращенный можно превратить с помощью таблицы SOCRBASE, в ней для каждого уровня хранится соответствие сокращённых и полных типов.
§ § §
И напоследок хорошая новость для тех, кому лень запариваться всем перечисленным. В ближайшее время мы планируем выпустить ФИАС в формате КЛАДР для тех, кто не успеет перейти на формат ФИАС до конца года. Следите за новостями 🙂
P.S. Благодарю за неоценимую помощь в создании этой статьи моих коллег по HFLabs Михаила Березина, Елену Расторгуеву и Антона Жиянова.
Общая информация
В базе у каждого объекта есть два ГУИДа:
- уникальный ГУИД, это первичный ключ.
- ФИАС ГУИД, который соответсвует реальному объекту.
По одному ФИАС ГУИДу может быть несколько записей, каждый со своим ключом, но актуальной (с флагом актуальности) будет только одна. По возможности берется актуальная.
Все функции API находятся в /api/address/.
Address
API | Description |
---|---|
GET api/address/GetAddressByFiasGuid?guid={guid} |
Получение данных обо всех родительских указанному объектах (т.е. цепочку от корня до указанного). |
GET api/address/GetXmlAddressByFiasGuid?guid={guid} |
Получение цепочки, которая заканчивается указанным объектом, в формате XML. |
GET api/address/FindAddress?searchString={searchString}&level={level}&count={count}&parentGuid={parentGuid} |
Поиск объектов адреса. |
GET api/address/GetFullFiasAddress?guid={guid} |
Возвращает объект, содержащий весь адрес. |
GET api/address/FindAddressObject?formalName={formalName}&prevLevel={prevLevel}&shortName={shortName} |
Поиск объекта адреса по параметрам. |
Пример использования
Попробуем найти некоторый адрес с помощью этого сервиса.
Сначала получим список всех корневых узлов (по хорошему это должны быть области и автономные округа, города федерального значения):
/api/address/FindAddress?searchString=&level=&count=&parentGuid=
Результат:
[{ "fiasGuid": "db9c4f8b-b706-40e2-b2b4-d31b98dcd3d1", "formalName": "Красноярский", "shortName": "край" ... ... ... "fiasGuid": "6f2cbfd8-692a-4ee4-9b16-067210bde3fc", "formalName": "Башкортостан", "shortName": "Респ" }, { "fiasGuid": "d8327a56-80de-4df2-815c-4f6ab1224c50", "formalName": "Адыгея", "shortName": "Респ" } ]
Попробуем найти Калужскую область:
/api/address/FindAddress?searchString=Калуж&level=&count=&parentGuid=
[{"fiasGuid":"18133adf-90c2-438e-88c4-62c41656de70","formalName":"Калужская","shortName":"обл"}]
Дочерние объекты Калужской области содержащие “кир”:
/api/address/FindAddress?searchString=кир&level=&count=&parentGuid=b502ae45-897e-4b6f-9776-6ff49740b537
[{ "fiasGuid": "aafd4756-144b-451a-a3a7-93605cf77e98", "formalName": "Кирпичный", "shortName": "пер" }, { "fiasGuid": "239b8705-0b53-4a98-8eb2-346814382422", "formalName": "Кирова", "shortName": "ул" }, { "fiasGuid": "daec73dd-a5b5-44dc-a13f-dbe14039730f", "formalName": "Кирова", "shortName": "пер" }, { "fiasGuid": "0a5c14f1-c169-49f0-9066-02ddebb532e2", "formalName": "Кирпичная", "shortName": "ул" }, { "fiasGuid": "346d7e07-cd5d-44cf-ae77-2133f5e4ecae", "formalName": "Белокирпичная", "shortName": "ул" }, { "fiasGuid": "68ea7d9f-4c6c-4e85-8263-346f6c6a2d2e", "formalName": "Азаровский Кирпичный Завод", "shortName": "п" }, { "fiasGuid": "22a9f7f2-645d-430d-a086-64998b499c6f", "formalName": "Кирпичный з-д МПС", "shortName": "ул" } ]
Дочерние объекты Калуги начинающиесе на “ки”:
/api/address/FindAddress?searchString=ки&level=&count=&parentGuid=b502ae45-897e-4b6f-9776-6ff49740b537
[{ "fiasGuid": "aafd4756-144b-451a-a3a7-93605cf77e98", "formalName": "Кирпичный", "shortName": "пер" }, { "fiasGuid": "cac18222-b5dc-4510-a405-8312db6e1e9b", "formalName": "Киевский", "shortName": "пер" }, { "fiasGuid": "239b8705-0b53-4a98-8eb2-346814382422", "formalName": "Кирова", "shortName": "ул" }, { "fiasGuid": "9d89f22c-41e3-45e9-af9c-4b6b0b6ebf90", "formalName": "Киевский", "shortName": "проезд" }, { "fiasGuid": "2f873a18-bead-4258-aab8-1ab52376d28b", "formalName": "Кибальчича", "shortName": "ул" }, { "fiasGuid": "daec73dd-a5b5-44dc-a13f-dbe14039730f", "formalName": "Кирова", "shortName": "пер" }, { "fiasGuid": "0a5c14f1-c169-49f0-9066-02ddebb532e2", "formalName": "Кирпичная", "shortName": "ул" }, { "fiasGuid": "06e6b466-6c3e-476b-9b11-8fd479191c76", "formalName": "Киевка 2-я", "shortName": "ул" }, { "fiasGuid": "ba9a0d0b-c92d-44f0-a0a9-dd46407e58cf", "formalName": "Киевка", "shortName": "ул" }, { "fiasGuid": "0a634c94-349c-40f7-9e63-0ee970730caf", "formalName": "Киевская", "shortName": "ул" }, { "fiasGuid": "22a9f7f2-645d-430d-a086-64998b499c6f", "formalName": "Кирпичный з-д МПС", "shortName": "ул" } ]
Теперь соберем полный адрес для ул.Кирова (этот запрос довольно долгий, поскольку приходится идти по цепочке и каждый раз обращаться к базе):
/api/address/GetAddressByFiasGuid?guid=239b8705-0b53-4a98-8eb2-346814382422
{ "representation": "Калужская обл, Калуга г, Кирова ул", "fiasGuid": "239b8705-0b53-4a98-8eb2-346814382422", "fiaslevel": 7, "region": { "fiasGuid": "18133adf-90c2-438e-88c4-62c41656de70", "formalName": "Калужская", "shortName": "обл" }, "area": {}, "city": { "fiasGuid": "b502ae45-897e-4b6f-9776-6ff49740b537", "formalName": "Калуга", "shortName": "г" }, "intraurbanTerritory": {}, "place": {}, "street": { "fiasGuid": "239b8705-0b53-4a98-8eb2-346814382422", "formalName": "Кирова", "shortName": "ул" }, "unparsed": [] }
То же самое в XML. На самом деле формат ответа – JSON. Приходит строка – представление адреса в XML. (кавычки в ней будут экранированы, см. пример ответа в описании метода):
/api/address/FindAddress?searchString=ки&level=&count=&parentGuid=b502ae45-897e-4b6f-9776-6ff49740b537
<АдресРФ> <ИдФиас>239b8705-0b53-4a98-8eb2-346814382422</ИдФиас> <СубъектРФ>Калужская обл</СубъектРФ> <Город>Калуга г</Город> <Улица>Кирова ул</Улица> <ОКТМО>29701000</ОКТМО> <ОКАТО>29401000000</ОКАТО> </АдресРФ>
Описание классов API
AddressResult
Тип данных | Параметр | Описание |
---|---|---|
String | code | Код ошибки или состояния, 1 – успешное выполнение |
String | message | Текст сообщения об ошибке |
IEnumerable<AddressItem> | addressItems | Список объектов типа AddressItem |
AddressItem
Тип данных | Параметр | Описание |
---|---|---|
String | value | Наименование части адреса и тип |
String | fullValue | Полное наименование адреса |
String | postIndex | Почтовый индекс |
String | regionCode | Код региона |
IEnumerable<AddressPart> | addressParts | Список объектов типа AddressPart |
AddressPart
Тип данных | Параметр | Описание |
---|---|---|
Int | level | Уровень части адреса по ФИАС |
String | name | Наименование части адреса |
String | type | Наименование типа части адреса |
String | shortType | Сокращенное наименование типа части адреса |
String | fiasGuid | Уникальный идентификатор адресного объекта по ФИАС |
String | parentFiasGuid | Уникальный идентификатор адресного объекта предка по ФИАС |
String | kladrCode | Код по КЛАДР |
String | oktmo | Код ОКТМО |
Int | centerStatus | Признак центра – определяет, является ли данный адресный объект центром административно – территориального образования: столицей республики, центром края, области, района и т.п. 0 – объект не является центром административно-территориального образования; 1 – объект является центром района; 2 – объект является центром (столицей) региона; 3 – объект является одновременно и центром района и центром региона. |
AddressObjectResult
Тип данных | Параметр | Описание |
---|---|---|
String | code | Код ошибки или состояния, 1 – успешное выполнение |
String | message | Текст сообщения об ошибке |
AddressObject | addressObject | Объект адреса |
AddressObject
AddressInfoResult
Тип данных | Параметр | Описание |
---|---|---|
String | code | Код ошибки или состояния, 1 – успешное выполнение |
String | message | Текст сообщения об ошибке |
AddressInfo | addressInfo | Дополнительная информация адреса |
AddressInfo
Тип данных | Параметр | Описание |
---|---|---|
String | fiasGuid | Уникальный идентификатор адресного объекта по ФИАС. |
String | parentFiasGuid | Уникальный идентификатор адресного объекта предка по ФИАС. |
String | postIndex | Почтовый индекс |
String | regionCode | Код региона |
String | address | Адрес в административном формате |
String | munAddress | Адрес в муниципальном формате |
String | postAddress | Адрес в формате Почты России |
String | insertDate | Дата добавления объекта в ФИАС |
String | updateDate | Дата обновления объекта в ФИАС |
String | region | Наименование региона |
String | area | Наименование района |
String | munDistrict | Муниципальный район или Городской округ |
String | munSettlement | Поселение |
String | city | Наименование города |
String | place | Наименование населённого пункта |
String | plan | Наименование элемента планировочной структуры |
String | street | Наименование улицы |
String | house | Номер дома |
String | build | Номер корпуса |
String | structure | Номер строения |
String | room | Помещение или комната |
String | stead | Номер земельного участка |
String | oktmo | Код ОКТМО |
String | okato | Код ОКАТО |
String | cadNum | Кадастровый номер |
String | ifnsFl | ИФНСФЛ |
String | ifnsUl | ИФНСЮЛ |
String | terrIfnsFl | Территориальный ИФНСФЛ |
String | terrIfnsUl | Территориальный ИФНСЮЛ |
String | normDoc | Нормативный документ или его guid из ФИАС |
Int | divType | Тип деления по ФИАС 0 – не определено 1 – муниципальное 2 – административное |
String | operStatus | Причина обновления объекта в ФИАС |
String | hStatus | Состояние объекта |
String | estStatus | Признак владения |
String | strStatus | Признак строения |
Int | centerStatus | Признак центра (см. AddressPart) |
HouseResult
Тип данных | Параметр | Описание |
---|---|---|
String | code | Код ошибки или состояния, 1 – успешное выполнение |
String | message | Текст сообщения об ошибке |
IEnumerable<HouseItem> | houseItems | Список объектов типа HouseItem |
HouseItem
Тип данных | Параметр | Описание |
---|---|---|
String | value | Номер дома и/или корпуса и/или строения |
String | postIndex | Почтовый индекс |
String | fiasGuid | Уникальный идентификатор адресного объекта по ФИАС. Может принимать значение null, если такой объект (номер дома) существует только с указанием корпуса и/или строения |
Int | buildCount | Кол-во корпусов |
Int | structureCount | Кол-во строений |
SteadResult
Тип данных | Параметр | Описание |
---|---|---|
String | code | Код ошибки или состояния, 1 – успешное выполнение |
String | message | Текст сообщения об ошибке |
IEnumerable<SteadItem> | steadItems | Список объектов типа SteadItem |
SteadItem
Тип данных | Параметр | Описание |
---|---|---|
String | value | Номер участка |
String | postIndexe | Почтовый индекс |
String | fiasGuid | Уникальный идентификатор адресного объекта по ФИАС. |
RoomResult
Тип данных | Параметр | Описание |
---|---|---|
String | code | Код ошибки или состояния, 1 – успешное выполнение |
String | message | Текст сообщения об ошибке |
IEnumerable<RoomItem> | roomItems | Список объектов типа RoomItem |
RoomItem
Тип данных | Параметр | Описание |
---|---|---|
String | value | Номер помещения / квартиры |
String | postIndex | Почтовый индекс |
String | fiasGuid | Уникальный идентификатор адресного объекта по ФИАС. |
КЛАДР → ФИАС → ГАР
В России единый справочник адресов ведет Налоговая служба. Адреса из муниципальных образований по всей стране стекаются в налоговую, где их записывают в специальную базу.
Налоговая служба предоставляет справочник адресов всем желающим в виде выгрузок. Есть три разных формата выгрузок:
КЛАДР. Самый старый формат. Больше не принимается гос. органами, но по-прежнему выгружается. Включает только административно-территориальное деление.
ФИАС. Основной формат до августа 2021 года. Больше не выгружается. Включает только административно-территориальное деление.
ГАР. Основной формат с сентября 2021 года. Включает муниципальное и административно-территориальное деление.
«Дадата» работала на основе выгрузки ФИАС, но в октябре 2021 перешла на ГАР. При этом используется только административно-территориальное деление. Формат данных, которые отдает «Дадата», при этом не изменился.
Муниципальное деление поддержим в 2022 году.
Посмотреть адреса в ГАР можно на сайте налоговой.
ФИАС ID и ГАР ID
Чтобы уникально идентифицировать каждый адрес в справочнике, налоговая назначает ему ID. Например, у адреса «г Москва, ул Сухонская» такой идентификатор (этот формат называется GUID):
95dbf7fb-0dd4-4a04-8100-4f6c847564b5
В ГАР идентификаторы в формате GUID сохранились без изменений (теперь они называются Object GUID), но дополнительно к ним добавились целочисленные идентификаторы (Object ID). Например, у адреса «г Москва, ул Сухонская» теперь два идентификатора — один GUID (как был в ФИАС) и один ID (целочисленный):
95dbf7fb-0dd4-4a04-8100-4f6c847564b5 1404570
«Дадата» пока продолжит использовать идентификатор в формате GUID. Целочисленные идентификаторы возможно добавим в 2022 году.