OpenStreetMap (OSM) в 1С - вывод карты, указание маркеров, построение маршрутов

14.04.24

Интеграция - WEB-интеграция

В этой статье разберем ряд базовых приемов при работе с бесплатными картами OpenStreetMap в 1С: вывод карты на форму, интерактивное указание маркеров на карте, а также построение маршрутов сразу между несколькими точками.

Бесплатные

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Бесплатно
OpenStreetMap (OSM) в 1С - вывод карты, указание маркеров, построение маршрутов
.epf 14,40Kb
376 Скачать бесплатно

Карты OpenStreetMap (OSM) представляют собой хорошую альтернативу таким популярным решениям, как Яндекс Карты и Google Maps. Их главное преимущество это, конечно, open source. Для работы с этими картами не нужно нигде регистрироваться, получать API ключ или подвязывать банковскую карту. Хотя движок под эти карты все же несколько устарел по сравнению с конкурентами, однако применительно к миру 1С это даже может стать неким плюсом, так как вам не нужно будет беспокоиться о том, сможет ли ваша версия платформы "потянуть" отображение этих карт, а такая проблема может у вас возникнуть, особенно при работе с Google картами и Яндекс Картами версии 3.

Теперь приступим к делу. Поставим перед собой следующую задачу, которую решим в рамках этой статьи с помощью средств OSM: необходимо создать обработку, в форме которой будет отображаться карта, спозиционированная по умолчанию в центре города, где работает наш клиент. При нажатии на карту в той или иной точке на ней должен установиться специальный маркер. Маркеров можно установить сразу несколько, после чего необходимо построить и вывести на карту оптимальный маршрут проезда между этими точками.

Вывод карты

Создаем новую внешнюю обработку, в которую добавляем макет с типом "HTML документ". Вся логика работы с картами будет прописана именно здесь. Для начала поместим сюда следующий текст HTML:
 

<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>OpenStreetMap</title>
    <style>
      /* В блоке style мы разместим все CSS стили для корректного и красивого отображения на карте всех элементов*/
      #map {
        height: 100%;
      }

      html,
      body {
        height: 100%;
        margin: 0;
        padding: 0;
      }
    </style>
  </head>
  <body>
    <div id="map"></div>

    <script>
      // Здесь мы разместим все переменные и функции на языке JavaScript, необходимые для работы с картами и взаимодействия с 1С
    </script>
  </body>
</html>


Это всего лишь заготовка нашего документа с пустым div с идентификатором "map", внутри которого и будет чуть позже размещена наша карта. Тут нужно обратить внимание на два блока с тегами style и script. Внутри тега style мы поместим все наши стили CSS, необходимые для корректного и более-менее симпатичного отображения на карте всех интересующих на элементов. Так, прямо сейчас мы разместили там две инструкции, благодаря которым наша карта в будущем будет отображаться на полный экран или, если точнее, то на все HTML поле, которое мы разместим позже на форме. В теге же script мы разместим все функции и переменные на языке JavaScript, которые нам понадобятся не только для работы с картами, но и для последующего взаимодействия с 1С.

Приступим, собственно, к инициализации карты OSM. Для отрисовки карты OSM используется библиотека Leaflet. Чтобы подключить ее к нашему HTML документу необходимо поместить в тег head специальные ссылки на сторонние файлы CSS и JS от Leaflet, а в теге scripts прописать код инициализации карты. Изменения в тексте HTML обрамлены комментариями.
 

<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>OpenStreetMap</title>
    <!-- ++ -->
    <link
      rel="stylesheet"
      href="/redirect.php?url=aHR0cHM6Ly91bnBrZy5jb20vbGVhZmxldEAxLjkuNC9kaXN0L2xlYWZsZXQuY3Nz"
      integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY="
      crossorigin=""
    />
    <script
      src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"
      integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo="
      crossorigin=""
    ></script>
    <!-- -- -->
    <style>
      #map {
        height: 100%;
      }

      html,
      body {
        height: 100%;
        margin: 0;
        padding: 0;
      }
    </style>
  </head>
  <body>
    <div id="map"></div>
    <script>
      // ++
      const map = L.map("map", { attributionControl: false }).setView(
        [52.0317, 113.501],
        13
      );

      const tiles = L.tileLayer(
        "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
        {
          maxZoom: 19,
        }
      ).addTo(map);
      // --
    </script>
  </body>
</html>

 

Чуть подробнее остановимся на инициализации карты.
 

