Имя: Пароль:
1C
 
Подгрузка расстояний между точками из yandex maps
0 yurii-syrkin
 
12.04.15
15:24
Всем доброго времени суток. Понимаю что тема далеко не новая, но тем не менее никак не могу довести до ума данную задачу. Использую API yandex, пробую следующий код:
Попытка    

        //
        //    Открываем страницу
        //
        Internet = ЭлементыФормы.ИнтернетСтраница;
        Internet.Navigate("about:blank");
        
        
        //
        // Делаем паузу
        //
        cmdLine= "ping -n 1 -w " + Формат(1000*3, "ЧГ=0")+" 0.0.0.1";
        WshShell = Новый COMОбъект("WScript.Shell");
        WshShell.Run(cmdLine, 0, -1);
        
        
        //
        // Создаем скрипты
        //
        ТекстСкрипта = "
        | var myMap, route;
        | ymaps.ready(init);
        |     function init () {
        |         m(start,end);
        |     }
        |     function m(start,end){  
        |     ymaps.route([[start], [end]], {}).then(function (route){
        |         $(""#resmarshrut"").append(Math.ceil(route.getLength()/1000))
        |     });
        |       return false;
        |     }
        |     function sd(){
        |     return document.getElementById(""resmarshrut"").innerHTML;
        |}
        |";
        
        
        JQuery =  Internet.document.createElement("SCRIPT");
        JQuery.type="text/javascript";
        JQuery.src = "http://yandex.st/jquery/1.6.4/jquery.min.js";;
        Internet.document.head.appendChild(JQuery);
        
        Yamaps =  Internet.document.createElement("SCRIPT");
        Yamaps.type="text/javascript";
        Yamaps.src = "http://api-maps.yandex.ru/2.0/?load=package.route&lang=ru-RU";;            
        Internet.document.head.appendChild(Yamaps);
        
        Скрипт  =  Internet.document.createElement("SCRIPT");
        Скрипт.type="text/javascript";
        Скрипт.text =  ТекстСкрипта;
        Internet.document.head.appendChild(Скрипт);
        
        //
        // Делаем паузу
        //
        cmdLine= "ping -n 1 -w " + Формат(1000*3, "ЧГ=0")+" 0.0.0.1";
        WshShell = Новый COMОбъект("WScript.Shell");
        WshShell.Run(cmdLine, 0, -1);
        
        
        
        //
        //  Создаем контейнер для загрузки расстоятия
        //
        DIV = Internet.document.createElement("div");
        Internet.document.body.appendChild(DIV);
        DIV.id = "resmarshrut";
        
        cmdLine= "ping -n 1 -w " + Формат(1000*3, "ЧГ=0")+" 0.0.0.1";
        WshShell = Новый COMОбъект("WScript.Shell");
        WshShell.Run(cmdLine, 0, -1);
        
        Internet.Document.parentWindow.eval("m('"+ТочкаА+"','"+ТочкаБ+"')");
        
        //
        // Делаем паузу
        //
        
        ТекДата   =   ТекущаяДата()   ;
        Пока НЕ ТекущаяДата() = ТекДата + 1 Цикл
            
        КонецЦикла;
        cmdLine= "ping -n 1 -w " + Формат(1000*3, "ЧГ=0")+" 0.0.0.1";
        WshShell = Новый COMОбъект("WScript.Shell");
        WshShell.Run(cmdLine, 0, -1);
        Пока Internet.ReadyState < 4 Цикл
            
        КонецЦикла;
        
        // Забераем расстояние
        Растояние = Internet.Document.parentWindow.eval("sd()");
        
        Если ПустаяСтрока(Растояние) Тогда
            //Сообщить("Повторно");
            //
            // Делаем паузу
            //
            ТекДата   =   ТекущаяДата()   ;
            Пока НЕ ТекущаяДата() = ТекДата +1 Цикл
            КонецЦикла;
            cmdLine= "ping -n 1 -w " + Формат(1000*3, "ЧГ=0")+" 0.0.0.1";
            WshShell = Новый COMОбъект("WScript.Shell");
            WshShell.Run(cmdLine, 0, -1);
            
            Растояние = Internet.Document.parentWindow.eval("sd()");
        КонецЕсли;
        
        Если ПустаяСтрока(Растояние) Тогда
            Возврат 0;
        Иначе
            Возврат Растояние;    
        КонецЕсли
    Исключение
        Сообщить("Не удалось подключиться к сервису Яндекс, Попробуйте позже или свяжитесь с администратором " + ОписаниеОшибки());
    КонецПопытки;

Почему-то происходит ошибка на строке Internet.Document.parentWindow.eval("m('"+ТочкаА+"','"+ТочкаБ+"')");
Честно говоря в JavaScript не силён, но могу сказать что этот код работал достаточно долго и не давно начал вылетать с ошибкой
1 yurii-syrkin
 
12.04.15
15:35
Возможно предложите другое решение, самое главное что бы 1) на входе были строковые значения адресов 2) на выходе была длина маршрута, а не длина прямой линии между точками
2 yurii-syrkin
 
