Интеграция интерактивных карт в формы 1С — задача востребованная, но при реализации обмена данными между JavaScript и платформой 1С разработчики часто сталкиваются с трудностями. Основная проблема заключается в асинхронной природе JavaScript и ограничениях доступа 1С к внутренним свойствам объектов JS. В этой статье мы разберем, как правильно организовать передачу адреса и координат из браузерного компонента в 1С.
Когда мы пытаемся обратиться к объекту myPlacemark.geometry._coordinates или другим сложным структурам напрямую из 1С, платформа часто возвращает Неопределено или ошибку «внешний объект». Это происходит потому, что 1С не может автоматически сериализовать сложные внутренние типы данных JavaScript. Кроме того, переменные, объявленные внутри функции init, являются локальными и не видны за пределами скрипта карты.
Чтобы 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);
});
}
Поскольку геокодирование — процесс, занимающий время, данные не появляются мгновенно. Использование «Обработчика ожидания» в 1С является простым способом дождаться заполнения полей. Давайте разберем, как получить данные в 1С.
Для начала, настройте в 1С ПодключитьОбработчикОжидания, который будет опрашивать поле HTML-документа. В процедуре обработки выполните следующее:
&НаКлиенте
Процедура ПолучитьДанныеКарты()
// Получаем адрес и координаты из JS
Адрес = Элементы.Карта.Документ.myPlacemark.properties._data.balloonContent;
Широта = Элементы.Карта.Документ.coordinates.lat;
Долгота = Элементы.Карта.Документ.coordinates.lon;
Сообщить("Адрес: " + Адрес);
Сообщить("Широта: " + Широта);
Сообщить("Долгота: " + Долгота);
КонецПроцедуры
Если обращение к полям напрямую кажется ненадежным, используйте создание простых JavaScript-переменных-посредников. Это позволит избежать работы с глубокими иерархиями объектов API Яндекса.
getAddress записывайте результат в эту переменную.Например, если вы хотите передать координаты как массив чисел, приведите их к строке или JSON-формату в JavaScript, а затем распарсите в 1С. Это значительно повысит стабильность обмена данными между контекстами.
Для профессиональной разработки учитывайте следующие аспекты:
ВнешнееСобытие. Это предпочтительнее, чем «Обработчик ожидания», так как позволяет JavaScript «сигнализировать» 1С о том, что данные готовы, без циклического опроса.init. Если переменная вынесена в глобальную область, используйте её во всех функциях напрямую.Следуя этим простым шагам, вы сможете организовать надежное получение адресов и координат при клике на Яндекс.Картах в любой конфигурации 1С, использующей ПолеHTMLДокумента. Если в отладчике 1С вы видите, что данные передаются как «внешний объект», убедитесь, что вы обращаетесь именно к примитивному значению (строке или числу), а не к объекту geometry целиком.