Нормализация адресов с помощью сервиса 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С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

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

5040 руб.

04.05.2021    19121    10    16    

16

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

Подсистема интеграции Amo CRM с 1С: технические требования, порядок работы, возможности, доработки и обновления. Бесплатный период техподдержки - 1 месяц.

60000 руб.

07.05.2019    31955    62    41    

23

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

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

22656 руб.

25.05.2021    13425    37    8    

15

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

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

36000 руб.

03.08.2020    16824    15    19    

15

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

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

12000 руб.

02.02.2021    17056    45    49    

26
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 372 28.05.19 22:16 Сейчас в теме
Делал подобное у себя в городе Краснодаре для крупной фирмы доставки воды, столкнулись с тем что многих улиц просто нет в КЛАДР даже в новом (на тот момент был он). Интересно как DaData.ru решит данный вопрос? И как вообще такое возможно? Благодаря тому что в 1С возможно добавить недостающие улицы получилось сделать контроль.
Проверку заведенных и новых при добавлении решил написав свой механизм проверки адреса который проверяет по цепочке начиная с региона и далее с поиском подходящих вариантов если адрес неверный (в основной поиск улиц в других районах).
Оставьте свое сообщение