Как вычислить расстояние между населенными пунктами в 1С без использования платных API?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Многие разработчики 1С сталкиваются с необходимостью автоматического расчета расстояний между пунктами для логистических задач. При попытке решить этот вопрос часто выясняется, что популярные картографические сервисы (Яндекс, Google) перешли на полностью платную модель с абонентской платой или значительной стоимостью за каждый запрос. Давайте разберем, какие существуют альтернативы и как мы можем реализовать задачу собственными силами.

Анализ ситуации: Почему не стоит полагаться на «бесплатные» коммерческие API?

Рассмотрим реалии: почти все публичные картографические сервисы рано или поздно вводят жесткие лимиты. Даже если сервис кажется бесплатным на старте, при увеличении количества запросов из системы 1С (например, при расчете маршрутов для сотни машин ежедневно) расходы становятся заметными. Поэтому оптимальным вариантом является использование решений, основанных на открытых данных, где мы можем контролировать инфраструктуру самостоятельно.

Решение 1: Использование Open Source Routing Machine (OSRM)

OSRM — это мощный движок для построения маршрутов, работающий на данных OpenStreetMap (OSM). Основное его преимущество для нас заключается в том, что его можно развернуть на собственном сервере. Это означает, что после настройки инфраструктуры мы получаем неограниченное количество запросов без какой-либо оплаты за каждый из них.

Разберем этапы реализации:

  1. Развертывание сервера: Нам потребуется сервер под управлением Linux, на котором будет установлен движок OSRM. Мы скачиваем карту интересующего нас региона в формате .pbf (обычно с сайтов-зеркал OSM) и запускаем обработку данных.
  2. Взаимодействие из 1С: Платформа 1С может легко взаимодействовать с запущенным локальным сервисом через стандартные HTTPСоединение или HTTPЗапрос. Сервис OSRM возвращает данные в формате JSON, которые мы парсим стандартными средствами 1С (объект ЧтениеJSON).
  3. Геокодирование: Важно понимать, что для работы OSRM нужны координаты (широта и долгота). Если в нашем справочнике 1С есть только названия городов, нам потребуется предварительный этап — геокодирование. Для этого мы можем использовать проект Nominatim, который также работает на открытых данных OSM.

Решение 2: Использование альтернативных движков (Valhalla и GraphHopper)

Если OSRM по каким-то причинам нам не подходит (например, требуется специфический учет типов дорог или весовых ограничений транспорта), рассмотрим другие варианты:

Технические нюансы внедрения в 1С

Приступая к разработке, рассмотрим примерный алгоритм взаимодействия с 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, так как они предоставляют бесплатный уровень доступа, который не требует администрирования собственного сервера на старте.

← На главную