12.04.15
15:53
Не уже ли никто не сталкивался? Или все пасху отмечают)
3 quest
 
12.04.15
16:21
полинфостарта завалено работами с картами - поковыряйся там
4 yurii-syrkin
 
13.04.15
07:01
Да, посмотрел на инфостарте действительно много подделок на эту тему, но к сожалению полностью решить свою проблему так и не смог. Упростил немного код:
Попытка        
        Текст = "<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN""
                |""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"">;
                |<html xmlns=""http://www.w3.org/1999/xhtml"">;
                |<head>
                |<meta http-equiv=""Content-Type"" content=""text/html; charset=windows-1251""/>
                |<meta http-equiv=""X-UA-Compatible"" content=""IE=10""/>
                |<script src=""http://api-maps.yandex.ru/2.1/?lang=ru_RU""; type=""text/javascript""></script>
                |<script src=""http://yandex.st/jquery/1.6.4/jquery.min.js""; type=""text/javascript""></script>
                |
                |<SCRIPT type=text/javascript>
                |
                |    ymaps.ready(init);
                |    function init () {
                |        var route = ymaps.route([
                |                        {
                |                            type: 'wayPoint',
                |                            point: """ + Строка(ТочкаА) + """
                |                        },
                |                        {
                |                            type: 'viaPoint',
                |                            point: """ + Строка(ТочкаБ) + """
                |                        }    
                |                                ]).then(
                |    function(route)
                |                    {
                |                        $(""#resmarshrut"").append(route.getHumanLength());
                |                    },
                |    function (error)
                |                    {
                |                        console.log(""Возникла ошибка: "" + error.message);
                |                    }
                |                                        );
                |                }        
                |    function sd()    {
                |         return document.getElementById(""resmarshrut"").innerHTML;
                |                    }
                |</SCRIPT>
                |</head>
                |
                |<body>
                |<div id=""resmarshrut""></div>
                |</body>
                |
                |</html>";
                
        ПолеHTMLДокумента = ЭлементыФормы.ПолеHTMLДокумента;
        ПолеHTMLДокумента.УстановитьТекст(Текст);
        
        Расстояние = ПолеHTMLДокумента.Документ.parentWindow.eval("sd()");
        
    Исключение
        Сообщить("Не удалось подключиться к сервису Яндекс, Попробуйте позже или свяжитесь с администратором " + ОписаниеОшибки());
    КонецПопытки;
5 yurii-syrkin
 
13.04.15
07:04
Хоть убей, валится на строке Расстояние = ПолеHTMLДокумента.Документ.parentWindow.eval("sd()"); говорит мол метод eval не обнаружен. Когда пишу Расстояние = ПолеHTMLДокумента.Документ.parentWindow.sd(); Выдаёт ошибку метод sd() не обнаружен. Все выходные уже убил на этот JavaScript долбанный
6 Новый участник
 
13.04.15
07:54
Яндекс недавно обновил карты, подробности писали на Хабре. Старый сервис перенесли на olв.maps.ya.ru - может и API тоже перенесли.
7 Новый участник
 
13.04.15
07:55
old.maps.ya.ru - правильный адрес, в (6) опечатка.
8 yurii-syrkin
 
13.04.15
07:57
Да, насчет этого я в курсе. Выше указанный код хотя бы в поле мне возвращает это расстояние. Проблема в том что я не могу его от туда забрать из Поля HTML
9 yurii-syrkin
 
13.04.15
07:58
То есть к сервису вообще никаких претензий, он нормально отрабатывает
10 yurii-syrkin
 
13.04.15
08:17
Сейчас наконец добился что ПолеHTMLДокумента.Документ.parentWindow.sd() отрабатывает без ошибок, только возвращает почему-то COMОбъект. Разворачиваю через + во всех свойствах ошибка чтения
11 yurii-syrkin
 
13.04.15
10:57
Ну ребята, немножко же осталось. Что делать с этим комобъектом? Может как то сделать так что бы эта функция число вернула?
12 yurii-syrkin
 
13.04.15
12:53
Ничего не помогает, ни return route.getHumanLength() ни return document.getElementById(""resmarshrut"").innerHTML;
13 yurii-syrkin
 
13.04.15
12:53
Всё равно какой то непонятный комобъект возвращается
14 yurii-syrkin
 
13.04.15
12:53
Что с ним делать?
15 yurii-syrkin
 
13.04.15
13:31
Что я здесь вообще делаю
16 Тактик
 
13.04.15
14:34
(15) Могу тебе только посочувствовать.

Ко мне недавно тоже обращались - скрип один день работает, в другой не работает.

В чем дело я так и не разобрался.
17 yurii-syrkin
 
13.04.15
15:41
Не, у меня всё-таки получилось. В скрипте значение передаю в контейнер. Выполняю скрипт и забираю из контейнера без всяких вызовов функций просто:
Расстояние =  ПолеHTML.Документ.getElementById("resmarshrut").innerHTML
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший