При разработке аналитических отчетов, систем мониторинга доставки или визуализации продаж программисты 1С часто сталкиваются с дилеммой: использовать встроенный объект платформы ГеографическаяСхема (файлы формата .geo) или интегрировать внешние интерактивные карты. Выясним причину, почему встроенные карты долгое время не обновлялись разработчиками платформы, и подробно разберем, как решить задачу отображения геоданных в современных конфигурациях.
Сам объект встроенного языка ГеографическаяСхема не заброшен. Он полноценно поддерживается платформой 1С:Предприятие 8.3 как в режиме обычных, так и управляемых форм (включая современный интерфейс «Такси»). В конфигураторе по-прежнему доступен встроенный графический редактор схем, позволяющий настраивать слои, масштабирование, цвета и выводить аналитические отчеты (например, стандартный отчет «Карта продаж»).
Основная проблема заключается в контенте. Официально поставляемые фирмой 1С шаблоны карт (карта мира, карты России с различной детализацией) безнадежно устарели и не отражают актуальное административно-территориальное деление РФ (например, появление новых регионов). Если использовать стандартные схемы из старых дистрибутивов ИТС, вы получите неактуальную картину, что недопустимо для бизнес-отчетности.
Формат .geo является внутренним закрытым форматом системы 1С. Напрямую нарисовать сложную карту в 1С невозможно. Для создания или обновления геосхем используется импорт векторных шейп-файлов (Shapefiles, расширение .shp), которые подготавливаются во внешних геоинформационных системах (ГИС).
Проанализируем процесс создания обновленной карты по шагам:
.shp. Обратите внимание, что таблица атрибутов (файл .dbf) должна быть сохранена в кодировке, которую корректно распознает 1С (обычно Windows-1251 или UTF-8 в зависимости от версии платформы).Этот путь достаточно трудоемок и требует от разработчика базовых навыков работы с картографическим софтом.
Большинство современных разработчиков отказываются от использования файлов .geo в пользу интеграции интерактивных веб-карт (Яндекс.Карты, OpenStreetMap, Google Maps) непосредственно в управляемую форму 1С. Это реализуется с помощью стандартного элемента формы Поле HTML документа.
Рассмотрим подробнее преимущества такого подхода:
Разберем по шагам, как вывести интерактивную карту на управляемую форму и отобразить на ней маркеры из информационной базы 1С.
Шаг 1. Создаем управляемую форму. Добавляем на нее реквизит с именем АдресКарты и типом Строка. Вытаскиваем его на форму и устанавливаем вид элемента — Поле HTML документа.
Шаг 2. При создании формы на сервере или при открытии инициализируем базовый HTML-код, который загрузит API Яндекс.Карт. Нам нужно сформировать текст HTML-страницы и поместить его в наш реквизит:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
HTMLКод =
"<!DOCTYPE html>
|<html>
|<head>
| <title>Карта 1С</title>
| <meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8"" />
| <script src=""https://api-maps.yandex.ru/2.1/?lang=ru_RU"" type=""text/javascript""></script>
| <style>
| html, body, #map { width: 100%; height: 100%; padding: 0; margin: 0; }
| </style>
| <script type=""text/javascript"">
| var myMap;
| ymaps.ready(init);
| function init() {
| myMap = new ymaps.Map(""map"", {
| center: [55.76, 37.64], // Координаты центра по умолчанию (Москва)
| zoom: 10
| });
| }
| function ДобавитьТочку(широта, долгота, заголовок, описание) {
| var placemark = new ymaps.Placemark([широта, долгота], {
| hintContent: заголовок,
| balloonContent: описание
| });
| myMap.geoObjects.add(placemark);
| }
| function ОчиститьКарту() {
| myMap.geoObjects.removeAll();
| }
| </script>
|</head>
|<body>
| <div id=""map""></div>
|</body>
|</html>";
АдресКарты = HTMLКод;
КонецПроцедуры
Шаг 3. Теперь научимся управлять этой картой из кода 1С. Нам нужно передавать координаты точек (например, адреса доставки клиентов) из базы данных на карту. Для этого воспользуемся вызовом JavaScript-функций, которые мы объявили в теле HTML-документа.
Напишем процедуру, которая будет выводить список контрагентов на карту:
&НаКлиенте
Процедура ОбновитьКартуНаФорме()
// Получаем доступ к окну браузера внутри Поля HTML документа
ДокументHTML = Элементы.АдресКарты.Документ;
Если ДокументHTML = Неопределено Тогда
Возврат;
КонецЕсли;
ОкноJS = ДокументHTML.defaultView;
Если ОкноJS = Неопределено Тогда
Возврат;
КонецЕсли;
// Очищаем старые маркеры перед выводом новых
ОкноJS.ОчиститьКарту();
// В реальной задаче здесь будет обход выборки из базы данных
// Для примера передадим две тестовые точки
ОкноJS.ДобавитьТочку(55.755814, 37.617635, "Офис Центр", "Главный склад компании");
ОкноJS.ДобавитьТочку(55.791522, 37.558231, "Филиал Север", "Пункт выдачи заказов №1");
КонецПроцедуры
Таким образом, мы получаем современный, динамичный и полностью кастомизируемый инструмент для визуализации любых геоданных. Менеджеры смогут работать с картой непосредственно в интерфейсе программы 1С, без необходимости переключаться во внешние окна браузеров.
Проанализировав оба подхода, можно сделать следующие выводы:
.geo целесообразно только в специфических условиях: при полном отсутствии интернета на рабочих местах пользователей или при необходимости построения простейших статических картограмм по фиксированным регионам, где не требуется детализация.