const map = L.map("map", { attributionControl: false }).setView(
  [52.0317, 113.501],
  13
);

const tiles = L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", {
  maxZoom: 19,
}).addTo(map);

 

Объект L был создан автоматически благодаря ссылкам Leaflet, которые мы включили в заголовки HTML документа. Теперь мы используем его для создания карты внутри div с идентификатором "map" и сразу задаем центр нашей карты (setView) на координатах города клиента (массив с широтой и долготой [52.0317, 113.501]), а также устанавливаем зум на 13 единиц.

После этого мы создаем слой карты OSM (tileLayer), который и подвязываем к нашей карте Leaflet.

Достаточно переключиться на вкладку "Просмотр" HTML документа, чтобы убедиться, что все сделано правильно.

 

Установка маркеров с самописными иконками

Добавим в наш пример возможность добавления нескольких маркеров одновременно. Кроме того, немного усложним задачу и будем выводить не стандартную иконку маркера от Leaflet, а свою собственную.

Сначала создаем переменную массива "markers", где будем хранить координаты всех наших маркеров, а также переменную markerIcon для нашего самописного маркера.
 

let markers = [];

const markerIcon = new L.DivIcon({
  className: "marker",
  html: `<img src="marker.png" style="width:20px; height: 20px"/>`,
  iconSize: [35, 35],
});


Как видно, маркер использует класс CSS "marker". Добавим и его описание в тег style.
 

...

.marker {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 40px;
  height: 40px;
  font-size: medium;
  font-weight: 700;
  border-radius: 50%;
  background-color: #fff;
  border: solid 3px;
  border-color: #5158bb;
  color: #5158bb;
}

...

Кроме того, в маркере используется картинка "marker.png". На самом деле это всего лишь заглушка, так как в рамках 1С мы не можем подключать сторонние локальные файлы в HTML документ. Поэтому внутри обработки мы позже программно заменим упоминание этой картинки на двоичные данные. Картинку же нашей иконки мы заранее добавим в обработку в качестве макета двоичных данных.

Теперь добавляем событие клика мышкой на карту (onMapClick) - при каждом клике мы будем добавлять на карту новый маркер с нашей иконкой, а также добавлять этот маркер в массив markers.

Кроме этого мы добавим две функции "getLastMarkerLocation" и "removeAllMarkers". Первая функция будет возвращать координаты последнего установленного на карту маркера, а вторая удалит все маркеры с карты. Обе эти функции мы будем вызывать из 1С.

function onMapClick(e) {
  addMarker(e.latlng);
}

function addMarker(latlng) {
  const marker = L.marker(latlng, { icon: markerIcon }).addTo(map); // Создаем новый маркер
  map.panTo(marker.getLatLng()); // Центрируем карту на маркере
  markers.push(marker); // Сохраняем маркер в массиве маркеров
}

map.on("click", onMapClick); // Привязываем функцию onMapClick к карте

function getLastMarkerLocation() {
  // Эта функция используется для того, чтобы вернуть координаты последнего созданного маркера в 1С
  if (markers.length === 0) return null;
  const latlng = markers[markers.length - 1].getLatLng();
  return [latlng.lat, latlng.lng];
}

function removeAllMarkers() {
  // Маркеры удаляются с карты поочередно внутри цикла
  for (i = 0; i < markers.length; i++) {
    map.removeLayer(markers[i]);
  }
  markers = []; // Очищаем массив
}


Как видно из кода, новый маркер с самописной иконкой инициализируется с помощью конструкции L.marker(latlng, { icon: markerIcon }).

Метод же map.panTo() вызывается, чтобы сразу после добавления на карту нового маркера центрирвать на нем всю карту.

Итак, пора приступать к работе непосредственно в 1С. В рамках этой статьи мы не будем подробно останавливаться на всех моментах разработки формы - все это довольно просто, кроме того при желании вы можете скачать прикрепленную к статье обработку и самостоятельно изучить, как она устроена. Сфокусируемся только на самых важных моментах.

Создаем реквизит формы "ПолеHTML" с типом неограниченной строки и выводим его на форму с видом отображения "Поле HTML документа". При создании формы мы получаем текст нашего HTML документа из макета обработки, заменяем в нем заглушку картинки иноки ("marker.png") на двоичные данные нашей картинки, которую предварительно зашифровываем в base64, и присваиваем итоговый текст реквизиту "ПолеHTML".

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	ИнициализироватьКарту();
	
КонецПроцедуры

&НаСервере
Процедура ИнициализироватьКарту()
	
	Значение = РеквизитФормыВЗначение("Объект");
	
	ТекстHTML = Значение.ПолучитьМакет("ШаблонКартыHTML").ПолучитьТекст();
	ДвоичныеДанные = Значение.ПолучитьМакет("ДвоичныеДанныеМаркера");
	
	ТекстHTML = СтрЗаменить(ТекстHTML, "marker.png", "data:image/png;base64," + ДвоичныеДанныеВBase64(ДвоичныеДанные));
		
	ПолеHTML = ТекстHTML;	
		
КонецПроцедуры

&НаСервереБезКонтекста
Функция ДвоичныеДанныеВBase64(ДвоичныеДанные)

	ЗашифрованнаяКартинка = Base64Строка(ДвоичныеДанные);
	ЗашифрованнаяКартинка = СтрЗаменить(ЗашифрованнаяКартинка, Символы.ВК, "");
	ЗашифрованнаяКартинка = СтрЗаменить(ЗашифрованнаяКартинка, Символы.ПС, "");

	Возврат ЗашифрованнаяКартинка

КонецФункции


После каждого клика на карту мы хотим получать координаты выбранной точки и отображать их в таблице на форме. Для этого у поля HTML документа объявляем событие "ПриНажатии", в котором вызываем упомянутую выше функцию JavaScript "getLastMarkerLocation". Делается это следующим образом.
 

&НаКлиенте
Процедура ПолеHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
	
	Координаты = Элементы.ПолеHTML.Документ.defaultView.getLastMarkerLocation(); 
	Если Координаты = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ТочкаМаршрута = ТочкиМаршрута.Добавить();
	ТочкаМаршрута.Широта = Координаты["0"]; 
	ТочкаМаршрута.Долгота = Координаты["1"];
	
КонецПроцедуры 

Обратите внимание, что в при трансляции возвращаемого значения из функции JavaScript в значение 1С мы получаем не привычный нам массив, а объект с типом "ВнешнийОбъект", для получения значения по индексу, из которого используется не числовое представление индекса, а строковое.

Для удаления всех маркеров с карты вызываем функцию "removeAllMarkers" аналогичным образом.
 

&НаКлиенте
Процедура ОчиститьМаршрут(Команда)

	ТочкиМаршрута.Очистить();  
	
	Элементы.ПолеHTML.Документ.defaultView.removeAllMarkers();
	
КонецПроцедуры


Открываем обработку и проверяем результат:


Построение маршрута между точками

Переходим к самой интересной части задачи, а именно к построению маршрута. Сразу замечу, что при построении и оптимизации маршрута мы не ограничены в нашем инструментарии: можно воспользоваться и Google Routes API, и API от Яндекса. Использование карт OSM не накладывает на нас в этом плане никаких ограничений. Однако в рамках этой задачи мы все же прибегнем к помощи родственного сервиса, а именно Leaflet Routing Machine. Этот инструмент тоже бесплатный и очень дружелюбный к разработчикам, так как прямо из коробки нам предоставляется доступ к демо сервису оптимизации маршрутов OSRMоднако на реальных боевых задачах OSRM нужно разворачивать самостоятельно на отдельном сервисе.

Так же, как и в случае с Leaflet, для работы с Leaflet Routing Machine нужно подключить ссылки CDN в заголовки HTML документа.
 

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>OpenStreetMap</title>
  <link
    rel="stylesheet"
    href="/redirect.php?url=aHR0cHM6Ly91bnBrZy5jb20vbGVhZmxldEAxLjkuNC9kaXN0L2xlYWZsZXQuY3Nz"
    integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY="
    crossorigin=""
  />
  <script
    src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"
    integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo="
    crossorigin=""
  ></script>
<!-- ++ -->
  <script
    src="https://cdnjs.cloudflare.com/ajax/libs/leaflet-routing-machine/3.2.12/leaflet-routing-machine.min.js"
    integrity="sha512-FW2A4pYfHjQKc2ATccIPeCaQpgSQE1pMrEsZqfHNohWKqooGsMYCo3WOJ9ZtZRzikxtMAJft+Kz0Lybli0cbxQ=="
    crossorigin="anonymous"
    referrerpolicy="no-referrer"
  ></script>
  <link
    rel="stylesheet"
    href="/redirect.php?url=aHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbGVhZmxldC1yb3V0aW5nLW1hY2hpbmUvMy4yLjEyL2xlYWZsZXQtcm91dGluZy1tYWNoaW5lLmNzcw=="
    integrity="sha512-eD3SR/R7bcJ9YJeaUe7KX8u8naADgalpY/oNJ6AHvp1ODHF3iR8V9W4UgU611SD/jI0GsFbijyDBAzSOg+n+iQ=="
    crossorigin="anonymous"
    referrerpolicy="no-referrer"
  />
<!-- -- -->


Теперь добавляем в наш HTML документ новые функции и переменные для работы с маршрутами.

let routingControl;
let markers = [];
let distance = 0;
let time = 0;
let instructions;

function buildRoute() {
  // Инициализация объекта маршрутизации routingControl
  routingControl = L.Routing.control({
    waypoints: markers.map((marker) => marker.getLatLng()),
    createMarker: function () {
      return null;
    },
    language: "ru",
    lineOptions: {
      styles: [{ color: "#5158bb", opacity: 1, weight: 5 }],
    },
    // Здесь указываем адрес нашего сервиса OSRM. Если не указан, то будет использован демо-сервис
    // router: L.Routing.osrmv1({
    //   serviceUrl: `http://router.project-osrm.org/route/v1/`,
    // }),
  }).addTo(map);

  routingControl.on("routesfound", function (e) {
    distance = e.routes[0].summary.totalDistance;
    time = e.routes[0].summary.totalTime;
    instructions = e.routes[0].instructions;
  });
}

function getRouteInfo() {
  return JSON.stringify({
    distance,
    time,
    instructions,
  });
}

function removeRouting() {
  if (routingControl) {
    map.removeControl(routingControl);
    routingControl = undefined;
    distance = 0;
    time = 0;
    instructions = undefined;
  }
}


Подробно остановимся на объекте "routingControl", при инициализации которого и происходит построение и отрисовка оптимального маршрута на карте. В конструктор L.Routing.control передаются следующие значения:

  • waypoints - собственно точки, через которые должен проехать маршрут
  • createMarker - так как мы используем собственные маркеры, то это свойство конструктора мы переписываем таким образом, чтобы оно возвращало нам пустое значение
  • language - язык текстовых инструкций по маршруту, например, таких как "Поверните направо" или "Продолжайте движение вперед" и т.д.

  • lineOptions - стиль линии маршрута

Подробнее обо всех доступных свойствах объекта можно прочитать в документации.

Кроме того, для объекта определяется событие "routesfound". Оно нужно нам, чтобы после отрисовки маршрута сохранить в соответствующих переменных такую информацию о маршруте, как приблизительное время прохождения, дистанцию, а также подробную инструкцию по прохождению маршрута. Для того чтобы получить эти значения позже в 1С, используется функция "getRouteInfo", причем ответ для удобства возвращается в формате JSON. Функция же "removeRouting" используется, чтобы удалить построенный маршрут с карты.

В 1С же добавляем следующие процедуры и функции, для того чтобы вызвать описанные выше функции JS:
 

&НаКлиенте
Процедура ПостроитьМаршрут(Команда)
	
	Элементы.ПолеHTML.Документ.defaultView.buildRoute();
	
КонецПроцедуры

&НаКлиенте
Процедура ПолучитьИнформациюОМаршруте(Команда)   
	
	ИнформацияОМаршрутеJSON = Элементы.ПолеHTML.Документ.defaultView.getRouteInfo();
	ПрочитатьИнформациюОМаршрутеИзJSON(ИнформацияОМаршрутеJSON);

КонецПроцедуры

&НаКлиенте
Процедура ОчиститьМаршрут(Команда)

	// Эту процедуру дополняем в соответствии с последними изменениями.

	ТочкиМаршрута.Очистить();  
	Инструкции.Очистить();
	ВремяВПути = 0;
	Дистанция = 0;
	
	Элементы.ПолеHTML.Документ.defaultView.removeAllMarkers();
	Элементы.ПолеHTML.Документ.defaultView.removeRouting();
	
КонецПроцедуры

