Имя: Пароль:
1C
 
Как в 1С получить данные из Яндекс.
0 ЭЦ
 
13.04.17
09:46
Господа !

Нужно в 1с 8.3 организовать возможность получать географические координаты точки по адресу из Яндекса или Google.
Аналогично тому как это делается в навигаторах.

Прошу подсказать какие есть пути для решения этой задачки.
С какой стороны к ней подойти.

Заранее благодарю за ценные советы.
1 pablo_escobar
 
13.04.17
09:51
Читайте описание api яндекс карт. Примеры есть на инфостарте.
2 Numerus Mikhail
 
13.04.17
09:58
http запрос на апи геокодера яндекс
3 ЭЦ
 
13.04.17
10:28
Про http запрос почитал - все понятно.
Не понятно как получить результат в 1С.
4 rmil
 
13.04.17
10:34
Ответ в виде xml файла. Разбираешь этот файла.
5 Numerus Mikhail
 
13.04.17
10:40
Ответ или в Json или XML
Если уж совсем туго пойдет, могу готовый код скинуть
6 Юрий Лазаренко
 
13.04.17
10:43
&НаСервереБезКонтекста
Функция КоординатыПоАдресу(Адрес)
    
    АдресСервера = "geocode-maps.yandex.ru";
    ПутьНаСервере = "/1.x/?geocode=" + Адрес + "&results=1";
    Попытка
        ССЛ = Новый ЗащищенноеСоединениеOpenSSL;
        ИмяВыходногоФайла = ПолучитьимяВременногоФайла();
        Соединение          = Новый HTTPСоединение(АдресСервера,,,,, 5, ССЛ);
        Соединение.Получить(ПутьНаСервере, ИмяВыходногоФайла);
        ЗапросТекстовыйДокумент = Новый ТекстовыйДокумент;
        ЗапросТекстовыйДокумент.Прочитать(ИмяВыходногоФайла);
        ТекстОтвета = ЗапросТекстовыйДокумент.ПолучитьТекст();
    Исключение
        //СоздатьСообщениеОбОшибке(РезультатВыполнения, "Загрузка звонков МТС", "Ошибка при выполнении запроса к API: " + ОписаниеОшибки());
    КонецПопытки;
    ПозицияНачала = Найти(ТекстОтвета, "<pos>");
    ПозицияКонца = Найти(ТекстОтвета, "</pos>");
    Если ЗначениеЗаполнено(ПозицияНачала) И ЗначениеЗаполнено(ПозицияКонца) Тогда
        ПозицияНачала = ПозицияНачала + 5;
        Координаты = Сред(ТекстОтвета, ПозицияНачала, ПозицияКонца - ПозицияНачала);
        Координаты = СтрЗаменить(Координаты, " ", Символы.ПС);
        Возврат Координаты;
    Иначе
        Возврат "";
    КонецЕсли;
    
КонецФункции
7 ЭЦ
 
13.04.17
10:43
Код былобы не плохо.
Не догоняю в каком виде я получу ответ в 1C.
Неужели в виде файла?
8 Юрий Лазаренко
 
13.04.17
10:44
В (6) достаточно тупой вариант - парсит ответ как текст, но в общем-то работает.

Не благодарите.
9 ЭЦ
 
13.04.17
10:46
(6) За это спасибо - щас спробую
10 ЭЦ
 
13.04.17
10:47
(8) Ну пока хоть так.
Хотя конечно лучше бы без файлов обойтись
11 Numerus Mikhail
 
13.04.17
10:49
Как-то так. Не помню уже зачем обрезал ответ сервера, мб это и не надо. В результате у тебя получается распарсенный джсон.

Процедура ПолучитьАдрес(Элемент)
    Параметры = Новый Структура;
    Параметры.Вставить("geocode", "");
    Параметры.Вставить("kind", "");
    Параметры.Вставить("results", "3");
    Параметры.Вставить("format", "json");

    Сервер = "geocode-maps.yandex.ru";
    Ресурс = "1.x/?";
    
    Параметры.geocode = "Большой+Сампсониевский+Проспект+дом+28"; //Это адрес
    Геолокация = ВыполнитьЗапрос(Сервер, Ресурс, Параметры);

    
КонецПроцедуры


Функция ВыполнитьЗапрос(Сервер, Знач Ресурс, Параметры)
    
    
    Для каждого Стр из Параметры Цикл
        Ресурс = Ресурс + Стр.Ключ + "=" + Стр.Значение + "&";
    КонецЦикла;
    
    Ресурс = Лев(Ресурс,СтрДлина(Ресурс)-1);
    
    SSL    = Новый ЗащищенноеСоединениеOpenSSL;
    HTTPConnect = Новый HTTPСоединение(Сервер,,,,,5,SSL);
    HTTPЗапрос  = Новый HTTPЗапрос(Ресурс);
    HTTPЗапрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36");
    
    ОтветСервера = HTTPConnect.Получить(HTTPЗапрос);
    РезультатЗапроса = ОтветСервера.ПолучитьТелоКакСтроку();
    Если Найти(РезультатЗапроса, "/**/id") = 1 Тогда
        Пока Лев(РезультатЗапроса, 1) <> "{" Цикл
            РезультатЗапроса = Сред(РезультатЗапроса, 2);
        КонецЦикла;
        РезультатЗапроса = Лев(РезультатЗапроса, СтрДлина(РезультатЗапроса) - 2);
    КонецЕсли;
    
    Попытка
        Чтение = Новый ЧтениеJSON;
        Чтение.УстановитьСтроку(РезультатЗапроса);
        СтрОтвет = ПрочитатьJSON(Чтение);
        Чтение.Закрыть();

        HTTPConnect = Неопределено;
        HTTPЗапрос  = Неопределено;
        Возврат СтрОтвет;
        
    Исключение
        Сообщить("Ошибка чтения JSON: " + ОписаниеОшибки());
    КонецПопытки;
КонецФункции
12 Юрий Лазаренко
 
13.04.17
11:03
(10) Без файлов можно, надо получать тело HTTP-ответа как строку.

В СП написано:
HTTPОтвет (HTTPResponse)
ПолучитьТелоКакСтроку (GetBodyAsString)
Синтаксис:
ПолучитьТелоКакСтроку(<Кодировка>)

Возвращаемое значение:
Тип: Строка; Неопределено.
Неопределено - если при вызове методов ОтправитьДляОбработки или Получить был установлен параметр <ИмяВыходногоФайла>.
Описание:

Получает тело объекта как строку.
13 ЭЦ
 
13.04.17
11:09
(6) - проверил - все зашибись
14 ЭЦ
 
13.04.17
11:10
Щас 11 попробую
15 Юрий Лазаренко
 
13.04.17
11:10
ССЛ = Новый ЗащищенноеСоединениеOpenSSL;
Соединение = Новый HTTPСоединение("geocode-maps.yandex.ru",,,,,5, ССЛ);
Запрос    = Новый HTTPЗапрос("/1.x/?" + Адрес + "&results=1";
Ответ = Соединение.Получить(Запрос);
ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();

Примерно так без файла.