Многие разработчики 1С сталкиваются с необходимостью автоматического расчета расстояний между пунктами для логистических задач. При попытке решить этот вопрос часто выясняется, что популярные картографические сервисы (Яндекс, Google) перешли на полностью платную модель с абонентской платой или значительной стоимостью за каждый запрос. Давайте разберем, какие существуют альтернативы и как мы можем реализовать задачу собственными силами.
Рассмотрим реалии: почти все публичные картографические сервисы рано или поздно вводят жесткие лимиты. Даже если сервис кажется бесплатным на старте, при увеличении количества запросов из системы 1С (например, при расчете маршрутов для сотни машин ежедневно) расходы становятся заметными. Поэтому оптимальным вариантом является использование решений, основанных на открытых данных, где мы можем контролировать инфраструктуру самостоятельно.
OSRM — это мощный движок для построения маршрутов, работающий на данных OpenStreetMap (OSM). Основное его преимущество для нас заключается в том, что его можно развернуть на собственном сервере. Это означает, что после настройки инфраструктуры мы получаем неограниченное количество запросов без какой-либо оплаты за каждый из них.
Разберем этапы реализации:
.pbf (обычно с сайтов-зеркал OSM) и запускаем обработку данных.HTTPСоединение или HTTPЗапрос. Сервис OSRM возвращает данные в формате JSON, которые мы парсим стандартными средствами 1С (объект ЧтениеJSON).Nominatim, который также работает на открытых данных OSM.Если OSRM по каким-то причинам нам не подходит (например, требуется специфический учет типов дорог или весовых ограничений транспорта), рассмотрим другие варианты:
Приступая к разработке, рассмотрим примерный алгоритм взаимодействия с API (на примере запроса к OSRM):
// Пример формирования HTTP-запроса в 1С
Сервер = "ваш-сервер-osrm";
АдресРесурса = СтрШаблон("/route/v1/driving/%1,%2;%3,%4?overview=false",
Строка(КоординатыНачала.Долгота), Строка(КоординатыНачала.Широта),
Строка(КоординатыКонца.Долгота), Строка(КоординатыКонца.Широта));
Соединение = Новый HTTPСоединение(Сервер);
Запрос = Новый HTTPЗапрос(АдресРесурса);
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Результат = ПрочитатьJSON(ЧтениеJSON);
// Извлекаем расстояние из структуры JSON
Расстояние = Результат.routes[0].distance;
КонецЕсли;
Важно помнить, что точность расчетов напрямую зависит от качества данных OpenStreetMap в вашем регионе. В крупных городах данные обычно идеальны, тогда как в отдаленных сельских районах могут встречаться разрывы дорожной сети. Рекомендуем перед внедрением оценить покрытие OSM в вашем регионе на официальном сайте проекта.
Мы выяснили, что создание собственной системы маршрутизации требует определенных технических навыков (настройка VPS, работа с JSON в 1С), однако это единственный путь к созданию по-настоящему бесплатного и независимого решения. Если объем запросов в вашей компании небольшой, возможно, имеет смысл начать с использования GraphHopper API, так как они предоставляют бесплатный уровень доступа, который не требует администрирования собственного сервера на старте.