Как получить адрес и координаты при клике на API Яндекс.Карт в 1С?

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

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

Почему не удается напрямую считать свойства?

Когда мы пытаемся обратиться к объекту myPlacemark.geometry._coordinates или другим сложным структурам напрямую из 1С, платформа часто возвращает Неопределено или ошибку «внешний объект». Это происходит потому, что 1С не может автоматически сериализовать сложные внутренние типы данных JavaScript. Кроме того, переменные, объявленные внутри функции init, являются локальными и не видны за пределами скрипта карты.

Шаг 1: Правильная область видимости переменных

Чтобы 1С могла «дотянуться» до данных, их нужно вынести в глобальную область видимости вашего HTML-кода. Переменные должны быть объявлены вне функции ymaps.ready(init). Рассмотрим пример:


var myPlacemark;
var coordinates = {lat:0, lon:0};

ymaps.ready(init);
function init() {
    // Инициализация карты
    myMap = new ymaps.Map('map', { ... });
    
    myMap.events.add('click', function (e) {
        var coords = e.get('coords');
        // Обновляем глобальные переменные
        coordinates.lat = coords[0];
        coordinates.lon = coords[1];
        
        // Логика создания метки
        if (myPlacemark) {
            myPlacemark.geometry.setCoordinates(coords);
        } else {
            myPlacemark = createPlacemark(coords);
            myMap.geoObjects.add(myPlacemark);
        }
        getAddress(coords);
    });
}

Шаг 2: Обработка данных и асинхронность

Поскольку геокодирование — процесс, занимающий время, данные не появляются мгновенно. Использование «Обработчика ожидания» в 1С является простым способом дождаться заполнения полей. Давайте разберем, как получить данные в 1С.

Для начала, настройте в 1С ПодключитьОбработчикОжидания, который будет опрашивать поле HTML-документа. В процедуре обработки выполните следующее:


&НаКлиенте
Процедура ПолучитьДанныеКарты()
    // Получаем адрес и координаты из JS
    Адрес = Элементы.Карта.Документ.myPlacemark.properties._data.balloonContent;
    Широта = Элементы.Карта.Документ.coordinates.lat;
    Долгота = Элементы.Карта.Документ.coordinates.lon;
    
    Сообщить("Адрес: " + Адрес);
    Сообщить("Широта: " + Широта);
    Сообщить("Долгота: " + Долгота);
КонецПроцедуры

Шаг 3: Альтернативные методы передачи данных

Если обращение к полям напрямую кажется ненадежным, используйте создание простых JavaScript-переменных-посредников. Это позволит избежать работы с глубокими иерархиями объектов API Яндекса.

  1. Создайте в JavaScript переменную для хранения результата в виде простого типа (строки или числа).
  2. При завершении работы функции getAddress записывайте результат в эту переменную.
  3. В 1С считывайте только эту переменную.

Например, если вы хотите передать координаты как массив чисел, приведите их к строке или JSON-формату в JavaScript, а затем распарсите в 1С. Это значительно повысит стабильность обмена данными между контекстами.

Рекомендации по реализации

Для профессиональной разработки учитывайте следующие аспекты:

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

← На главную