Как из 1С отобразить список адресов на интерактивной карте в браузере?

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

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

Разберем основные заблуждения при постановке такой задачи, технические и лицензионные ограничения стандартных сервисов, а также рассмотрим надежные архитектурные решения для реализации этой схемы.

Ограничения стандартных сервисов «Мои карты» и Конструкторов карт

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

  1. Отсутствие публичного REST API для управления объектами в личном кабинете: Сервисы пользовательских карт («Мои карты», «Конструктор карт») ориентированы на интерактивное ручное создание меток человеком через веб-интерфейс или разовый ручной импорт файлов (KML, CSV, XLSX). Прямого программного API для добавления или удаления меток внутри закрытого профиля пользователя без открытия интерфейса провайдеры не предоставляют.
  2. Временный характер данных конструкторов: Сгенерированные через визуальные редакторы ссылки и конфигурации меток предназначены для статического встраивания (виджетов), а не для динамического обмена данными в реальном времени.

Следовательно, для регулярного и автоматического обновления меток необходимо строить решение на базе программного API картографических библиотек и веб-страницы (или веб-сервиса), выступающей потребителем данных из 1С.

Архитектура решения на базе штатных HTTP-сервисов 1С и JavaScript API

Рассмотрим наиболее современную и производительную схему, которая не требует развертывания промежуточных реляционных СУБД (например, MySQL) и написания скриптов на PHP. Вся бизнес-логика и хранение данных остаются в 1С, а браузер отображает легкую статическую HTML-страницу.

Разберем по шагам, как устроена данная интеграция:

  1. В конфигурации 1С создается объект метаданных HTTPСервис с шаблоном URL (например, /get_points) и методом GET.
  2. Пользователь открывает в браузере веб-страницу (SPA), на которой подключена JavaScript-библиотека карт.
  3. Скрипт на странице выполняет асинхронный HTTP-запрос к опубликованному HTTP-сервису 1С.
  4. 1С считывает подготовленные данные и возвращает их в формате GeoJSON.
  5. JavaScript-компонент карты (например, менеджер объектов ObjectManager) принимает GeoJSON и мгновенно отрисовывает точки с возможностью кластеризации и фильтрации.

Посмотрим на пример кода метода HTTP-сервиса в 1С, формирующего ответ в формате GeoJSON с помощью объекта ЗаписьJSON:


Функция ПолучитьТочкиGET(Запрос)
    
    // Подготавливаем структуру ответа в формате GeoJSON
    КоллекцияОбъектов = Новый Структура;
    КоллекцияОбъектов.Вставить("type", "FeatureCollection");
    
    МассивТочек = Новый Массив;
    
    // Выбираем актуальные адреса и заранее вычисленные координаты
    ЗапросКБазе = Новый Запрос;
    ЗапросКБазе.Текст = 
        "ВЫБРАТЬ
        |   ТочкиДоставки.Ссылка.Наименование КАК Наименование,
        |   ТочкиДоставки.Адрес КАК Адрес,
        |   ТочкиДоставки.Широта КАК Широта,
        |   ТочкиДоставки.Долгота КАК Долгота,
        |   ТочкиДоставки.Описание КАК Описание
        |ИЗ
        |   Справочник.ТочкиДоставки КАК ТочкиДоставки
        |ГДЕ
        |   НЕ ТочкиДоставки.ПометкаУдаления";
        
    Выборка = ЗапросКБазе.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        
        Геометрия = Новый Структура;
        Геометрия.Вставить("type", "Point");
        
        Координаты = Новый Массив;
        Координаты.Добавить(Выборка.Широта);
        Координаты.Добавить(Выборка.Долгота);
        Геометрия.Вставить("coordinates", Координаты);
        
        Свойства = Новый Структура;
        Свойства.Вставить("balloonContentHeader", Выборка.Наименование);
        Свойства.Вставить("balloonContentBody", Выборка.Описание);
        Свойства.Вставить("balloonContentFooter", Выборка.Адрес);
        Свойства.Вставить("hintContent", Выборка.Наименование);
        
        Элемент = Новый Структура;
        Элемент.Вставить("type", "Feature");
        Элемент.Вставить("id", Строка(Выборка.Наименование));
        Элемент.Вставить("geometry", Геометрия);
        Элемент.Вставить("properties", Свойства);
        
        МассивТочек.Добавить(Элемент);
        
    КонецЦикла;
    
    КоллекцияОбъектов.Вставить("features", МассивТочек);
    
    // Сериализуем данные в строку JSON
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, КоллекцияОбъектов);
    СтрокаJSON = ЗаписьJSON.Закрыть();
    
    // Формируем HTTP-ответ
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    Ответ.Заголовки.Вставить("Access-Control-Allow-Origin", "*");
    Ответ.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    
    Возврат Ответ;
    
КонецФункции

Оптимизация геокодирования и кэширование координат

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

  1. Превышение суточных лимитов запросов: Бесплатные и стандартные тарифы геокодеров имеют жесткие ограничения на число запросов в сутки (например, 25 000 обращений). При 100 точках на карте и 30 пользователях, обновивших страницу 10 раз за день, лимит будет исчерпан за считанные часы.
  2. Замедление работы: Множество последовательных асинхронных HTTP-запросов из браузера к геокодеру блокируют быстрый рендеринг страницы.

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

Разберем пример серверной процедуры в 1С для геокодирования адреса через HTTPСоединение и HTTPЗапрос при записи элемента:


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

Лицензионные требования и альтернативные варианты

Проанализируем правовые аспекты использования картографических API:

  1. Коммерческие лицензии публичных сервисов: Условия использования бесплатных версий популярных картографических API запрещают их применение в закрытых системах (интранет, CRM/ERP с ограниченным доступом, закрытые личные кабинеты для сотрудников) и для задач логистики/мониторинга транспорта. Для таких сценариев провайдеры требуют приобретения коммерческой лицензии.
  2. Альтернатива на базе открытого стека (Open Source): Если бюджет проекта не предполагает оплату коммерческих тарифов API, оптимальным решением является использование открытых JavaScript-библиотек (например, Leaflet или MapLibre) с подложкой тайлов OpenStreetMap и собственным сервисом геокодирования или нормализации адресов (на базе реестров ФИАС/ГАР).
  3. Выгрузка статических файлов KML/GeoJSON: Если прямой доступ к HTTP-сервисам 1С снаружи сети закрыт требованиями безопасности, в 1С настраивается регламентное задание, которое периодически выгружает файл GeoJSON или KML (с помощью объекта ЗаписьXML) на внешний веб-сервер или в S3-хранилище по расписанию. Веб-страница с картой в браузере в таком случае загружает данные из этого статичного файла.

Таким образом, для отображения меток из 1С в браузере не требуется ручной перенос списков. Достаточно реализовать кэширование координат внутри базы и отдавать готовый массив точек через HTTP-сервис 1С на простую веб-страницу с подключенной библиотекой карт.

← На главную