Отображение клиентов на карте — распространенная задача при автоматизации логистики, анализе покрытия рынка и контроле работы выездных сотрудников. Реализация такого функционала в 1С 8 требует комплексного подхода: от структурирования контактной информации в базе данных до встраивания интерактивной веб-карты и оптимизации отрисовки меток. Разберем по шагам, как построить подобную систему.
Для отображения точки на карте требуются географические координаты (широта и долгота). Текстового адреса для интерактивных библиотек недостаточно, поэтому проанализируем структуру хранения данных в типовых и нетиповых конфигурациях:
Фактический адрес или создадим отдельный вид Точка доставки), либо реализуем возможность вывода нескольких меток для одного партнера с привязкой к конкретным подразделениям.Геокодирование — это процесс преобразования текстового адреса в географические координаты. Если для единичного клиента можно вызвать онлайн-поиск, то для массива клиентов требуется пакетная серверная обработка. Выполнять такие запросы интерактивно на клиенте неэффективно, поэтому реализуем фоновое регламентное задание на стороне сервера 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;
Возврат Позиция; // Возвращает строку вида "Долгота Широта"
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("Геокодирование", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
КонецПопытки;
Возврат Неопределено;
КонецФункции
Важное ограничение: при использовании коммерческих геокодеров необходимо учитывать условия их пользовательских соглашений. Большинство бесплатных тарифов запрещают длительное кэширование полученных координат в локальных базах данных и требуют отображения результата исключительно на подложках соответствующего сервиса.
Для визуализации данных на форме используется элемент с видом Поле HTML-документа. В качестве движка отображения можно использовать API Яндекс.Карт, Google Maps или открытую библиотеку Leaflet, которая отличается легковесностью и гибкостью при работе с собственными источниками тайлов.
Разберем механизм двустороннего обмена между 1С и JavaScript:
ВыполнитьСкрипт.v8action://selectClient?id=123), который перехватывается в 1С событием ПриНажатии поля HTML-документа.Пример передачи координат метки из 1С на форму:
&НаКлиенте
Процедура ОтобразитьТочкуНаКарте(Широта, Долгота, НаименованиеКлиента)
ШаблонВызова = "addMarker(%1, %2, '%3');";
Скрипт = СтрШаблон(ШаблонВызова,
Формат(Широта, "ЧРД=.; ЧГ=0"),
Формат(Долгота, "ЧРД=.; ЧГ=0"),
НаименованиеКлиента);
Элементы.ПолеКарты.ВыполнитьСкрипт(Скрипт);
КонецПроцедуры
При выводе сотен или тысяч точек в Поле HTML-документа встроенный браузер формы может испытывать высокую нагрузку, приводя к зависанию интерфейса. Чтобы избежать падения производительности, применим следующие оптимизации:
Печать интерактивной веб-страницы стандартными средствами 1С часто приводит к искажению верстки или обрезке элементов. Для формирования отчетов и путевых листов с картой рассмотрим альтернативный инструмент — Static API картографических сервисов:
ТабличныйДокумент (через рисунок таблицы) или элемент формы Поле картинки, что гарантирует точное сохранение пропорций при печати на любой формат бумаги без зависимости от браузерных скриптов.