Задание: В 1С для каждой торговой точки записан адрес, необходимо по адресу торговой точки получить ее координаты, для последующего отображения на карте.
Решение: Для получения координат ТТ по адресу используется Google Maps Geocoding API, описание и документация здесь:
https://developers.google.com/maps/documentation/geocoding/intro?hl=ru
"Быстрое" решение - использование функций v7plus.dll:
Функция ПолучитьОтветСлужбыГеокодирования(_Адрес)
Попытка
Соединение = СоздатьОбъект("Addin.V7HttpReader");
Соединение.КоличествоПопытокАвторизации = 10;
Исключение
Сообщить("Не удалось создать объект Addin.V7HttpReader!");
Возврат 0;
КонецПопытки;
// можем указать json или xml
Адрес = "http://maps.googleapis.com/maps/api/geocode/xml?address=";
Адрес = Адрес + "ukraine" + "," + СокрЛП(_Адрес);
Адрес = Адрес + "&components=country:UA";
Стр = ""; // сюда вернется xml или json ответ сервера, который
Попытка
Соединение.Получить(Адрес, Стр, 2); //строка
Исключение
Сообщить("Неудачная попытка соединения.");
КонецПопытки;
Возврат стр;
КонецФункции
"Быстрое" решение было рабочим, однако, периодически ответ сервера усекался до 1-2 килобайт. При этом если строку запроса вставить в браузер - всегда возвращается нормальный ответ.
Оказалось, проблема известная, рассматривалась неоднократно:
1.
V7Plus не полностью выкачивает страничку
"AddIn.V7HttpReader прекрасно работает с любыми страницами и качает всю
как надо. Проблема в самих страницах, которые не отдают заголовок
"Content-length". Поэтому по-умолчанию используется 1Кб."
2.
V7HttpReader метод получить файл
"С помощью метода ПолучитьКакФайл пытаюсь с сайта выгрузить файл xml нужного формата. Проблема - файл не загружается полностью. ... Пробовал по всякому и через ПолучитьКакСтроку и с циклом после получения (типа для докачивания, если оно в фоне).
Все-равно файл загружается не полностью. Если через браузер все скачивается без проблем."
"Это не работает, когда динамически генерируется страница через
пост-запрос. ПолучитьКакФайл работает для скачивания ТОЛЬКО статического
содержимого."
И приводится код решения:
Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.language = "vbscript";
x = CreateObject("Microsoft.XMLHTTP");
x.Open("GET", АдресСтраницы, 0,"","");
x.Send();
s = CreateObject("ADODB.Stream");
s.Mode = 3;
s.Type = 1;
s.Open();
Скрипт.AddObject("s",s);
Скрипт.AddObject("x",x);
Скрипт.Eval("s.Write(x.responseBody)");
s.SaveToFile(ИмяФайлаЗагрузки, 2);
3. Наиболее подробно и полно вопрос рассматривается здесь:
Мои опыты чтения динамических WEB-страниц
- Вариант 1-5 - различные модификации использования V7HttpReader, и делается вывод, что внешняя компонента v7plus.dll и ее объект AddIn.V7HttpReader не годятся для чтения динамических WEB-страниц.
- Вариант 6: ФС.КопироватьФайл(Адрес,Результат) - нерабочий
- Вариант 7: WinHttp.WinHttpRequest.5.1
- Вариант 8: InternetExplorer.Application
- Вариант 9. MSXML2.XMLHTTP
- Вариант 10. WinHttp.WinHttpRequest.5.1 + MSScriptControl
- Вариант 11.MSXML2.XMLHTTP + MSScriptControl + VBScript
- Вариант 12. MSXML2.XMLHTTP (http-test.vbs + WScript.Shell)
- Вариант 13. Microsoft.XMLHTTP+ MSScriptControl+ADODB.Stream
В итоге, пришлось переписать процедуру на вариант с использованием Microsoft.XMLHTTP +
ADODB.Stream + MSScriptControl.ScriptControl.
Код функции под катом: