Нормализация адресов с помощью сервиса 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-массив с одним элементом, в свойствах которого содержится вся необходимая информация.

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

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

См. также

Оптовая торговля Розничная торговля WEB-интеграция 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Онлайн-заказ - это решение для автоматизации процесса оформления заказов на сайте в торговых организациях. Продукт обеспечивает легкое взаимодействие между компанией и клиентами через веб-интерфейс, интегрированный с 1С:Предприятие. Система позволяет снизить операционные расходы, повысить лояльность клиентов и оптимизировать работу отдела продаж.

57600 руб.

26.11.2024    1235    1    1    

4

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

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

36000 руб.

03.08.2020    18355    20    22    

18

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

Интеграция 1С и Битрикс 24. Разработка имеет двухстороннюю синхронизацию 1С и Bitrix24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (платформа начиная с 8.3.23): 1С:Управление торговлей, 1С:Управление Нашей фирмой 3, 1С:Комплексная автоматизация 2, Объединенное решение: Модуль 1С:CRM 3 (3.0.21.3) +1С:ERP Управление предприятием 2. При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

7200 руб.

04.05.2021    20564    13    19    

18

WEB-интеграция Программист Бизнес-аналитик Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

14400 руб.

20.12.2024    320    2    0    

5

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

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки.

24000 руб.

27.09.2024    2483    1    0    

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