Как отобразить всех клиентов на карте в 1С:Управление торговлей 10.3?

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

Задача визуализации клиентской базы на географической карте часто встает перед торговыми компаниями для оптимизации логистики, анализа охвата рынка или планирования маркетинговых активностей. В старых конфигурациях, таких как 1С:Управление торговлей 10.3, работающих на обычных формах, встроенных механизмов для этого нет. Однако, используя современные картографические API и поле HTML-документа, мы можем реализовать этот функционал самостоятельно. Разберем этот процесс подробно по шагам.

Шаг 1: Подготовка данных и геокодирование адресов

Прежде чем рисовать метки на карте, нам необходимо перевести текстовые адреса из справочника Контрагенты или ДоговорыКонтрагентов в географические координаты (широту и долготу). Этот процесс называется геокодированием. Рассмотрим, как это правильно организовать, чтобы не замедлить работу системы.

Проанализируем типичную ошибку: отправку запроса к геокодеру каждый раз при открытии карты. Это крайне неэффективно, так как лимиты бесплатных запросов у сервисов (например, Яндекс) ограничены. Правильнее будет добавить в справочник Контрагенты или создать отдельный регистр сведений для хранения координат. Процесс должен выглядеть так:

  1. Создаем в конфигурации дополнительные реквизиты: Широта (Число 15, 10) и Долгота (Число 15, 10).
  2. При записи нового адреса или по нажатию специальной кнопки вызываем процедуру геокодирования.
  3. Сохраняем полученные координаты в базу 1С.

Для качественного распознавания адресов рекомендуем использовать сервис DaData. Он отлично справляется с опечатками в адресах 1С и возвращает точные координаты. Если же мы решим использовать штатный геокодер Яндекса, запрос будет выглядеть примерно так:


Функция ПолучитьКоординатыПоАдресу(АдресТекст)
    // Формируем запрос к API Яндекс.Геокодера
    КлючAPI = "Ваш_Ключ";
    ТекстЗапроса = "https://geocode-maps.yandex.ru/1.x/?apikey=" + КлючAPI + "&format=json&geocode=" + КодироватьСтроку(АдресТекст, СпособКодированияСтроки.URLРазрешенныеСимволы);
    
    HTTPЗапрос = Новый HTTPЗапрос(ТекстЗапроса);
    // ... логика отправки запроса через HTTPСоединение и парсинг JSON ответа
КонецФункции

Шаг 2: Выбор картографического сервиса и лицензионные нюансы

Выясним причину, по которой многие разработчики отказываются от Яндекс.Карт в пользу альтернатив. Согласно условиям использования API Яндекса, бесплатная версия разрешена только если ваша карта доступна публично всему интернету. В случае с 1С (закрытая корпоративная система) Яндекс требует приобретения коммерческой лицензии.

Разберем альтернативные варианты:

Выберем Яндекс.Карты для примера, так как их JS API наиболее документировано и функционально, но помните о необходимости соблюдения лицензионных правил при коммерческом использовании.

Шаг 3: Настройка формы в 1С и работа с HTML-полем

Посмотрим на техническую реализацию отображения. В 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);
КонецПроцедуры

Шаг 4: Группировка меток (Кластеризация)

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

В API Яндекс.Карт для этого используется объект Clusterer. Вместо того чтобы добавлять каждую метку напрямую на карту (myMap.geoObjects.add), мы сначала добавляем их в кластеризатор, а затем сам кластеризатор добавляем на карту. Это значительно повышает производительность браузера внутри 1С и делает визуализацию профессиональной.

Шаг 5: Практическое применение — "Тепловые карты"

Проанализируем ситуацию, когда руководству нужно увидеть не просто "где сидят клиенты", а "где у нас больше всего денег". Для этого отлично подходят Heatmaps. Каждой точке можно присвоить "вес", равный сумме продаж по этому клиенту за период. В результате на карте появятся цветовые пятна: от синих (низкая концентрация выручки) до ярко-красных (центры прибыли). Это мощный инструмент для территориального планирования маркетинга.

В заключение отметим: несмотря на то, что УТ 10.3 — это старая система, возможности интеграции с внешними сервисами через поле HTML-документа практически не ограничены. Главное — заранее позаботиться о качестве адресных данных и чистоте координат в вашей базе 1С.

← На главную