При автоматизации управленческого учета и мониторинга региональной сети часто возникает задача наглядного вывода подразделений или торговых точек на карте страны. Классический вариант интеграции с веб-сервисами (например, публичными API картографических сервисов) оказывается неприменим, если клиентская база данных работает в изолированном контуре без прямого доступа к интернету либо требования корпоративной безопасности запрещают передачу координат во внешнюю сеть. Разберем, какие встроенные и альтернативные инструменты платформы 1С:Предприятие позволяют решить задачу отображения офлайн-карты с нанесенными маркерами.
В платформе 1С:Предприятие предусмотрен штатный визуальный объект ГеографическаяСхема. Он предназначен именно для работы с пространственными и картографическими данными без необходимости подключения к глобальной сети. Рассмотрим ключевые особенности подготовки векторных карт и работы с этим объектом.
Для загрузки карты платформе требуется векторный формат ESRI Shapefile. Проанализируем обязательные технические требования к исходным данным:
.shp. Платформа требует полноценный набор файлов с одинаковым именем: .shp (непосредственно геометрия объектов), .shx (индексный файл для быстрого поиска геометрии) и .dbf (атрибутивные данные, содержащие наименования регионов, коды и числовые показатели)..dbf должна быть сохранена в однобайтовой кодировке, как правило, Windows-1251. Если исходный слой выгружен в кодировке UTF-8, наименования субъектов и объектов внутри 1С отобразятся в виде нечитаемых символов.Разберем программную загрузку подготовленного слоя и вывод объектов на форму. Посмотрим на типовой алгоритм:
// Предположим, что Элементы.ПолеГеографическойСхемы связано с реквизитом формы типа ГеографическаяСхема
ГеоСхема = Элементы.ПолеГеографическойСхемы.ГеографическаяСхема;
// Загрузка слоя из подготовленного набора файлов Shapefile
ГеоСхема.Загрузить("C:\Maps\Russia_Regions.shp");
// Проанализируем добавление точечных объектов подразделений
// Для каждого филиала создаем точечный объект по координатам широты и долготы
Для Каждого СтрПодразделение Из ТаблицаПодразделений Цикл
Точка = ГеоСхема.Объекты.Добавить();
Точка.ТипОбъекта = ТипОбъектаГеографическойСхемы.Точка;
Точка.Широта = СтрПодразделение.Широта;
Точка.Долгота = СтрПодразделение.Долгота;
Точка.Текст = СтрПодразделение.Наименование;
Точка.Цвет = WebЦвета.Красный;
КонецЦикла;
Этот подход работает полностью автономно и не требует развертывания дополнительных внешних служб или веб-серверов на рабочих местах пользователей.
Если задача заключается только в обзорном отображении присутствия компании по регионам без необходимости свободного масштабирования до отдельных домов, наиболее быстрым и визуально аккуратным решением является работа с векторным форматом SVG внутри встроенного поля HTML-документа. Выясним причину популярности этого способа: он обеспечивает быструю отрисовку, кроссплатформенность и не зависит от ограничений настольных клиентов.
SVG, где каждому региону присвоен уникальный идентификатор (например, код субъекта РФ).ПолеHTMLДокумента.<circle>) наносятся маркеры подразделений, привязанные к координатной сетке векторного изображения.Посмотрим на пример генерации базового HTML-кода для формы:
&НаСервере
Функция СформироватьHTMLКарты(ТаблицаТочек)
МакетSVG = ПолучитьОбщийМакет("МакетКартыРФ_SVG");
ТекстSVG = МакетSVG.ПолучитьТекст();
// Внедряем маркеры точек поверх векторной подложки
СтрокаМаркеров = "";
Для Каждого Стр Из ТаблицаТочек Цикл
// X и Y рассчитываются исходя из пропорций SVG-полотна
СтрокаМаркеров = СтрокаМаркеров + СтрШаблон(
"<circle cx='%1' cy='%2' r='5' fill='red'><title>%3</title></circle>",
Формат(Стр.КоординатаX, "ЧРД=.; ЧГ=0"),
Формат(Стр.КоординатаY, "ЧРД=.; ЧГ=0"),
Стр.Наименование
);
КонецЦикла;
ТекстHTML = "<html><body style='margin:0; overflow:hidden;'>"
+ ТекстSVG
+ "</body></html>";
Возврат СтрЗаменить(ТекстHTML, "</svg>", СтрокаМаркеров + "</svg>");
КонецФункции
Когда требуется полноценная интерактивная карта с возможностью приближения, перетаскивания и детального размещения десятков маркеров, но интернета по-прежнему нет, разберем решение на базе JS-библиотек (например, Leaflet):
Таким образом, для реализации задачи наглядного контроля 100 подразделений по стране без доступа в интернет оптимально использовать встроенный объект ГеографическаяСхема с оптимизированными файлами Shapefile либо векторную схему в поле HTML-документа. Это исключает зависимость от внешних платных сервисов и полностью закрывает требования информационной безопасности.