Имя: Пароль:
1C
1С v8
Работа с яндекс картами в 1С
,
0 Iceman_1982
 
24.06.15
13:28
Добрый день, уважаемые знатоки 1С. Передо мной была поставлена задача геокодирования контрагентов по фактическим адресам. Решил воспользоваться яндекс картами. Внедрил следующий функционал:
1. ТекКонтрагент = Ссылка;
    //АдресКонтрагента = Адрес;    
    АдресКонтрагента = УправлениеКонтактнойИнформацией.ПолучитьАдресИзКонтактнойИнформации(ЭтотОбъект.Ссылка,"Фактический");
    
    Если ПустаяСтрока(АдресКонтрагента) Тогда
        Сообщить("Для торговой точк не задан адрес в контактной информации, по которому можно определить координаты");
        Возврат;
    КонецЕсли;
    
    Попытка
        СтруктураОтвета = кпкРаботаСКартами.ПолучитьКоординатыПоЗапросу(АдресКонтрагента);
    Исключение
        Сообщить("Невозможно определить координаты для торговой точки " + СокрЛП(ТекКонтрагент));
    КонецПопытки;
    
    Если Не СтруктураОтвета = Неопределено Тогда                     
        НайденныеКоординаты = СтруктураОтвета.Координаты;
                        
        МассивКоординат = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(НайденныеКоординаты, " ");        
            
        Широта  = МассивКоординат[1];
        Долгота = МассивКоординат[0];
            
        АвтопоискАдрес = СокрЛП(СтруктураОтвета.Область) + ", " + СокрЛП(СтруктураОтвета.НаселенныйПункт) + ", " + СокрЛП(СтруктураОтвета.Улица) + ", " + СокрЛП(СтруктураОтвета.Дом);
        
        ТекстСообщения = "Адрес по справочнику: " + АдресКонтрагента + Символы.ПС +
                         "Адрес, для которого определены координаты: " + АвтопоискАдрес;        
        Сообщить(ТекстСообщения);        
    КонецЕсли; //Если Не СтруктураОтвета = Неопределено Тогда    

2. Функция ПолучитьКоординатыПоЗапросу(Адрес) Экспорт
    
    СтруктураОтвета = Новый Структура;
    СтруктураОтвета.Вставить("Координаты");
    СтруктураОтвета.Вставить("Область");
    СтруктураОтвета.Вставить("НаселенныйПункт");
    СтруктураОтвета.Вставить("Район");
    СтруктураОтвета.Вставить("Улица");
    СтруктураОтвета.Вставить("Дом");     
    
    Сервис = Новый HTTPСоединение("geocode-maps.yandex.ru");
    ИмяФайла = ПолучитьИмяВременногоФайла();     
    //ИмяФайла = "G:\1.xml";     
    
    Сервис.Получить("/1.x/?geocode=" + ПреобразоватьСтрокуВУТФ8(Адрес), ИмяФайла);
    //Сервис.Получить("/1.x/?geocode=" + ПреобразоватьСтрокуВУТФ8(Адрес) + "&key=СюдаНужноВбитьИндивидуальныйКлюч==", ИмяФайла);
    
    //Разбор XML ответа
    StreamXML = New XMLReader;
    StreamXML.OpenFile(ИмяФайла);        
    StreamXML.Read();
    
    //Чтение XML строки
    Пока StreamXML.Read() Цикл
                
        Если StreamXML.NodeType = XMLNodeType.StartElement И StreamXML.Name = "pos" Тогда
            StreamXML.Read();
            СтруктураОтвета.Координаты = Строка(StreamXML.Value);
            
            //конвертируем в NMEA
            СтруктураОтвета.Координаты = КонвертироватьWGS84NMEA(СтруктураОтвета.Координаты);
        КонецЕсли;
        
        Если StreamXML.NodeType = XMLNodeType.StartElement И StreamXML.Name = "AdministrativeAreaName" Тогда
            StreamXML.Read();
            СтруктураОтвета.Область = Строка(StreamXML.Value);            
        КонецЕсли;
        
        Если StreamXML.NodeType = XMLNodeType.StartElement И StreamXML.Name = "LocalityName" Тогда
            StreamXML.Read();
            СтруктураОтвета.НаселенныйПункт = Строка(StreamXML.Value);            
        КонецЕсли;
        
        Если StreamXML.NodeType = XMLNodeType.StartElement И StreamXML.Name = "DependentLocalityName" Тогда
            StreamXML.Read();
            СтруктураОтвета.Район = Строка(StreamXML.Value);            
        КонецЕсли;
        
        Если StreamXML.NodeType = XMLNodeType.StartElement И StreamXML.Name = "ThoroughfareName" Тогда
            StreamXML.Read();
            СтруктураОтвета.Улица = Строка(StreamXML.Value);            
        КонецЕсли;
        
        Если StreamXML.NodeType = XMLNodeType.StartElement И StreamXML.Name = "PremiseNumber" Тогда
            StreamXML.Read();
            СтруктураОтвета.Дом = Строка(StreamXML.Value);            
        КонецЕсли;

        Продолжить;
    КонецЦикла;
    
    StreamXML.Close();
    
    Возврат СтруктураОтвета;
    