&НаСервере
Функция ПрочитатьИнформациюОМаршрутеИзJSON(ИнформацияОМаршрутеJSON)

	ИнформацияОМаршруте = ПолучитьЗначениеИзJSON(ИнформацияОМаршрутеJSON);	
	ВремяВПути = ИнформацияОМаршруте.time;   
	Дистанция = ИнформацияОМаршруте.distance;
	
	Инструкции.Очистить();
	
	Для Каждого Структура Из ИнформацияОМаршруте.instructions Цикл
		СтрокаИнструкции = Инструкции.Добавить();  
		СтрокаИнструкции.Улица = Структура.road;
		СтрокаИнструкции.Текст = Структура.text;
	КонецЦикла;

КонецФункции

&НаСервереБезКонтекста
Функция ПолучитьЗначениеИзJSON(JSON)

	ЧтениеJSON = Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(JSON);
	
	Возврат ПрочитатьJSON(ЧтениеJSON);
	
КонецФункции 


Проверяем результат:



Вместо заключения

Эта статья подошла к концу. Мы вместе прошлись по ряду базовых возможностей OpenStreetMap и Leaflet. Хотя, конечно, функционал Leaflet на этом далеко не заканчивается, тем не менеее надеюсь, что все описанные выше приемы работы вы сможете применить в деле, а в качестве бонуса к статье прилагается готовая обработка. Протестировано на платформе 8.3.23.2040.

Вступайте в нашу телеграмм-группу Инфостарт

Карты Leaflet OpenStreetMap OSM Leaflet Routing Machine построение маршрутов маркеры

См. также

Оптовая торговля Розничная торговля WEB-интеграция 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

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

57600 руб.

26.11.2024    5656    4    3    

7

WEB-интеграция Программист Бизнес-аналитик 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

14400 руб.

20.12.2024    3088    16    2    

17

WEB-интеграция Анализ продаж Системный администратор Программист Пользователь 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Управленческий учет Платные (руб)

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

60000 руб.

07.05.2019    38233    73    45    

31

WEB-интеграция 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Оптовая торговля, дистрибуция, логистика Россия Платные (руб)

В расширении реализован механизм интеграции между системой поставщика и Личным кабинетом СДТ. Реализован обмен заказами и реализациями (накладными), предусмотрено отслеживание статусов документов. Расширение предназначено для 1С:УТ 11.4.

35856 руб.

27.11.2024    1608    1    0    

1

Обмен с ГосИС WEB-интеграция Бухгалтер Пользователь 1С v8.3 Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:Документооборот 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

3000 руб.

28.04.2016    96917    109    218    

359
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Asmody 14.04.24 21:45 Сейчас в теме
Всё хорошо, только вы на сайте или в репозитории leafletjs давно были?

Инфостарт, давая на неё ссылку и рекомендуя к использованию, оказывает автору библиотеки поддержку?
soci0pat; user1089832; +2 Ответить
3. timka05 15.04.24 10:45 Сейчас в теме
(1) Ну не всегда 1С-ник разбирается в js настолько, чтобы оказать помощь разработчику библиотеки. Да и не обязательно это вроде бы.
4. egorka11 15.04.24 11:10 Сейчас в теме
5. egorka11 15.04.24 11:12 Сейчас в теме
(1) И какую же поддержку? С таким подходом вы уже должны были выкинуть половину софта со своих устройств
2. xzorkiix 35 15.04.24 10:11 Сейчас в теме
(1) https://github.com/Leaflet/Leaflet влажные фантазии в преамбуле можно пропустить, и просто брать релизы в работу. OSM позиционирует именно leafletjs как фреймворк для разработки\интеграции карт на сайте.
6. egorka11 15.04.24 11:14 Сейчас в теме
А вот делать нехорошо: attributionControl: false

