При автоматизации логистики, служб доставки или работы выездных сотрудников часто возникает задача: отобразить актуальный список адресов из базы 1С на интерактивной веб-карте, чтобы пользователи могли открывать её по ссылке в браузере или на мобильном устройстве. При этом требуется, чтобы при добавлении, изменении или удалении адресов в 1С метки на карте обновлялись автоматически.
Разберем основные заблуждения при постановке такой задачи, технические и лицензионные ограничения стандартных сервисов, а также рассмотрим надежные архитектурные решения для реализации этой схемы.
Часто разработчики пытаются найти прямую функцию вида «передать список адресов в личный кабинет картографического сервиса под логином и паролем». Проанализируем, почему этот путь не работает напрямую:
Следовательно, для регулярного и автоматического обновления меток необходимо строить решение на базе программного API картографических библиотек и веб-страницы (или веб-сервиса), выступающей потребителем данных из 1С.
Рассмотрим наиболее современную и производительную схему, которая не требует развертывания промежуточных реляционных СУБД (например, MySQL) и написания скриптов на PHP. Вся бизнес-логика и хранение данных остаются в 1С, а браузер отображает легкую статическую HTML-страницу.
Разберем по шагам, как устроена данная интеграция:
HTTPСервис с шаблоном URL (например, /get_points) и методом GET.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С однократно — в момент ввода или записи адреса объекта. Полученные координаты (широту и долготу) необходимо сохранять в реквизитах справочника или в специальном периодическом регистре сведений. В браузер должны передаваться только готовые числовые координаты.
Разберем пример серверной процедуры в 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:
ЗаписьXML) на внешний веб-сервер или в S3-хранилище по расписанию. Веб-страница с картой в браузере в таком случае загружает данные из этого статичного файла.Таким образом, для отображения меток из 1С в браузере не требуется ручной перенос списков. Достаточно реализовать кэширование координат внутри базы и отдавать готовый массив точек через HTTP-сервис 1С на простую веб-страницу с подключенной библиотекой карт.