Как использовать географические схемы в 1С и стоит ли переходить на веб-карты?

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

При разработке аналитических отчетов, систем мониторинга доставки или визуализации продаж программисты 1С часто сталкиваются с дилеммой: использовать встроенный объект платформы ГеографическаяСхема (файлы формата .geo) или интегрировать внешние интерактивные карты. Выясним причину, почему встроенные карты долгое время не обновлялись разработчиками платформы, и подробно разберем, как решить задачу отображения геоданных в современных конфигурациях.

Текущее состояние механизма «Географическая схема» в 1С

Сам объект встроенного языка ГеографическаяСхема не заброшен. Он полноценно поддерживается платформой 1С:Предприятие 8.3 как в режиме обычных, так и управляемых форм (включая современный интерфейс «Такси»). В конфигураторе по-прежнему доступен встроенный графический редактор схем, позволяющий настраивать слои, масштабирование, цвета и выводить аналитические отчеты (например, стандартный отчет «Карта продаж»).

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

Как обновить или создать карту в формате .geo вручную

Формат .geo является внутренним закрытым форматом системы 1С. Напрямую нарисовать сложную карту в 1С невозможно. Для создания или обновления геосхем используется импорт векторных шейп-файлов (Shapefiles, расширение .shp), которые подготавливаются во внешних геоинформационных системах (ГИС).

Проанализируем процесс создания обновленной карты по шагам:

  1. Получение исходных геоданных. Скачиваем актуальные векторные карты административных границ РФ в формате Shapefile. Их можно бесплатно получить из проектов на базе OpenStreetMap (OSM).
  2. Обработка в ГИС-программе. Загружаем полученные файлы в бесплатную профессиональную ГИС-среду QGIS. Здесь мы можем удалить лишние мелкие объекты (например, мелкие острова или слишком подробную береговую линию), чтобы облегчить итоговый файл. Это критически важно, так как слишком детализированная карта будет сильно тормозить 1С при отрисовке.
  3. Экспорт данных. Сохраняем оптимизированные слои обратно в формат .shp. Обратите внимание, что таблица атрибутов (файл .dbf) должна быть сохранена в кодировке, которую корректно распознает 1С (обычно Windows-1251 или UTF-8 в зависимости от версии платформы).
  4. Импорт в 1С. В конфигураторе 1С создаем новый макет с типом "Географическая схема". В меню редактора выбираем импорт шейп-файлов, сопоставляем поля с кодами регионов нашей информационной базы и сохраняем получившуюся схему.

Этот путь достаточно трудоемок и требует от разработчика базовых навыков работы с картографическим софтом.

Современная альтернатива: интеграция веб-карт в 1С

Большинство современных разработчиков отказываются от использования файлов .geo в пользу интеграции интерактивных веб-карт (Яндекс.Карты, OpenStreetMap, Google Maps) непосредственно в управляемую форму 1С. Это реализуется с помощью стандартного элемента формы Поле HTML документа.

Рассмотрим подробнее преимущества такого подхода:

Практический пример интеграции Яндекс.Карт в 1С

Разберем по шагам, как вывести интерактивную карту на управляемую форму и отобразить на ней маркеры из информационной базы 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С, без необходимости переключаться во внешние окна браузеров.

Выводы и рекомендации

Проанализировав оба подхода, можно сделать следующие выводы:

← На главную