Задача визуализации клиентской базы на географической карте часто встает перед торговыми компаниями для оптимизации логистики, анализа охвата рынка или планирования маркетинговых активностей. В старых конфигурациях, таких как 1С:Управление торговлей 10.3, работающих на обычных формах, встроенных механизмов для этого нет. Однако, используя современные картографические API и поле HTML-документа, мы можем реализовать этот функционал самостоятельно. Разберем этот процесс подробно по шагам.
Прежде чем рисовать метки на карте, нам необходимо перевести текстовые адреса из справочника Контрагенты или ДоговорыКонтрагентов в географические координаты (широту и долготу). Этот процесс называется геокодированием. Рассмотрим, как это правильно организовать, чтобы не замедлить работу системы.
Проанализируем типичную ошибку: отправку запроса к геокодеру каждый раз при открытии карты. Это крайне неэффективно, так как лимиты бесплатных запросов у сервисов (например, Яндекс) ограничены. Правильнее будет добавить в справочник Контрагенты или создать отдельный регистр сведений для хранения координат. Процесс должен выглядеть так:
Широта (Число 15, 10) и Долгота (Число 15, 10).Для качественного распознавания адресов рекомендуем использовать сервис DaData. Он отлично справляется с опечатками в адресах 1С и возвращает точные координаты. Если же мы решим использовать штатный геокодер Яндекса, запрос будет выглядеть примерно так:
Функция ПолучитьКоординатыПоАдресу(АдресТекст)
// Формируем запрос к API Яндекс.Геокодера
КлючAPI = "Ваш_Ключ";
ТекстЗапроса = "https://geocode-maps.yandex.ru/1.x/?apikey=" + КлючAPI + "&format=json&geocode=" + КодироватьСтроку(АдресТекст, СпособКодированияСтроки.URLРазрешенныеСимволы);
HTTPЗапрос = Новый HTTPЗапрос(ТекстЗапроса);
// ... логика отправки запроса через HTTPСоединение и парсинг JSON ответа
КонецФункции
Выясним причину, по которой многие разработчики отказываются от Яндекс.Карт в пользу альтернатив. Согласно условиям использования API Яндекса, бесплатная версия разрешена только если ваша карта доступна публично всему интернету. В случае с 1С (закрытая корпоративная система) Яндекс требует приобретения коммерческой лицензии.
Разберем альтернативные варианты:
Выберем Яндекс.Карты для примера, так как их JS API наиболее документировано и функционально, но помните о необходимости соблюдения лицензионных правил при коммерческом использовании.
Посмотрим на техническую реализацию отображения. В 1С 8.3 (даже в режиме обычных форм) мы используем элемент управления ПолеHTMLДокумента. Нам нужно подготовить HTML-шаблон, который будет содержать подключение скриптов карты и логику отрисовки наших меток.
Рассмотрим важный момент: в старых конфигурациях 1С поле HTML-документа использует движок Internet Explorer. Чтобы карта работала корректно, нам нужно заставить систему использовать актуальный режим рендеринга. Для этого в реестре Windows обычно прописываются ключи Feature_Browser_Emulation для процесса 1cv8.exe.
Теперь подготовим JavaScript-код для вывода массива меток. Проанализируем пример формирования данных:
Процедура СформироватьКарту()
// Создаем текст HTML страницы
ТекстHTML =
"<html>
|<head>
| <script src='https://api-maps.yandex.ru/2.1/?lang=ru_RU' type='text/javascript'></script>
| <script type='text/javascript'>
| var myMap;
| ymaps.ready(init);
| function init() {
| myMap = new ymaps.Map('map', {
| center: [55.76, 37.64], // Центр по умолчанию
| zoom: 10
| });";
// Перебираем выборку заказов или контрагентов из 1С
Пока Выборка.Следующий() Цикл
ТекстHTML = ТекстHTML + "
| myMap.geoObjects.add(new ymaps.Placemark([" + Формат(Выборка.Широта, "ЧГ=0") + "," + Формат(Выборка.Долгота, "ЧГ=0") + "], {
| balloonContent: '" + Выборка.НаименованиеКонтрагента + "'
| }));";
КонецЦикла;
ТекстHTML = ТекстHTML + "
| }
| </script>
|</head>
|<body><div id='map' style='width: 100%; height: 100vh'></div></body>
|</html>";
ЭлементыФормы.ПолеКарты.УстановитьТекст(ТекстHTML);
КонецПроцедуры
Если у нас сотни или тысячи клиентов, обычные метки превратят карту в нечитаемое пятно. Разберем по шагам, как внедрить кластеризацию. Это механизм, который объединяет близко расположенные точки в одну группу с числовым индикатором.
В API Яндекс.Карт для этого используется объект Clusterer. Вместо того чтобы добавлять каждую метку напрямую на карту (myMap.geoObjects.add), мы сначала добавляем их в кластеризатор, а затем сам кластеризатор добавляем на карту. Это значительно повышает производительность браузера внутри 1С и делает визуализацию профессиональной.
Проанализируем ситуацию, когда руководству нужно увидеть не просто "где сидят клиенты", а "где у нас больше всего денег". Для этого отлично подходят Heatmaps. Каждой точке можно присвоить "вес", равный сумме продаж по этому клиенту за период. В результате на карте появятся цветовые пятна: от синих (низкая концентрация выручки) до ярко-красных (центры прибыли). Это мощный инструмент для территориального планирования маркетинга.
В заключение отметим: несмотря на то, что УТ 10.3 — это старая система, возможности интеграции с внешними сервисами через поле HTML-документа практически не ограничены. Главное — заранее позаботиться о качестве адресных данных и чистоте координат в вашей базе 1С.