Если уж рекомендуете OSRM самому поднимать, то и тайлы тоже
7. semenovsv 23.05.24 14:28 Сейчас в теме
В УТ 11.5 почему то адреса не определяются, при построении маршрута.
Прикрепленные файлы:
8. KamranV21 337 06.06.24 15:35 Сейчас в теме
(7) Адреса должны определиться при нажатии на кнопку "Получить информацию о маршруте". Т.е. сначала нужно нажать на кнопку "Построить маршрут", а уже затем на "Получить информацию о маршруте".
9. jeksis 02.07.24 17:00 Сейчас в теме
У меня почему-то на последней платформе 8.3.24.1586 не работает, на 8.3.23.1688 пробовал, тоже самое - просто серый экран вместо карты. При этом, Chrome, Edge - все ок. Куда копать?
10. srt2020 22.07.24 12:05 Сейчас в теме
Точки маршрута нужно только мышкой тыкать? Из справочника Контрагенты никак нельзя добавлять?
user2153113; +1 Ответить
11. user1355308 17.09.24 16:46 Сейчас в теме
Круто, спасибо! А подскажите, а как добавить поле поиск? Чтобы человек самостоятельно внес адрес и карта сфокусировалась бы на точке?
user2153113; +1 Ответить
12. ASA1970 05.11.24 11:17 Сейчас в теме
Еще год назад сделал АРМ логистики для создания маршрутных листов на основе заказов клиента с использованием ОпенСтритМапа ))) Плюс оптимизация маршрута. Плюс цвета транспортных средств и маркеров заказов на этих ТС. Код открытый для заказчика, который оплачивал работу )))
13. ASA1970 05.11.24 11:23 Сейчас в теме
А как решал вопрос вывода нескольких маркеров по одной гео-координате? ))) Они же наложатся друг на друга (((
14. PitMal 10 13.01.25 08:07 Сейчас в теме
Всем привет! Перенес базу с обработкой на новое рабочее место и вместо карты квадраты :(, версия 1С 8.3.25 на новом месте. и на старом такая же....
16. vlad_a_p 25.03.25 20:21 Сейчас в теме
(14)
это не ты перенес это чтото сломалось в работе - у меня тоже квадраты. часть заполнена а часть пустая и ничего не работает.
HEEEEEELP куда копать, что сломалось?
17. 1c_uZer 26.03.25 12:41 Сейчас в теме
(16) Добрый день. Удалось пофиксить?)
18. vlad_a_p 26.03.25 13:26 Сейчас в теме
(17)
https://forum.infostart.ru/forum9/topic324842/#message3153391
в этой ветке в конце дают здравый совет.
еще не проверял.
19. 1c_uZer 26.03.25 13:43 Сейчас в теме
(18) СПасибо. Ознакомимся)
20. PitMal 10 27.03.25 06:26 Сейчас в теме
(16)
(14)
(18)
(17)
(14) Отвечу сам себе... и всем с проблемой разобрался, проблема была в загружаемых стилях, в отладчике 1C открываем документ html вместо стиля видим иероглифы (файл Отладка)...
загружаем стиль такой строкой :
[*]

карта нормальная (файл отладка2). Если помогло ставь лайк :)
Прикрепленные файлы:
15. sashapere 160 02.02.25 23:47 Сейчас в теме
21. user736038 07.04.25 21:09 Сейчас в теме
Приветствую!
Коллеги походу я к вечеру на ручниках...

При открытии в режиме предприятия получаю ВОТ ТАК (см. картинку) а если Тело этого самого ХТМЛ перенести в файл и пнуть его из браузера - все прекрасно, даже флажки ставит.
Прикрепленные файлы:
22. Viking 04.07.25 11:15 Сейчас в теме
Добрый день, подскажите как загрузить массив точек (координат) на карту, чтобы можно было построить маршрут, не кликая на карту?
user2153113; +1 Ответить
23. DmitryNZ 13.07.25 09:23 Сейчас в теме
У кого "рваная карта" - ошибка ещё может каким то образом быть связана с версией библиотеки LeefLeet. Я заменил ссылку на библиотеку в шапке на и теперь всё отображается как должно.
24. mikukrnet 182 18.08.25 18:51 Сейчас в теме
(23) что именно надо заменить?
25. DmitryNZ 27.08.25 21:22 Сейчас в теме
(24) Я много с бубном натанцевался в итоге... Проблема крылась в том что по какой-то причине не корректно подтягиваются стили если они прописаны в макете ссылкой. Решилась следующим образом:

Убрал ссылку на стили (в теге style) leaflet из HTML-макета, при этом скачал их и загрузил в 1С в качестве общего текстового макета. В HTML-макете в тег style поместил параметр:

<st yle>
   ##LeafletCSS##
</style>


Далее перед присвоением текста полю HTML текста макета заменял этот параметр на библиотеку стилей:

ТекстHTML = ПолучитьОбщийМакет("МакетHTML").ПолучитьТекст();
ТекстCSS = ПолучитьОбщийМакет("МакетCSS").ПолучитьТекст();
ТекстHTML = СтрЗаменить(ТекстHTML, "##LeafletCSS##", ТекстCSS);

ПолеHTML = ТекстHTML;


Готово. Ваша карта отображается корректно. Можно конечно сразу в макете HTML вывалить все стили, но на мой взгляд это черезчур громоздко.
Для отправки сообщения требуется регистрация/авторизация