ФИАС и семь смертных граблей разработчика

    Чтобы нормально работать с почтовыми адресами, сайты подключают справочник адресов налоговой службы (ФИАС). На dadata.ru это сделали уже пять тысяч интернет-магазинов, CRM и стартапов.

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





    1. Почтовые индексы ФИАС для доставки посылок


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

    Это не так.

    В ФИАС несколько тысяч неправильных или отсутствующих индексов. Например, поищем на fias.nalog.ru адрес «Новосибирская обл, г Новосибирск, ул Зорге, д 56»:


    Индекса нет. Если посмотреть этот же адрес на сайте почты России — увидим индекс:


    К сожалению, данные ФНС расходятся с реальностью и с данными Почты. На форуме Дадаты каждый месяц задают новый вопрос на эту тему.

    Опытные владельцы интернет-магазинов знают про подставу с индексами и дополнительно проверяют индексы ФИАС по базе Почты России. Но и с Почтой не все хорошо: там нет части индексов, которые есть в ФИАС (например, 742602, 103340 и нескольких тысяч других индексов).

    Мы в Дадате работаем над объединенной базой индексов ФИАС и Почты России. Она компенсирует ошибки ведомств и пригодится для доставки писем и посылок. Планируем выпустить до конца года.

    2. Код КЛАДР как идентификатор адреса до дома


    Разработчики используют в качестве идентификатора дома код КЛАДР — хотя давно уже существует ФИАС и уникальный код адреса в нем (GUID). Обычно так делают для совместимости со старыми системами.

    Идентифицировать дом кодом КЛАДР — очень соблазнительно с девелоперской точки зрения, но так делать не стоит. Потому что код до дома нестабилен и меняется каждый месяц (примеры не исчерпывающие, просто иллюстрирую проблему):
    Адрес Код КЛАДР в ФИАС от 10.03.16 Код КЛАДР в ФИАС от 18.04.16
    г Казань, ул Космонавтов, д 12 1600000100006330009 1600000100006330082
    г Нижний Новгород, ул Панфиловцев, д 4Б 5200000100008060003 5200000100008060018
    г Самара, поселок Мехзавод, кв-л 16-й, д 7 6300000103700170018 6300000103700170043

    Надежнее для идентификации адреса использовать код КЛАДР улицы и домовую часть адреса: 160000010000633, д 12. А еще лучше вместо кода КЛАДР сохранять ФИАС-код улицы.

    3. Код ФИАС как идентификатор адреса до дома


    Идентифицировать адрес до дома с помощью кода ФИАС — тоже не лучшая идея.

    Кодом ФИАС часто обозначают не отдельный дом, а диапазон домов, например «1–10». Разумеется, у всех домов внутри диапазона будет один и тот же код. Если дом исходно был в составе диапазона, а потом вылез в отдельную запись — его код изменится:
    Адрес Код ФИАС диапазона, ФИАС от 10.03.16 Код ФИАС дома, ФИАС от 18.04.16
    Московская обл, Истринский р-н, с Павловская Слобода, ул Дзержинского, д 1 720b25da-f43e-4204-9013-3cb06be3e9e4
    диапазон домов 1–6
    5bbc0463-ffc4-4d8f-bc5f-632c46eeedca
    г Волгоград, ул им Пархоменко, д 33 44de3bc5-a650-4f77-b19a-7a12bb619c21 диапазон домов 15–35, нечётные 98216a50-2c52-4b0c-8864-a19dc7a30a73
    г Ижевск, ул Удмуртская, д 267 к 3 92ff5f38-01fb-42e6-97d6-a95f541644f4
    диапазон домов 261–277, нечётные
    ac8015c8-0e73-442d-a6aa-427f2e973ec5

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

    4. Адрес одной строкой — вместо ФИАС-кода


    Если хранить адрес одной строкой, то со временем база заполнится записями разного формата. Типа «Урюпинск, проспект Ленина» и «Урюпинск, пр-кт Ленина».

    Это происходит потому, что формат записей в ФИАС все время меняется:

    1. Смена типа улицы:
    г Обнинск ул Ленина → пр-кт Ленина
    Тюменская обл, г Ишим, линия 5-я → ул 5-я линия

    2. Переподчинение (город стал микрорайоном или улица переехала из города в поселок):
    г Самара, ул Симферопольская → г Самара, п Управленческий, ул Симферопольская

    3. Переименование (или исправление по мелочи):
    г Красноярск, ул им Академика Вавилова → ул Академика Вавилова
    Чеченская Респ, Итум-Калинский р-н, село Гучум-Кала → село Гучум-Кали
    Ямало-Ненецкий АО, г Губкинский, мкр 12-й → мкр 12

    Поэтому в дополнение к адресу одной строкой хорошо сохранять ФИАС-код улицы.

    5. Дома только из ФИАС


    Бывает, что разработчики ограничивают ввод дома только домами из ФИАС. Это парадоксально приводит одновременно к нехватке и избытку информации:

    В ФИАС домов не хватает
    Недавний пример:
    Московская обл., г. Балашиха, Горенский б-р, д. 3 (на карте).

    В ФИАС дома 3 нет, зато есть 3 к А.

    А иногда их слишком много
    В ФИАС есть фальшивые «дома» с литерами, которых в реальной жизни нет (или есть, но радости от них никакой это будка трансформаторная).
    г. Санкт-Петербург, ул. Кораблестроителей
    дом 38к3
    дом 38к3 литер А
    дом 38к3 литер Т

    Лучше не ограничивать ввод дома, а предлагать человеку дома из ФИАС и разрешать ввести свой вариант (в Подсказках делаем именно так).

    6. Поселки и улицы только из ФИАС


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

    Мы в Дадате собираем такие адреса от пользователей и ведем их как дополнительный справочник к ФИАС, чтобы помогать пользователям вводить несуществующие в ФИАС адреса.

    7. Форма ввода адреса по структуре ФИАС


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

    Например, интернет-магазин Почты России:


    Как, вы еще не помните наизусть свой индекс?!

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

    Вывод


    Я тоже когда-то думала, что с помощью ФИАС избавлюсь от проблем с вводом адресов раз и навсегда. Но у ФИАС есть свои проблемы: прыгучие идентификаторы, кривые индексы и забытые адреса.

    Чтобы облегчить себе жизнь и не наступать на известные грабли:
    • Используйте код ФИАС до улицы + дом + квартиру для идентификации адреса.
    • Не ограничивайте ввод домами из ФИАС — разрешайте пользователям вводить свои дома.
    • Дайте пользователям возможность указывать поселки и улицы не из ФИАС.
    • Вводите адреса одной строкой.
    • Если доставляете посылки — проверяйте индексы на Почте и 2ГИС.

    А самый удобный вариант — использовать Подсказки для ввода адреса. В них решены все проблемы, кроме последней — ее планируем закрыть до конца года.

    HFLabs

    44,00

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

    Поделиться публикацией
    Комментарии 15
      +3
      Насколько я знаю, адресного стандарта у нас в стране всё ещё нет. Банки обязаны работать с ФИАС, страховые с КЛАДР (какие-то там загоны общества страховщиков, которое проставляет коэффициенты для ОСАГО/КАСКО), Почта с собственной базой, а все остальные с монстрами, слепленными из десяти источников.

      Ситуация с отсутствием индексов в базе Почты выглядит совершенно фантастически. Это вообще как? Туда посылки доставляются? :)
        +1
        Описана ситуация с отсутствием индекса в базе ФИАС, в базе Почты индекс есть.
          +2
          Чем опасна? Мне казалось, что если просто не указать индекс, то Почта откуда-то из своих недр его родит в процессе доставки.
          Но в статье есть такое:
          Но и с Почтой не все хорошо: там нет части индексов, которые есть в ФИАС (например, 742602, 103340 и нескольких тысяч других индексов).

          Справится ли Почта с доставкой отправления по индексу, о котором ничего не знает?
            +1

            Я думаю, Почта индекс-то знает. Нет именно связи между индексом и конкретным домом в глобальной базе.


            Посылка будет доставлена по индексу в почтовое отделение — а там дальше почтальон уже разберется.


            Проблема будет как раз при таком подходе:


            Мне казалось, что если просто не указать индекс, то Почта откуда-то из своих недр его родит в процессе доставки.

            Вот именно для этих записей Почта и не сможет "родить индекс".

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

          ЕМНИП, с прошлого лета заполнением ФИАСа занимаются муниципалитеты.
            0
            А ещё в ФИАС(ко) нет городских районов, а названия могут расходиться с написанием, установленным местным законодательством (сокращение и расположение статусной части, имена и звания в названиях, напр. проф./профессора Качалова). Муниципалитеты занимаются ФИАС… уже страшно… нам они присылали данные, некоторые отсканировали текст и прислали дома номер Ю (10) и улицы с опечатками, вручную долго вычищали. И чем непроизносимее название муниципалитета (Пчевжа, Будогощь), тем экзотичнее они выбирали способ. Полной общероссийской базы нет ни у одной из служб, в некоторых регионах у некоторых есть достаточно полные базы, которые с различной степенью успеха мапятся с КЛАДР/ФИАС.
            PS. Хорошо что не занимаюсь уже этим, но организм сам сделал стойку, увидев знакомые буквы.
            PPS. Шутка с базой в гигабайты была оценена ещё в момент запуска, когда для работа обрабатывающего робота использовался маленький SSD. Сейчас туда уже бы не влезло. Понятно что есть diff, но если заново — оно неподъёмно.
              0
              У кого-нибудь есть успешный опыт работы с diff? Я как-то попытался использовать diff но у меня ничего не вышло (я для проверки залил две последовательные базы и diff и у меня получилось, что разница между этими базами существенно больше чем diff), так что приходится каждый раз заново.
                0
                Накатывал diff, а раз в пару месяцев — преобразовывал полный дамп (не сравнивал разницу). Не исключено что написанный тогда робот продолжает это делать и выкладывать «куда следует» до сих пор.
                  0
                  А я решил сравнить, перед тем как попробовать использовать diff и у меня получилось что в diff меньше чем нужно. Так и не понял почему, решил что diff относится к некому подмножеству записей и стал работать с полной.
                    0
                    Мы работаем с полной базой. В ФИАСе и так проблем хватает, решили не усугублять диффами.
                      0
                      Да уж. Кстати, обнаружил странную проблему — у меня загрузка из их dbf в MS SQL Server занимает раз в 20 больше времени, чем для MySQL.

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

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