Имя: Пароль:
1C
Веб-мастеринг
Запуск из 1с js скрипта и получение обратно в 1с результата выполнения.
0 EvgKolivagin
 
06.06.22
16:54
Добрый день!

Есть api яндекс карт. С помощью этого api я получаю маршрут пешехода поделенный на отрезки между заданными точками.
Как мне вернуть данные этого маршрута в 1с?

Т.е. есть некая серверная процедура в 1с она должна инициировать построение маршрута через api яндекс, а потом результат построения этого маршрута должн вернуться в эту
серверную процедуру, где далее должен быть обработан.

Как это возможно сделать? Если это вообще возможно...
1 Asmody
 
06.06.22
16:56
казалось бы, при чем тут js?
2 Asmody
 
06.06.22
16:57
В 1С для обращения к всяким веб api есть HTTPСоединение и Ко
3 Выпрь
 
06.06.22
17:00
А зачем на сервере маршрут строить?
В самой задаче маршрутизации главное не маршрут построить, а заказы поделить на рейсы.
У Яндекса кстати есть маршрутизация. Не дёшево конечно
4 EvgKolivagin
 
06.06.22
17:00
(2) Да есть, но обращаясь таким способом я получаю с помощью GET запроса текст html страницы скрипт при этом не выполняется или я не понимаю как этот результат обработать...
5 Выпрь
 
06.06.22
17:01
(4) в соседней ветке селениум рекомендуют
6 Asmody
 
06.06.22
17:01
(4) Потому что надо смотреть на то, что выполняется "под страницей".
У Яндекса все api неплохо документированы.
7 EvgKolivagin
 
06.06.22
17:02
(3) У меня есть координаты точек, мне нужно узнать оптимальное время, которое понадобиться пешеходу на перемещение между этими точками, для этого я пытаюсь использовать api яндекс
8 EvgKolivagin
 
06.06.22
17:04
(6) Как мне под страницу заглянуть?)) js знаю плохо
9 EvgKolivagin
 
06.06.22
17:06
(6) Документацию Яндекс я изучал, но там все примеры заточены на вывод карты с маршрутом на html страницу, с этим я справился, сейчас мне каким- то образом надо возвращать данные о времени между точками маршрута в 1с
10 EvgKolivagin
 
06.06.22
17:11
(5) Я так понял, что селениум там рекомендуют для тестирования и тестирования node.js. Мне же надо как-то результат обычного js скрипта обработать и сделать это в 1с.
11 EvgKolivagin
 
06.06.22
17:14
Я много чего попробовал, но гдавный затык это как инициировать выполнение js скрипта на html странице программно из серверной процедуры 1с.
12 Выпрь
 
06.06.22
17:33
(11) или селениум или напрямую методы апи вызывать
13 Asmody
 
06.06.22
17:37
(11) Ты на 146% уверен, что построением маршрута занимается клиентский код на js?
14 EvgKolivagin
 
06.06.22
17:42
(13) У меня в js вызывается функция api яндекса, которая формирует маршрут, затем в подписке на событие я получаю данные о времени на каждом участке.
15 EvgKolivagin
 
06.06.22
17:44
(13) Вот кусок скрипта с подпиской:

// Подписка на событие готовности маршрута.
    multiRoute.model.events.add('requestsuccess', function() {
        // Массив расстояний
        TimeOnRoute = [];
        
        // Получение ссылки на активный маршрут.
        var activeRoute = multiRoute.getActiveRoute();
        // Получение коллекции путей активного маршрута.
        var activeRoutePaths = activeRoute.getPaths();
        
        // Проход по коллекции путей.
        activeRoutePaths.each(function(path) {
            if (path.properties.get("duration").value != 0){
                TimeOnRoute.push({"document_id": DocumentId});
                TimeOnRoute.push({"distance": path.properties.get("distance").value, "duration": path.properties.get("duration").value});
            }
            
            console.log("Длина пути: " + path.properties.get("distance").text);
            console.log("Время прохождения пути: " + path.properties.get("duration").text);
        });
        
        var JsonString = JSON.stringify(TimeOnRoute);
        
        document.getElementById('result_multi').innerHTML = JsonString;
        
        // Записываем данные о времени на перемещение между точками в файл
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.overrideMimeType("application/json");            
        xmlhttp.open("POST", "http://127.0.0.1/lift_test_2/hs/YaMapHTTP/v1/route", false);
        xmlhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
        xmlhttp.send(JsonString);
    }); // Подписка на событие готовности маршрута.
    multiRoute.model.events.add('requestsuccess', function() {
        // Массив расстояний
        TimeOnRoute = [];
        
        // Получение ссылки на активный маршрут.
        var activeRoute = multiRoute.getActiveRoute();
        // Получение коллекции путей активного маршрута.
        var activeRoutePaths = activeRoute.getPaths();
        
        // Проход по коллекции путей.
        activeRoutePaths.each(function(path) {
            if (path.properties.get("duration").value != 0){
                TimeOnRoute.push({"document_id": DocumentId});
                TimeOnRoute.push({"distance": path.properties.get("distance").value, "duration": path.properties.get("duration").value});
            }
            
            console.log("Длина пути: " + path.properties.get("distance").text);
            console.log("Время прохождения пути: " + path.properties.get("duration").text);
        });
        
        var JsonString = JSON.stringify(TimeOnRoute);
        
        document.getElementById('result_multi').innerHTML = JsonString;
        
        // Записываем данные о времени на перемещение между точками в файл
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.overrideMimeType("application/json");            
        xmlhttp.open("POST", "http://127.0.0.1/lift_test_2/hs/YaMapHTTP/v1/route", false);
        xmlhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
        xmlhttp.send(JsonString);
    });
