При автоматизации логистики в 1С перед разработчиком часто встает задача не просто проложить путь от точки А до точки Б, а составить оптимальный маршрут для водителя, который должен объехать 10–20 адресов за день. Ситуация осложняется лимитами бесплатных сервисов, стоимостью коммерческих решений и необходимостью учитывать специфику дорог РФ (пробки, грузовые каркасы). Разберем по шагам, какие инструменты существуют на рынке и как правильно организовать архитектуру взаимодействия 1С с картографическими сервисами.
Прежде всего проанализируем разницу между двумя типами запросов, которые часто путают. Построение маршрута — это получение геометрии пути для заранее определенной последовательности точек. Оптимизация маршрута (задача коммивояжера или VRP — Vehicle Routing Problem) — это когда сервис сам определяет, в каком порядке лучше объехать точки, чтобы минимизировать пробег или время. Для 1С-разработчика это означает, что нам нужен API, поддерживающий не только route, но и trip (или optimization) сервис.
Если бюджет позволяет, рассмотрим проверенные временем коммерческие решения. Они предоставляют актуальные данные о пробках и дорожных событиях, что критично для крупных мегаполисов.
Для компаний с объемом 100–200 запросов в день и более, желающих уйти от платных подписок, проанализируем вариант развертывания собственного сервера маршрутизации. Это позволит делать неограниченное количество запросов бесплатно.
OSRM (Open Source Routing Machine) — это высокопроизводительный движок на базе данных OpenStreetMap (OSM). Рассмотрим подробнее, как работает плагин trip в OSRM. Он решает задачу коммивояжера с помощью жадной эвристики. Хотя это не всегда дает 100% идеальный результат (так как задача NP-трудная), для 20 точек решение будет очень близким к оптимальному.
Для более продвинутой оптимизации (с учетом временных окон клиентов и нескольких машин) рекомендуется использовать связку OSRM + VROOM. VROOM — это надстройка, которая забирает данные о расстояниях из OSRM и решает сложные логистические задачи оптимизации парка машин.
Разберем эффективную схему взаимодействия 1С с любым API. Вместо того чтобы запрашивать построение полного маршрута для каждой перестановки точек, выясним причину популярности метода Distance Matrix (Матрица расстояний).
Посмотрим на пример логики: если у нас есть 10 точек, мы запрашиваем у API таблицу 10х10, где на пересечении строк и столбцов указано время или расстояние между каждой парой точек. Получив эту матрицу в 1С в формате JSON, мы можем реализовать алгоритм оптимизации локально, не делая лишних платных вызовов к картам.
Пример структуры JSON-запроса к матрице расстояний (на примере абстрактного API):
{
"locations": [
[55.75, 37.61],
[55.80, 37.70],
[55.70, 37.50]
],
"metrics": ["distance", "duration"]
}
Проанализируем программный код для получения данных от сервиса. Мы будем использовать объект HTTPСоединение и ЧтениеJSON. Предположим, мы работаем с собственным сервером OSRM:
// Создаем соединение с сервером OSRM
Соединение = Новый HTTPСоединение("localhost", 5000);
// Формируем строку запроса для сервиса TRIP (оптимизация последовательности)
ЗапросСтрока = "/trip/v1/driving/" + СписокКоординат + "?source=first&destination=last&roundtrip=false";
Запрос = Новый HTTPЗапрос(ЗапросСтрока);
Попытка
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Данные = ПрочитатьJSON(Чтение);
// В Данные.waypoints будет содержаться оптимальный порядок посещения
КонецЕсли;
Исключение
Сообщить("Ошибка связи с сервером маршрутизации");
КонецПопытки;
Адреса или Контрагенты, чтобы не платить за повторный геокодинг одного и того же адреса.truck. Обычный навигатор может проложить путь под знаки, что приведет к штрафам.Выясним, какой вариант лучше подходит под ваши задачи:
Рассмотренные подходы позволяют гибко масштабировать логистическую систему предприятия, начиная от простых курьерских доставок и заканчивая управлением парком крупнотоннажного транспорта.