Как отобразить клиентов на карте в 1С 8 и работать с геоданными?

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

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

Шаг 1. Организация хранения адресов и координат

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

  1. Множественные адреса клиентов: у одного контрагента часто бывает несколько адресов (юридический, фактический, несколько складов или торговых точек). Для корректного отображения выделим конкретный вид контактной информации (например, Фактический адрес или создадим отдельный вид Точка доставки), либо реализуем возможность вывода нескольких меток для одного партнера с привязкой к конкретным подразделениям.
  2. Погрешность текстовых адресов: автоматическое распознавание адреса строкой может давать погрешность из-за опечаток или некорректных номеров строений. Оптимальным решением является добавление в состав контактной информации или в отдельный регистр сведений полей для хранения точных GPS-координат (числовые значения широты и долготы).
  3. Нормализация: для повышения точности текстовые адреса рекомендуется предварительно стандартизировать с использованием адресных классификаторов (ФИАС/ГАР).

Шаг 2. Пакетное геокодирование адресов контрагентов

Геокодирование — это процесс преобразования текстового адреса в географические координаты. Если для единичного клиента можно вызвать онлайн-поиск, то для массива клиентов требуется пакетная серверная обработка. Выполнять такие запросы интерактивно на клиенте неэффективно, поэтому реализуем фоновое регламентное задание на стороне сервера 1С.

Для отправки запросов к REST API картографических сервисов используем встроенные объекты платформы HTTPСоединение и HTTPЗапрос, а ответ разбираем через ПрочитатьJSON. Посмотрим на пример серверной функции для получения координат:


Функция ПолучитьКоординатыПоАдресу(АдресСтрокой, КлючAPI)
    Сервер = "geocode-maps.yandex.ru";
    ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
    Соединение = Новый HTTPСоединение(Сервер, 443, , , , 10, ЗащищенноеСоединение);
    
    ПутьЗапроса = "/1.x/?apikey=" + КлючAPI + "&geocode=" + КодироватьСтроку(АдресСтрокой, СпособКодированияСтроки.URLВКодировкеПоследовательности) + "&format=json";
    Запрос = Новый HTTPЗапрос(ПутьЗапроса);
    
    Попытка
        Ответ = Соединение.Получить(Запрос);
        Если Ответ.КодСостояния = 200 Тогда
            ЧтениеJSON = Новый ЧтениеJSON;
            ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
            Данные = ПрочитатьJSON(ЧтениеJSON);
            
            // Разбор структуры ответа геокодера и получение координат
            Позиция = Данные.response.GeoObjectCollection.featureMember[0].GeoObject.Point.pos;
            Возврат Позиция; // Возвращает строку вида "Долгота Широта"
        КонецЕсли;
    Исключение
        ЗаписьЖурналаРегистрации("Геокодирование", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
    КонецПопытки;
    
    Возврат Неопределено;
КонецФункции

Важное ограничение: при использовании коммерческих геокодеров необходимо учитывать условия их пользовательских соглашений. Большинство бесплатных тарифов запрещают длительное кэширование полученных координат в локальных базах данных и требуют отображения результата исключительно на подложках соответствующего сервиса.

Шаг 3. Встраивание интерактивной карты в управляемую форму

Для визуализации данных на форме используется элемент с видом Поле HTML-документа. В качестве движка отображения можно использовать API Яндекс.Карт, Google Maps или открытую библиотеку Leaflet, которая отличается легковесностью и гибкостью при работе с собственными источниками тайлов.

Разберем механизм двустороннего обмена между 1С и JavaScript:

  1. Передача данных из 1С в JavaScript: загружаем базовый HTML-шаблон с подключенной библиотекой карты. Передачу массива клиентов или команд на позиционирование осуществляем вызовом метода элемента формы ВыполнитьСкрипт.
  2. Передача событий из карты в 1С: для обработки кликов по меткам (например, открытие карточки контрагента) в коде JS формируется переход по псевдо-URL (например, v8action://selectClient?id=123), который перехватывается в 1С событием ПриНажатии поля HTML-документа.

Пример передачи координат метки из 1С на форму:


&НаКлиенте
Процедура ОтобразитьТочкуНаКарте(Широта, Долгота, НаименованиеКлиента)
    ШаблонВызова = "addMarker(%1, %2, '%3');";
    Скрипт = СтрШаблон(ШаблонВызова, 
        Формат(Широта, "ЧРД=.; ЧГ=0"), 
        Формат(Долгота, "ЧРД=.; ЧГ=0"), 
        НаименованиеКлиента);
    Элементы.ПолеКарты.ВыполнитьСкрипт(Скрипт);
КонецПроцедуры

Шаг 4. Оптимизация при большом количестве меток

При выводе сотен или тысяч точек в Поле HTML-документа встроенный браузер формы может испытывать высокую нагрузку, приводя к зависанию интерфейса. Чтобы избежать падения производительности, применим следующие оптимизации:

  1. Кластеризация: объединение близко расположенных точек в кластеры на стороне JavaScript. Библиотеки карт предоставляют готовые модули кластеризации, которые пересчитывают видимые объекты при смене масштаба.
  2. Фильтрация по видимой области (Viewport): передача на карту не всего справочника сразу, а только тех данных, которые попадают в текущие границы экрана. При перемещении карты JS передает координаты углов экрана в 1С, после чего платформа возвращает только актуальный набор точек.

Шаг 5. Вывод карты на печать

Печать интерактивной веб-страницы стандартными средствами 1С часто приводит к искажению верстки или обрезке элементов. Для формирования отчетов и путевых листов с картой рассмотрим альтернативный инструмент — Static API картографических сервисов:

  1. Сервер 1С формирует HTTP-запрос, в параметрах которого передаются размеры итоговой картинки, масштаб, координаты центра и перечень меток.
  2. Сервис возвращает статическое бинарное изображение (JPEG или PNG).
  3. Полученная картинка помещается в объект ТабличныйДокумент (через рисунок таблицы) или элемент формы Поле картинки, что гарантирует точное сохранение пропорций при печати на любой формат бумаги без зависимости от браузерных скриптов.
← На главную