16 EvgKolivagin
 
06.06.22
17:47
(15) Сорян чет фигня какая-то скопировалась в предыдущем посте

// Подписка на событие готовности маршрута.
    multiRoute.model.events.add('requestsuccess', function() {
        // Массив расстояний
        TimeOnRoute = [];
        
        // Получение ссылки на активный маршрут.
        var activeRoute = multiRoute.getActiveRoute();
        // Получение коллекции путей активного маршрута.
        var activeRoutePaths = activeRoute.getPaths();
        
        // Проход по коллекции путей.
        activeRoutePaths.each(function(path) {
            if (path.properties.get("duration").value != 0){
                TimeOnRoute.push({"document_id": DocumentId});
                TimeOnRoute.push({"distance": path.properties.get("distance").value, "duration": path.properties.get("duration").value});
            }
            
            console.log("Длина пути: " + path.properties.get("distance").text);
            console.log("Время прохождения пути: " + path.properties.get("duration").text);
        });
        
        var JsonString = JSON.stringify(TimeOnRoute);
        
        document.getElementById('result_multi').innerHTML = JsonString;
    });
17 EvgKolivagin
 
06.06.22
17:59
Похоже это ограничение самого api и сохранять данные нельзя. Во всяком случае надо отдельно с яндексом об этом договариваться...

Результаты всех запросов к API должны быть отображены на карте Яндекса. Например, это данные, полученные с помощью сервиса геокодирования или маршрутизации.

Если вам необходимо использовать данные API без отображения на карте, напишите нам.

Спасибо всем кто учавствовал в обсуждении.
18 Гений 1С
 
гуру
06.06.22
21:39
19 Гений 1С
 
гуру
06.06.22
21:43
Попробуй кстати эту: https://infostart.ru/public/877596/
Там что-то про маршруты есть. Я ее использовал для добавления точек на карту.
20 Бабрак Кармаль
 
06.06.22
22:31
(18) Дебилушко, ему это всё на сервере надо
Хахаха, гыгыгы.
21 ДедМорроз
 
06.06.22
22:47
Ну а что мешает на сервере запустить браузер как отдельный процесс,а потом "поохотиться" за данными на странице?
То бишь расширение к браузеру приляпать?
22 EvgKolivagin
 
07.06.22
09:18
(19) Дело в том, что на карту мне не нужно добавлять, мне нужны эти данные для своих вычислений.
23 EvgKolivagin
 
07.06.22
09:20
(21) Выглядит слишком не надежно из-за большого числа промежуточных элементов
24 Garykom
 
гуру
07.06.22
09:32
1. Почитать про лицензию
https://yandex.ru/dev/maps/commercial/
https://yandex.ru/dev/maps/jsapi/doc/2.1/terms/index.html?from=club

2. JS не надо, все делается через HTTPСоединение прекрасно. Сам проверял
25 EvgKolivagin
 
07.06.22
10:20
(24) Через HTTPСоединение вы имеете ввиду это? https://yandex.ru/dev/maps/router/doc/concepts/about.html
26 Бабрак Кармаль
 
07.06.22
10:44
(21) > что мешает на сервере запустить браузер
Здравый смысл.
27 Garykom
 
гуру
07.06.22
10:48
(25) Нет
Строка
<script src="https://api-maps.yandex.ru/2.1/?apikey=ваш API-ключ&lang=ru_RU" type="text/javascript">
получает js файл внутри которого есть нужный new ymaps.multiRouter.MultiRoute(

но если изучить код полученного модуля js от яндекса
то там внутри будут обычные вызовы http запросов

и вот 1С прекрасно может эмулировать эти запросы напрямую

но это не законно на бесплатной версии апи яндекс карт
28 EvgKolivagin
 
07.06.22
10:57
(27) Я так понял, чтобы все было по закону нужно просто докупить отдельный пакет который называется "Матрица Расстояний и Построение Маршрута". Этот пакет позволяет слать HTTP GET запросы и получать данные маршрута. И не нужно с js извращаться.
29 Garykom
 
гуру
07.06.22
11:01
30 Garykom
 
гуру
07.06.22
11:02
(29)+ ну или сразу https://infostart.ru/public/1000836/
31 EvgKolivagin
 
07.06.22
11:41
(30) Спасибо за наводку