В современной логистике визуализация данных на карте — это не просто эстетическое требование, а рабочий инструмент для проверки корректности распределения заказов. Мы часто сталкиваемся с ситуацией, когда логистам необходимо увидеть точки доставки на карте, чтобы исключить пересечения маршрутов и оптимизировать логистику. В данной статье мы подробно проанализируем доступные API картографических сервисов, разберем их стоимость и технические нюансы интеграции с платформой 1С.
При выборе сервиса для отображения координат (широты и долготы) на карте, мы должны учитывать не только качество покрытия, но и стоимость владения системой. Рассмотрим основные варианты, доступные разработчику 1С:
Leaflet — это легкая JavaScript-библиотека для интерактивных карт, которая позволяет отображать данные OSM без лицензионных отчислений.Проанализируем ситуацию: если у нас уже есть координаты точек (широта и долгота), нам не нужно платить за дорогостоящее геокодирование. Мы можем использовать 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С в наше поле HTML. Начиная с версии платформы 8.3.14, мы можем использовать метод ВыполнитьJavaScript() для взаимодействия с контекстом страницы. Проанализируем пример кода на языке 1С:
&Процедура ОтобразитьТочкиНаКарте()
Для Каждого СтрокаТТ Из ТаблицаТочекДоставки Цикл
ТекстСкрипта = СтрШаблон("addMarker(%1, %2, '%3');",
СтрокаТТ.Широта,
СтрокаТТ.Долгота,
СтрокаТТ.Адрес);
Элементы.КартаПолеHTML.ВыполнитьJavaScript(ТекстСкрипта);
КонецЦикла;
КонецПроцедуры
Важный момент: Если вы используете старые версии платформы 1С, где ПолеHTMLДокумента работает на движке Internet Explorer, убедитесь, что версия IE в системе не ниже 11, иначе современные JS-библиотеки могут не заработать. В новых версиях платформы рекомендуется переключать режим отображения на Chromium.
Рассмотрим ситуацию, когда у клиента в базе данных 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С:
Таким образом, мы выяснили, что отсутствие огромного бюджета на API Яндекс.Карт не является препятствием для создания качественного инструмента мониторинга доставки в 1С. Комбинируя бесплатные карты и недорогие сервисы очистки данных, можно добиться профессионального результата. Если же специфика проекта требует использования экосистемы Яндекса, можно применить готовое решение для отображения меток и маршрутов на Яндекс-картах в 1С.