Нормализация адресов с помощью сервиса DaData.ru

09.03.17

Интеграция - WEB-интеграция

Вариант решения проблемы нормализации адресов с помощью стороннего сервиса DaData.ru

Наверное, каждый программист рано или поздно сталкивается с пробемой нормализации адресов, которые были введены пользователями в произвольном или "частично произвольном" формате. И здесь нет какой-либо серебряной пули, люди пишут множество различных проверок, замен подстрок и т.д., в конце концов, можно отредактировать записи вручную или заставить пользователей это сделать. Но если количество адресов достаточно большое и измеряется десятками и сотнями тысяч становится совсем грустно... Как один из вариантов решения данной проблемы - использование сторонних сервисов (например, Яндекс Геокодер и прочие). В нашем случае, был выбран сервис DaData.ru по причине его тесной связи с КЛАДР и ФИАС, кроме того, сервис показал хорошие результаты - из примерно 84 000 адресов, около 4 000 были помечены как требующие ручной проверки, из них 20% были корректными, а остальные, в большинстве случаев, были заполнены изначально неправильно (например, указан только город  и всё).

Единственный существенный недостаток сервиса - то, что он платный, стоимость стандартизации одного адреса составляет 5-10 коп. (https://dadata.ru/pricing/), 100 адресов даются бесплатно после регистрации. Важное уточнение - стандартизируются только российские адреса.

DaData имеет очень простой в использовании API - https://dadata.ru/api/clean/ .

Первое, что нужно сделать - зарегистрироваться в сервисе и получить API-Ключ и Секретный ключ. 

Весь код нормализации адресов:

Процедура НормализоватьАдреса()
	КлючиДоступа = Новый Структура;
	КлючиДоступа.Вставить("APIКлюч"      , "<Ваш API-Ключ>");
	КлючиДоступа.Вставить("СекретныйКлюч", "<Ваш Секретный ключ>");
	
	ТаблицаДанных = ПолучитьСтруктуруТаблицыАдресов();
	
    // заполнение таблицы исходными адресами
	ДобавитьАдресДляНормализации(ТаблицаДанных, "мск сухонска 11/-89");
	ДобавитьАдресДляНормализации(ТаблицаДанных, "москва Сухонская улица 11 89");
	
	НормализоватьАдресаТаблицы(ТаблицаДанных, КлючиДоступа);
    // TODO: дальнейшая работа с ТаблицаДанных
КонецПроцедуры


Функция ПолучитьСтруктуруТаблицыАдресов()
	ТаблицаДанных = Новый ТаблицаЗначений;
	ТаблицаДанных.Колонки.Добавить("ИсходныйАдрес");
	
	// Поля таблицы, совпадающие по имени с полями ответа сервиса.
	ТаблицаДанных.Колонки.Добавить("result");                   // Нормализованный адрес
	ТаблицаДанных.Колонки.Добавить("postal_code");              // Индекс
	ТаблицаДанных.Колонки.Добавить("region_with_type");         // Регион
	ТаблицаДанных.Колонки.Добавить("city_with_type");           // Город
	ТаблицаДанных.Колонки.Добавить("settlement_with_type");     // Населенный пункт
	ТаблицаДанных.Колонки.Добавить("city_district_with_type");  // Район
	ТаблицаДанных.Колонки.Добавить("street_with_type");         // Улица
	ТаблицаДанных.Колонки.Добавить("house");                    // Дом
	ТаблицаДанных.Колонки.Добавить("flat");                     // Квартира
	ТаблицаДанных.Колонки.Добавить("qc");                       // Код проверки	 
	
	Возврат(ТаблицаДанных);
КонецФункции

Процедура ДобавитьАдресДляНормализации(ТаблицаДанных, Адрес)
	Строка = ТаблицаДанных.Добавить();
	Строка.ИсходныйАдрес = Адрес;
КонецПроцедуры

Процедура НормализоватьАдресаТаблицы(ТаблицаДанных, КлючиДоступа)
	Для Каждого СтрокаАдреса Из ТаблицаДанных Цикл 
		ОтветСервиса = ЗапросСервисаНормализации(СтрокаАдреса.ИсходныйАдрес, КлючиДоступа);
		
		Чтение = Новый ЧтениеJSON;
		Чтение.УстановитьСтроку(ОтветСервиса);
		Данные = ПрочитатьJSON(Чтение)[0];
		Чтение.Закрыть();
		
		ЗаполнитьЗначенияСвойств(СтрокаАдреса, Данные);
	КонецЦикла;
КонецПроцедуры
	
Функция ЗапросСервисаНормализации(Адрес, КлючиДоступа)
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Content-Type" , "application/json");
	Заголовки.Вставить("Authorization", "Token " + КлючиДоступа.APIКлюч);
	Заголовки.Вставить("X-Secret"     , КлючиДоступа.СекретныйКлюч);
	
	Запрос = Новый HTTPЗапрос("/api/v2/clean/address", Заголовки);
	Запрос.УстановитьТелоИзСтроки("[""" + Адрес + """]", КодировкаТекста.UTF8, 
								  ИспользованиеByteOrderMark.НеИспользовать);
	Соединение = Новый HTTPСоединение("dadata.ru", 443,,,,,
	                                  Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено),);
	Ответ = Соединение.ОтправитьДляОбработки(Запрос);
	ОтветСервера = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
		
	Возврат(ОтветСервера);
КонецФункции

Приведенный код будет работать на платформе 8.3.6 и более, поскольку в нем применены функции для работы с JSON (http://v8.1c.ru/o7/201410json/). Если версия платформы меньше - нужно использовать сторонний парсер.

Описание работы кода:

Основная функция в которой происходит заполнение таблицы адресов и их нормализация - НормализоватьАдреса.

Создается таблица значений, в которой будут хранится исходные и обработанные адреса  (функция ПолучитьСтруктуруТаблицыАдресов). Следует заметить, что в эту таблицу можно добавить дополнительные поля, имена которых совпадают с именами свойств возвращаемого JSON-объекта - https://dadata.ru/api/clean/#response , а данных в ответе очень много, вплоть до площади квартиры и ее стоимости.  

Далее, с помощью процедуры ДобавитьАдресДляНормализации заполняем таблицу исходными адресами.

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

Для каждой строки, указанной в таблице делается POST-запрос (https://dadata.ru/api/v2/clean/address) , в заголовках указываются ключи доступа, в теле запроса - исходный адрес, а в качестве результата сервис возвращает JSON-массив с одним элементом, в свойствах которого содержится вся необходимая информация.

Вот и всё. За бортом остались: обработка всевозможных ошибок, хранение адресов.

Адреса КЛАДР ФИАС

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

Сайты и интернет-магазины WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    15981    13    18    

13

Интеграция 1С — Битрикс24. Обмен задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (8.3.18.1289). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    17977    9    15    

13

Интеграция с сервисом vetmanager

WEB-интеграция Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    16509    42    49    

23

Модуль для обмена "1С:Предприятие 8. УАТ. ПРОФ" с FortMonitor

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    12927    31    8    

11

Интеграция с Onliner.by API

WEB-интеграция Прайсы Платформа 1С v8.3 1С:Управление торговлей 11 Беларусь Платные (руб)

Расширение для добавления товаров, обновления цен на площадку Onliner.by.

8160 руб.

21.11.2019    16934    6    5    

9

Драйвер облачной кассы для Бизнес.РУ Чеки

ККМ WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Универсальный драйвер для фискализации чеков для сервиса Бизнес.РУ. Чеки (https://online-check.business.ru/). Работает с любой кассой, подключенной к сервису, в том числе и без физической кассы (Аренда облачной ККТ в датацентре). Принцип работы аналогичен наличию физической кассы, подключенной к рабочему месту 1С. Фискализация выполняется с любого рабочего места через интернет. Нет ограничений на количество рабочих мест, касс, компьютеров. Поддерживает печать с нескольких рабочих мест на одну кассу. Работает в любой операционной системе (Windows, Linux) и в любом клиенте (Тонкий, Толстый, Web, Мобильный клиент).

6000 руб.

03.06.2021    13098    10    0    

7

Contragent+ 9.1 для 1С 8.2/8.3

Обмен с ГосИС Взаиморасчеты WEB-интеграция Платформа 1С v8.3 Платформа 1C v8.2 Конфигурации 1cv8 Платные (руб)

Универсальная обработка для экспресс-регистрации новых и обновления реквизитов существующих элементов справочников «Контрагенты» & «Организации» по данным Федеральной Налоговой Службы РФ (ЕГРЮЛ&ЕГРИП). Минимизация ручного ввода и соответствие данных 1С учредительным сведениям юр. лиц & ИП.

3600 руб.

13.12.2012    92268    175    308    

252

Мобильная торговля для Android

Розничная торговля WEB-интеграция Мобильная разработка Мобильная платформа Управленческий учет Платные (руб)

Сис­те­ма поддержки мо­биль­ной тор­гов­ли это про­грам­м­ный ком­плекс, раз­ра­бо­тан­ный для ав­то­ма­ти­за­ции ра­бо­ты тор­го­вых пред­ста­ви­те­лей, за­ни­ма­ю­щих­ся сбо­ром за­ка­зов на смартфонах в точ­ках роз­нич­ной тор­гов­ли, про­да­жей то­ва­ра с ко­лес и мер­чен­дай­зин­гом.

4800 руб.

19.02.2008    42171    23    24    

40
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Ivon 674 15.03.17 11:43 Сейчас в теме
2. EasyWay 15.03.17 14:06 Сейчас в теме
(1) - да, но вообще нет.
Яндекс плохо дружит с "лишней" информацией в адресе - всякие "домофоны", "этажи" и прочее, не являющееся географическими именованиями.
Дадата в этом смысле более интеллектуальна.
3. asher72 47 17.11.18 16:15 Сейчас в теме
Запрос = Новый HTTPЗапрос("/api/v2/clean/address", Заголовки); А можно спросить. какой адрес писать для проверки организаций по ИНН?
4. CaSH_2004 372 28.05.19 22:16 Сейчас в теме
Делал подобное у себя в городе Краснодаре для крупной фирмы доставки воды, столкнулись с тем что многих улиц просто нет в КЛАДР даже в новом (на тот момент был он). Интересно как DaData.ru решит данный вопрос? И как вообще такое возможно? Благодаря тому что в 1С возможно добавить недостающие улицы получилось сделать контроль.
Проверку заведенных и новых при добавлении решил написав свой механизм проверки адреса который проверяет по цепочке начиная с региона и далее с поиском подходящих вариантов если адрес неверный (в основной поиск улиц в других районах).
Оставьте свое сообщение