Как получить координаты и название метки при клике на Яндекс-карте в 1С

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

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

Анализ проблемы взаимодействия 1С и JavaScript API

Разберем типичную ситуацию: в 1С используется поле HTML-документа, в которое загружена карта. Когда мы создаем метку (объект Placemark), мы ожидаем, что при нажатии на нее программа выдаст нам ее точное положение. Однако стандартное событие клика по карте map.events.add('click', ...) возвращает координаты точки нажатия на поверхности земли, а не свойства объекта, на который мы нажали. Если же мы пытаемся перехватить событие именно на метке, важно правильно обращаться к свойствам этого объекта.

Рассмотрим по шагам, как реализовать получение координат и названия метки, используя JavaScript API Яндекс.Карт версии 2.1 и выше.

Решение 1: Использование свойства target в обработчике событий

Основная ошибка при работе с метками заключается в попытке извлечь координаты напрямую из аргументов события, без обращения к самому объекту. Проанализируем правильный подход: при клике на метку API передает объект события, внутри которого содержится ссылка на саму метку через свойство target.

Для реализации этого механизма нам необходимо добавить обработчик события клика непосредственно на объект метки или на коллекцию объектов. Рассмотрим пример кода на JavaScript:


// Создаем метку
var myPlacemark = new ymaps.Placemark([55.76, 37.64], {
    balloonContent: 'Москва',
    iconContent: 'Центр'
}, {
    draggable: false
});

// Добавляем обработчик клика именно на метку
myPlacemark.events.add('click', function (e) {
    // Получаем объект, на котором произошло событие
    var target = e.get('target');
    
    // Извлекаем координаты метки
    var coords = target.geometry.getCoordinates();
    
    // Извлекаем название метки (из данных объекта)
    var name = target.properties.get('iconContent');
    
    // Передаем данные обратно в 1С
    sendDataTo1C(coords[0], coords[1], name);
});

// Добавляем метку на карту
myMap.geoObjects.add(myPlacemark);

В этом примере мы используем метод e.get('target'), который позволяет нам взаимодействовать именно с тем объектом, по которому щелкнул пользователь. Это критически важно, так как координаты самой метки зашиты в ее геометрии geometry.getCoordinates(), а не в координатах мыши в момент клика.

Решение 2: Получение названия и описания метки

Если нам нужно получить не только цифры (координаты), но и текстовое название, которое мы присвоили метке в 1С, нам следует обратиться к коллекции properties. Выясним, как это работает: при создании метки в 1С мы передаем структуру данных, которая в JS превращается в объект свойств.

Рассмотрим, как извлечь разные типы текстовой информации:

  1. iconContent — текст, отображаемый прямо на значке метки.
  2. balloonContent — содержимое всплывающей подсказки (балуна).
  3. hintContent — текст, всплывающий при наведении.

Пример кода для извлечения названия:


myPlacemark.events.add('click', function (e) {
    var target = e.get('target');
    // Получаем название, которое было задано при создании метки
    var objectName = target.properties.get('balloonContent') || target.properties.get('iconContent');
    
    // Если нужно получить координаты с фиксированной точностью
    var lat = target.geometry.getCoordinates()[0].toFixed(6);
    var lon = target.geometry.getCoordinates()[1].toFixed(6);
    
    console.log("Клик по объекту: " + objectName + " (" + lat + ", " + lon + ")");
});

Решение 3: Передача данных из JavaScript в 1С

Проанализируем ситуацию с передачей данных. Вызов функции getmyPlacemarkPosition внутри HTML-кода — это только половина дела. Нам нужно, чтобы 1С «услышала» этот вызов. В зависимости от версии платформы 1С используются разные методы.

В обычных формах и старых версиях платформы (через Internet Explorer) часто используется механизм скрытых полей. Мы записываем значения в input, а в 1С ловим событие ПриНажатии или анализируем документ через ЭлементыФормы.ПолеHTMLДокумента.Документ.getElementById(...).

Однако более современным и надежным способом является использование метода window.external. Посмотрим на пример функции отправки данных:


function sendDataTo1C(lat, lon, name) {
    // Формируем строку для передачи. Можно использовать разделитель, например "|"
    var resultString = lat + "|" + lon + "|" + name;
    
    // В 1С это вызовет событие "Notification" или может быть перехвачено через внешнее событие
    if (window.external && window.external.setResult) {
        window.external.setResult(resultString);
    } else {
        // Стандартный способ для работы с событием ПриНажатии в 1С
        document.getElementById('CoordX').value = lat;
        document.getElementById('CoordY').value = lon;
        document.getElementById('PointName').value = name;
        // Генерируем клик по скрытой кнопке, если нужно оповестить 1С
        document.getElementById('hiddenClicker').click();
    }
}

Оптимизация точности координат

Разберем важный технический нюанс: точность чисел. Метод toPrecision(15), который упоминался в обсуждении на форуме, выдает избыточную точность. Для практических целей (навигация, логистика, определение адреса дома) достаточно 6 знаков после запятой. Это обеспечивает точность позиционирования до нескольких сантиметров.

В 1С тип данных Число с высокой точностью может вести себя непредсказуемо при преобразовании из строки. Поэтому рекомендуется ограничивать точность на стороне JavaScript с помощью метода toFixed(6). Это упростит последующее сравнение координат в базе данных 1С.

Работа с событием перетаскивания (Drag-and-drop)

Если ваша задача — позволить пользователю не просто кликать, а уточнять местоположение метки, рекомендуем использовать событие dragend. Это позволит 1С автоматически обновлять координаты в объекте (например, в справочнике «Торговые точки»), когда пользователь передвигает метку мышкой.


// Разрешаем перетаскивание при создании
var myPlacemark = new ymaps.Placemark(coords, props, { draggable: true });

// Подписываемся на завершение перетаскивания
myPlacemark.events.add('dragend', function (e) {
    var newCoords = e.get('target').geometry.getCoordinates();
    sendDataTo1C(newCoords[0], newCoords[1], "Новые координаты");
});

Заключение

Для успешного получения данных из Яндекс-карты в 1С необходимо четко разделять события самой карты и события конкретных объектов. Помните, что объект-цель (target) — это ключ к получению свойств метки. Используйте коллекцию properties для доступа к названиям и geometry для доступа к координатам. Правильная обработка этих данных на стороне JavaScript и последующая передача через механизмы window.external или объектную модель документа (DOM) позволит создать бесшовную интеграцию между картой и вашей учетной системой.

← На главную