Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
06 июн 2026, 04:50

Длина маршрута

Автор dimalf72, 28 мая 2026, 17:03

0 Пользователей и 1 гость просматривают эту тему.

dimalf72

Добрый день!
Есть начальный и конечный адрес маршрута. Возможны промежуточные точки. Где и как прописывать Процедуры и Функции чтобы получить длину маршрута?
Перелопатил кучу форумов. Пишем вот такую Процедуру/Функцию и готово. А куда её тыкать, как вызывать, ничего нет. :dfbsdfbsdf:

antoneus

Странные вопросы от программиста 1С. Тыкать её в модуль формы или в общий модуль. Вызывать по кнопке, например.

sali

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

dimalf72

sali, я всё это прекрасно понимаю, но беда в том, что я НИГДЕ не смог найти пример того, в какую точку нужно поставить эту Функцию, что в неё передавать. Просто написана функция, её описание, что она делает, точнее, должна делать, а что, куда и как - тайна покрытая мраком. Это как объяснять пятикласснику, что для решения квадратного уравнения нужно найти дискриминант, но не объяснять что это такое.
Может кто-нибудь показать нормальную функция и объяснить, откуда её вызывать и что в неё передавать? БЛИН! Знал бы сам, не задавал вопрос.

antoneus

Ну начать надо с конкретизации. Адреса - откуда и куда, конкретно (по Москве, по Ростову, по России, по всему миру)? Как добираемся - авто, ж/д, морем?
Есть всякие апи для расчета расстояния (яндекс, 2гис - может быть платно, osm - вроде бесплатно было).

Цитата: dimalf72 от 29 мая 2026, 11:59Просто написана функция

Ну что за функция, давай разбираться.

dimalf72

antoneus, надо по России. Автоперевозки. Яндекс.

antoneus

Матрица расстояний? Что ж всё клещами вытягивать приходится.

dimalf72

antoneus, Матрица расстояний в контексте маршрутизации и логистики. Если Вы об этом. API яндекс карты.

antoneus

То есть, непонятно, как из 1С отправить запрос к api яндекса.
Ответ: через HTTPСоединение.

Сначала переводим адреса в координаты через геокодер.

В документации геокодера:

Цитироватьотправьте запрос: https://geocode-maps.yandex.ru/v1/?apikey=YOUR_API_KEY&geocode=бул+Мухаммед+Бин+Рашид,+дом+1&format=json

Параметры в строке запроса - значит, это GET-запрос.

Создаем соединение (в нём указываем только адрес сервера). В адресе https - значит, нужно добавить защищенное соединение.

СоединениеГеокодер = Новый HTTPСоединение("geocode-maps.yandex.ru",,,,,, Новый ЗащищенноеСоединениеOpenSSL());
Собираем строку запроса. В адресах отправления и прибытия сперва убираем двойные пробелы, потом заменяем пробелы на знак "+".

АдресОтправленияГК = СтрЗаменить(СтрЗаменить(АдресОтправления, "  ", " "), " ", "+");
Ресурс = СтрШаблон("v1/?apikey=%1&geocode=%2&format=json", КлючApi, АдресОтправленияГК);
Запрос = Новый HTTPЗапрос(Ресурс);

Ответ = СоединениеГеокодер.Получить(Запрос);//GET
ОтветСтрокой = Ответ.ПолучитьТелоКакСтроку();
Если Ответ.КодСостояния <> 200 Тогда
    Сообщить(СтрШаблон("Что-то пошло не так. Код состояния: %1, ответ сервера: %2", Ответ.КодСостояния, ОтветСтрокой));
    Возврат
КонецЕсли;

Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ОтветСтрокой);
Результат = ПрочитатьJSON(Чтение);

Как добраться до координат, смотрим здесь. Будет что-то типа

КоординатыОтпр = Результат.response.GeoObjectCollection.featureMember[0].GeoObject.Point.pos;
В отладчике можно поставить точку останова и поковыряться. Координаты будут в виде "25.197300 55.274243".

Аналогично для адреса прибытия. Можно (вернее, нужно) весь код обернуть в функцию и скармливать ей адреса.

Теперь получаем матрицу. Формат запроса здесь. Обязательные параметры - apikey, origins, destinations. Добавим еще mode=truck (грузовая перевозка).

СоединениеМатрица = Новый HTTPСоединение("api.routing.yandex.net",,,,,, Новый ЗащищенноеСоединениеOpenSSL());

КоординатыОтпрДляЗапроса = СтрЗаменить(КоординатыОтпр, " ", ",");
КоординатыПрибДляЗапроса = СтрЗаменить(КоординатыПриб, " ", ",");

Ресурс = СтрШаблон("v2/distancematrix?apikey=%1&origins=%2&destinations=%3&mode=truck", КлючApi, КоординатыОтпрДляЗапроса, КоординатыПрибДляЗапроса);
Запрос = Новый HTTPЗапрос(Ресурс);
Ответ = СоединениеМатрица.Получить(Запрос);

Аналогично расковыриваем ответ. Всего делов.

Код, конечно, не проверял, там небось денег надо заплатить, а денег нет.


Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск