Интеграция картографических сервисов в 1С становится необходимостью для логистических систем, служб доставки и компаний с развитой сетью филиалов. В современных реалиях использование OpenStreetMap (OSM) является наиболее стабильной и экономически выгодной альтернативой коммерческим API от Яндекс или Google, которые часто меняют условия лицензирования и стоимость использования. Рассмотрим подробнее, как реализовать полноценное интерактивное взаимодействие 1С и OSM. Для решения аналогичных задач на базе картографических сервисов Яндекса можно использовать готовое решение для работы с Яндекс.Картами в 1С.
Для отображения карт внутри управляемых или обычных форм 1С мы используем стандартный элемент ПолеHTMLДокумента. Проанализируем технологический стек: основным движком для работы с OSM на стороне клиента является библиотека Leaflet. Она легковесна, расширяема плагинами и отлично работает внутри контейнеров 1С.
Разберем по шагам принцип работы: 1С хранит в макете или текстовой строке HTML-код, который подключает JS-библиотеки. При открытии формы этот код загружается в поле, инициализируя карту. Важно учитывать версию платформы: в версиях до 8.3.14 использовался движок Internet Explorer, что требовало написания кода на старых стандартах JS. В современных версиях 1С используется Chromium, что позволяет использовать весь потенциал современных скриптов.
Самым важным этапом является организация двустороннего обмена данными. Выясним причину, по которой многие разработки работают нестабильно: это неправильная обработка событий. Рассмотрим правильный подход.
Передача данных из 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). Процесс выглядит следующим образом:
Для выделения полигонов (зон доставки) незаменимым инструментом будет библиотека 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ГИС.