Как интегрировать OpenStreetMap в 1С для интерактивной работы с маршрутами и геозонами?

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

Интеграция картографических сервисов в 1С становится необходимостью для логистических систем, служб доставки и компаний с развитой сетью филиалов. В современных реалиях использование OpenStreetMap (OSM) является наиболее стабильной и экономически выгодной альтернативой коммерческим API от Яндекс или Google, которые часто меняют условия лицензирования и стоимость использования. Рассмотрим подробнее, как реализовать полноценное интерактивное взаимодействие 1С и OSM. Для решения аналогичных задач на базе картографических сервисов Яндекса можно использовать готовое решение для работы с Яндекс.Картами в 1С.

Архитектура решения: Поле HTML-документа

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

Разберем по шагам принцип работы: 1С хранит в макете или текстовой строке HTML-код, который подключает JS-библиотеки. При открытии формы этот код загружается в поле, инициализируя карту. Важно учитывать версию платформы: в версиях до 8.3.14 использовался движок Internet Explorer, что требовало написания кода на старых стандартах JS. В современных версиях 1С используется Chromium, что позволяет использовать весь потенциал современных скриптов.

Взаимодействие 1С и JavaScript

Самым важным этапом является организация двустороннего обмена данными. Выясним причину, по которой многие разработки работают нестабильно: это неправильная обработка событий. Рассмотрим правильный подход.

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


КомандаJS = "map.setView([" + Формат(Широта, "ЧГ=0") + ", " + Формат(Долгота, "ЧГ=0") + "], 13);";
Элементы.КартаHTML.ИсполнитьJavaScript(КомандаJS);

Передача данных из JavaScript в 1С:
Для обратной связи (например, когда пользователь кликнул на карту или завершил рисование полигона) используется механизм window.external. Мы создаем в JS функцию-обработчик, которая отправляет данные в 1С, где они перехватываются событием ПриНажатии (или специализированными методами уведомления в новых версиях).

Отображение точек и кластеризация

Если нам необходимо отобразить на карте сотни заказов с их номерами, мы столкнемся с проблемой производительности. Посмотрим на пример решения через плагин Leaflet.markercluster. Вместо создания сотен отдельных объектов, мы группируем их в кластеры, которые распадаются при приближении.

Для вывода номера задания прямо на иконке маркера, воспользуемся объектом L.divIcon. Это позволяет использовать стандартные HTML-теги внутри иконки:


var myIcon = L.divIcon({
    className: 'my-div-icon',
    html: "<div style='background-color:red; color:white; padding:2px;'>" + НомерЗадания + "</div>"
});
L.marker([55.75, 37.61], {icon: myIcon}).addTo(map);

Прокладывание маршрутов и работа с зонами

Для реализации логистических задач (прокладывание маршрутов) в OSM обычно не используется сама библиотека Leaflet — она лишь отображает результат. Рассмотрим подробнее движок OSRM (Open Source Routing Machine). Процесс выглядит следующим образом:

  1. 1С собирает координаты точек маршрута в массив.
  2. Массив передается в JS, который делает HTTP-запрос к серверу OSRM.
  3. Сервер возвращает геометрию маршрута (обычно в формате Polyline или GeoJSON).
  4. JS-код на форме 1С отрисовывает эту линию на карте.

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

Геокодирование и поиск адресов

Одной из сложностей OSM является отсутствие встроенного в карту поиска. Для преобразования адреса в координаты мы используем сервис Nominatim. Важно помнить, что публичный сервер Nominatim имеет ограничение: не более 1 запроса в секунду. Если ваша база контрагентов велика, разберем по шагам, как автоматизировать этот процесс:

Создадим регламентное задание в 1С, которое будет порционно (с паузами) отправлять HTTP-запросы к Nominatim, получать JSON с координатами и записывать их в дополнительные реквизиты объектов Контрагенты или АдресаДоставки.


Соединение = Новый HTTPСоединение("nominatim.openstreetmap.org",,,,, 30);
Запрос = Новый HTTPЗапрос("/search?q=" + ТекстАдреса + "&format=json");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
    // Обработка JSON и получение координат [lat, lon]
КонецЕсли;

Преимущества автономности

В отличие от проприетарных систем, интеграция с OSM позволяет организовать полностью оффлайн-работу. Проанализируем ситуацию: если ваша компания работает в закрытой сети без доступа к интернету, вы можете развернуть локальный тайл-сервер и сервер маршрутизации. В этом случае в коде 1С вместо внешних URL будут указаны локальные IP-адреса вашего сервера. Это обеспечивает максимальную безопасность данных и независимость от внешних факторов и санкций.

Подводя итог, можно сказать, что хотя готовые модули могут стоить значительных средств, самостоятельная реализация на базе Leaflet и OSM вполне достижима для программиста 1С среднего уровня. Основное время уходит на отладку взаимодействия между контекстом браузера и модулем формы 1С, но результат в виде бесплатной и гибкой картографии оправдывает эти затраты. Для быстрой интеграции с другими картографическими сервисами пригодится обработка для интеграции 1С и 2ГИС.

← На главную