Как интегрировать картографические сервисы в 1С для визуализации точек доставки без лишних затрат

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

В современной логистике визуализация данных на карте — это не просто эстетическое требование, а рабочий инструмент для проверки корректности распределения заказов. Мы часто сталкиваемся с ситуацией, когда логистам необходимо увидеть точки доставки на карте, чтобы исключить пересечения маршрутов и оптимизировать логистику. В данной статье мы подробно проанализируем доступные API картографических сервисов, разберем их стоимость и технические нюансы интеграции с платформой 1С.

Анализ рынка картографических API: платные и бесплатные решения

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

  1. Яндекс Карты: Обладают наиболее актуальной адресной базой по РФ и СНГ. Однако стоит помнить, что использование API в закрытых системах (таких как 1С) требует приобретения коммерческой лицензии. Бесплатная версия предназначена только для открытых публичных сайтов. Ценник для корпоративного сектора может быть весьма существенным.
  2. 2GIS: Отличаются великолепной детализацией городов и информацией о входах в здания. Тем не менее, ценовая политика сервиса часто оказывается даже более жесткой, чем у Яндекса, особенно если речь идет об использовании данных в логистических целях.
  3. Google Maps: Предлагает гибкую систему оплаты за количество запросов и предоставляет ежемесячный бесплатный лимит (около 200 долларов США), что может подойти для небольших объемов. Однако точность геокодирования в регионах РФ может уступать отечественным сервисам.
  4. OpenStreetMap (OSM) и Leaflet: Это полностью открытое и бесплатное решение. Leaflet — это легкая JavaScript-библиотека для интерактивных карт, которая позволяет отображать данные OSM без лицензионных отчислений.

Реализация визуализации через Leaflet и OpenStreetMap

Проанализируем ситуацию: если у нас уже есть координаты точек (широта и долгота), нам не нужно платить за дорогостоящее геокодирование. Мы можем использовать Leaflet для отрисовки маркеров. Рассмотрим, как подготовить HTML-код для отображения в 1С.

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


<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" />
    <script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>
    <style>
        #map { height: 100vh; width: 100%; margin: 0; }
    </style>
</head>
<body>
    <div id="map"></div>
    <script>
        var map = L.map('map').setView([55.751244, 37.618423], 10);
        L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
            attribution: '© OpenStreetMap contributors'
        }).addTo(map);

        function addMarker(lat, lng, hint) {
            L.marker([lat, lng]).addTo(map).bindPopup(hint);
        }
    </script>
</body>
</html>

В этом коде мы подключаем библиотеку Leaflet, инициализируем карту и создаем функцию addMarker, которую будем вызывать из 1С для нанесения точек реализации.

Передача данных из 1С в JavaScript

Выясним, как эффективно передать массив точек из базы данных 1С в наше поле HTML. Начиная с версии платформы 8.3.14, мы можем использовать метод ВыполнитьJavaScript() для взаимодействия с контекстом страницы. Проанализируем пример кода на языке 1С:


&Процедура ОтобразитьТочкиНаКарте()
    Для Каждого СтрокаТТ Из ТаблицаТочекДоставки Цикл
        ТекстСкрипта = СтрШаблон("addMarker(%1, %2, '%3');", 
            СтрокаТТ.Широта, 
            СтрокаТТ.Долгота, 
            СтрокаТТ.Адрес);
        Элементы.КартаПолеHTML.ВыполнитьJavaScript(ТекстСкрипта);
    КонецЦикла;
КонецПроцедуры

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

Решение проблемы геокодирования через Dadata

Рассмотрим ситуацию, когда у клиента в базе данных 1С есть только строковые адреса, а координат нет. Прямое использование геокодера Яндекса или Google будет стоить дорого. В этом случае мы можем воспользоваться сервисом Dadata. Он позволяет не только нормализовать адрес по ФИАС, но и возвращает координаты с высокой точностью.

Разберем пример HTTP-запроса к Dadata из 1С для получения координат:


Функция ПолучитьКоординатыЧерезDadata(АдресТекстом)
    HTTPЗапрос = Новый HTTPЗапрос("https://cleaner.dadata.ru/api/v1/clean/address");
    HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");
    HTTPЗапрос.Заголовки.Вставить("Authorization", "Token " + МойAPIКлюч);
    HTTPЗапрос.Заголовки.Вставить("X-Secret", МойСекретныйКлюч);
    
    МассивАдресов = Новый Массив;
    МассивАдресов.Добавить(АдресТекстом);
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, МассивАдресов);
    HTTPЗапрос.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть());
    
    Соединение = Новый HTTPСоединение("cleaner.dadata.ru", 443, , , , 10, Новый ЗащищенноеСоединениеOpenSSL());
    Ответ = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
    
    Если Ответ.КодСостояния = 200 Тогда
        // Обработка JSON и получение полей geo_lat и geo_lon
    КонецЕсли;
КонецФункции

Такой подход значительно дешевле полноценных картографических API, так как вы платите только за обработку строки адреса, а отображение на карте с помощью OSM остается бесплатным. Для быстрого развертывания обмена данными с сервисом можно использовать готовый пример интеграции 1С с сервисом DaData.

Оффлайн-карты и собственные тайл-серверы

Проанализируем более продвинутый вариант. Если требования безопасности компании запрещают постоянное обращение к внешним серверам, или если вы хотите полной независимости от лимитов, можно развернуть собственный тайл-сервер. Использование таких инструментов, как TileServer-GL, позволяет хранить фрагменты карт (тайлы) локально.

В коде Leaflet это потребует лишь смены URL в L.tileLayer на адрес вашего локального сервера:

L.tileLayer('http://ваш-сервер/hot/{z}/{x}/{y}.png').addTo(map);

Это обеспечит максимальную скорость работы интерфейса логиста, так как карты будут грузиться по локальной сети, а не из интернета.

Заключение и рекомендации

Подведем итог нашему исследованию. Для реализации визуализации маршрутов в 1С:

  1. Используйте OpenStreetMap в связке с библиотекой Leaflet. Это бесплатно и покрывает 90% задач логистики.
  2. Для получения координат из «грязных» адресов 1С интегрируйте сервис Dadata.
  3. Если вам необходим учет специфики грузового транспорта (высота мостов, нагрузка на ось), рассмотрите HERE API, у которого более лояльные условия для логистических стартапов по сравнению с гигантами рынка.
  4. Внедряйте отображение через управляемые формы с использованием Chromium-движка для стабильной работы JavaScript.

Таким образом, мы выяснили, что отсутствие огромного бюджета на API Яндекс.Карт не является препятствием для создания качественного инструмента мониторинга доставки в 1С. Комбинируя бесплатные карты и недорогие сервисы очистки данных, можно добиться профессионального результата. Если же специфика проекта требует использования экосистемы Яндекса, можно применить готовое решение для отображения меток и маршрутов на Яндекс-картах в 1С.

← На главную