КонецФункции

Вначале все работало нормально. По нескольким точкам были получны корректные координаты. Пару дней назад когда попробовал для дальнейше работы получить координаты еще нескольких точек, то результат был отрицательным. Процедура получения координат вылетала на строке StreamXML.Read();

А во временный файл вместо координат возвращался следующий текст
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.6.3</center>
</body>
</html>

Если кто сталкивался с такой проблемой и знает пути решения, поделитесь, если не жалко.
1 arsik
 
гуру
24.06.15
13:29
яндекс мапс перешли на https, пару дней назад
2 Iceman_1982
 
24.06.15
13:31
И как теперь быть? Как в этом случае выглядит подключение?
3 arsik
 
гуру
24.06.15
13:33
HTTPСоединение.Защищенное
4 arsik
 
гуру
24.06.15
13:35
Новый HTTPСоединение(<Сервер>, <Порт>, <Имя пользователя>, <Пароль>, <Прокси>, <Защищенное соединение>)
5 Iceman_1982
 
24.06.15
13:40
Сделал так : Сервис = Новый HTTPСоединение("geocode-maps.yandex.ru",,,,,Истина);

Теперь вылетает на
Сервис.Получить("/1.x/?geocode=" + ПреобразоватьСтрокуВУТФ8(Адрес), ИмяФайла);
6 arsik
 
гуру
24.06.15
13:40
(5) Ошибка то какая?
7 Iceman_1982
 
24.06.15
13:43
Сервис.Получить("/1.x/?geocode=" + ПреобразоватьСтрокуВУТФ8(Адрес), ИмяФайла);

вываливается из функции а результирующий файл ничего не передается вообще, даже ошибки
8 arsik
 
гуру
24.06.15
13:44
"вываливается из функции" - с какой ошибкой?
9 Iceman_1982
 
24.06.15
13:47
Это я немного не прав. Вываливается на StreamXML.Read(), так как результирующий файл вообще пустой.
10 arsik
 
гуру
24.06.15
13:55
(9) Если в браузере забить
https://geocode-maps.yandex.ru/1.x/?geocode="; + ПреобразоватьСтрокуВУТФ8(Адрес)
Что выдаст,
11 arsik
 
гуру
24.06.15
13:57
Наверно вот так надо
Новый HTTPСоединение("geocode-maps.yandex.ru",443,,,,Истина);
12 Iceman_1982
 
24.06.15
14:32
Так не работает. В инете пишут что еще нужно манипуляции с сертификатами проводить
13 arsik
 
гуру
24.06.15
14:37
в 8.1 работает
14 SashaNox
 
05.07.15
21:38
Народ, нужна помощь по этому вопросу, такая же проблема, геокодер стал возвращать такие файлы, раньше делал так:

Соединение = Новый HTTPСоединение(geocode-maps.yandex.ru);
Соединение.Получить("1.x/?geocode=Москва Проспект мира", C:\Users\1\AppData\Local\Temp\v8_1933_f.tmp)

и все было нормально, сейчас пробую так:

Соединение = Новый HTTPСоединение(geocode-maps.yandex.ru,,,,, Истина);
Соединение.Получить("1.x/?geocode=Москва Проспект мира", C:\Users\1\AppData\Local\Temp\v8_1933_f.tmp)

и выдает такую ошибку:

Ошибка при вызове метода контекста (Получить)
Ошибка работы с Интернет:  SSL connect error

Подскажите, что делать?
15 Il19
 
06.07.15
05:32
(14) уже ведь написали в (11) + (12)
по сертификатам можно подглядеть тут: http://catalog.mista.ru/public/79494/
16 ber
 
08.07.15
10:34
Если кому то еще нужно то так работает:
    ssl = Новый ЗащищенноеСоединениеOpenSSL(
    Новый СертификатКлиентаWindows(
    СпособВыбораСертификатаWindows.Выбирать),
    Новый СертификатыУдостоверяющихЦентровWindows());
    Яндекс = Новый HTTPСоединение("geocode-maps.yandex.ru",,,,,,ssl);
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан