Как показать интерактивную Яндекс-карту в 1С по координатам и исправить ошибки отображения

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

Интеграция интерактивных карт в интерфейс решений на платформе 1С:Предприятие — популярная задача, позволяющая автоматизировать работу логистов, менеджеров по продажам и курьерских служб. Однако разработчики часто сталкиваются с ситуацией, когда один и тот же HTML-код с подключенным API Яндекс.Карт отлично работает в обычном браузере, но отображает абсолютно белый экран в элементе формы 1С ПолеHTMLДокумента. Кроме того, при отправке кириллических адресов для геокодирования часто возникает ошибка, из-за которой система не может найти объект.

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

Шаг 1. Формирование HTML-кода для отображения интерактивной карты

Для начала рассмотрим базовый шаблон HTML-страницы, который мы будем загружать в наше ПолеHTMLДокумента. Карта инициализируется с помощью JavaScript API Яндекса. В коде мы указываем контейнер div с уникальным идентификатором map, задаем начальные координаты центра карты (например, Москву) и добавляем маркер (плейсмарк) с подсказкой.

Сформируем код внутри модуля 1С следующим образом:


HTMLТекст = "
|<!DOCTYPE html>
|<html>
|<head>
|    <title>Интерактивная карта Яндекс</title>
|    <meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8"" />
|    <!-- Настройка совместимости с IE -->
|    <meta http-equiv=""X-UA-Compatible"" content=""IE=edge"" />
|    <!-- Подключение API Яндекс.Карт -->
|    <script src=""https://api-maps.yandex.ru/2.1/?lang=ru_RU&apikey=ВАШ_API_КЛЮЧ"" type=""text/javascript""></script>
|    <script type=""text/javascript"">
|        ymaps.ready(init);
|        var myMap, myPlacemark;
|
|        function init(){ 
|            // Инициализация карты в блоке с id='map'
|            myMap = new ymaps.Map(""map"", {
|                center: [55.76, 37.64], // Координаты центра
|                zoom: 12
|            }); 
|            
|            // Создание и добавление метки на карту
|            myPlacemark = new ymaps.Placemark([55.76, 37.64], {
|                hintContent: 'Москва!',
|                balloonContent: 'Центральная точка объекта'
|            });
|            
|            myMap.geoObjects.add(myPlacemark);
|        }
|    </script>
|</head>
|<body>
|    <div id=""map"" style=""width: 100%; height: 400px;""></div>
|</body>
|</html>";

Обратите внимание, что мы используем современную версию API 2.1 вместо устаревшей версии 2.0-stable. Также в строку подключения скрипта необходимо обязательно передать параметр apikey, полученный в кабинете разработчика Яндекса. Без него интерактивная карта в закрытых корпоративных системах (к которым относится и 1С) работать не будет.

Шаг 2. Выясним причину, почему карта не отображается в 1С

Если вы сохраните приведенный выше код в локальный файл map.html и откроете его через обычный Chrome или Яндекс.Браузер, вы увидите работающую интерактивную карту. Однако при загрузке этой строки в 1С через команду Элементы.ПолеКарты.УстановитьТекст(HTMLТекст) на экране часто отображается пустота. Проанализируем технические причины этой проблемы.

  1. Режим эмуляции Internet Explorer в 1С. Компонент формы 1С ПолеHTMLДокумента под управлением ОС Windows использует движок Microsoft HTML (MSHTML), соответствующий Internet Explorer. По умолчанию, независимо от установленной в вашей системе версии IE, платформа 1С запускает этот движок в режиме эмуляции IE 7. Современные JavaScript-библиотеки Яндекс.Карт категорически не поддерживают стандарты IE 7, из-за чего выполнение скрипта прерывается в самом начале.
  2. Локальные ограничения безопасности. При передаче HTML-кода напрямую в элемент формы 1С создает временный файл на диске в директории Temp. При обращении к локальным файлам (протокол file://) встроенный браузер применяет жесткие правила безопасности, блокируя внешние HTTPS-запросы к серверам Яндекса.

Шаг 3. Способы решения проблем с отображением карты

Для исправления ситуации нам необходимо выполнить несколько шагов.

Во-первых, укажем встроенному браузеру, что страницу нужно рендерить с использованием самого современного доступного движка. Для этого в заголовок head нашего HTML-документа обязательно добавляем мета-тег совместимости:

<meta http-equiv="X-UA-Compatible" content="IE=edge" />

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

В реестре Windows по пути:

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

Необходимо создать параметр типа DWORD (32 бита) с именем 1cv8.exe и присвоить ему десятичное значение 11001 (что соответствует режиму работы IE 11 Edge). Это заставит встроенный браузер 1С корректно обрабатывать современный JS-код карт.

Шаг 4. Решение проблемы с геокодированием на русском языке

При работе с картами часто требуется динамически получать координаты объектов по их текстовому адресу (геокодирование). Разработчики часто сталкиваются с проблемой: при поиске адреса на латинице (например, "Moscow Tverskaya 7") геокодер Яндекса успешно возвращает результат, а при поиске на русском языке ("г.Москва ул.Тверская д.7") возвращается пустой ответ (параметр found: 0 в JSON- или XML-структуре).

Выясним причину этой проблемы. При отправке HTTP-запроса из 1С к серверам Яндекса кириллическая строка адреса должна быть закодирована в формате UTF-8 с использованием URL-Encoding (Percent-encoding). Если этого не сделать, платформа отправляет символы в кодировке Windows-1251 или в некорректной байтовой последовательности, из-за чего сервер Яндекса видит "кракозябры" вместо адреса.

Рассмотрим правильный пример отправки запроса к Геокодеру Яндекса из кода 1С с преобразованием строки:


// Исходный адрес для поиска
АдресКонтрагента = "г. Москва, ул. Тверская, д. 7";

// Обязательно кодируем строку адреса в формат URL (UTF-8)
ЗакодированныйАдрес = КодироватьСтроку(АдресКонтрагента, СпособКодированияСтроки.КодировкаURL);

// Формируем запрос к API Геокодера
СерверИсточник = "geocode-maps.yandex.ru";
ПутьЗапроса = "/1.x/?apikey=ВАШ_API_КЛЮЧ&format=json&results=1&geocode=" + ЗакодированныйАдрес;

НТТРСоединение = Новый HTTPСоединение(СерверИсточник, 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
НТТРЗапрос = Новый HTTPЗапрос(ПутьЗапроса);

Попытка
    HTTPОтвет = НТТРСоединение.Получить(НТТРЗапрос);
    Если HTTPОтвет.КодСостояния = 200 Тогда
        ТелоОтвета = HTTPОтвет.ПолучитьТелоКакСтроку("UTF-8");
        // Здесь выполняем парсинг полученной JSON-строки для извлечения координат
        // Координаты будут находиться по пути: response.GeoObjectCollection.featureMember[0].GeoObject.Point.pos
    КонецЕсли;
Исключение
    Сообщить("Ошибка подключения к серверу геокодирования: " + ОписаниеОшибки());
КонецПопытки;

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


Функция Транслитерировать(Адрес)
    Рез = СокрЛП(Адрес);   
    Рез = СтрЗаменить(Рез,"а","a");
    Рез = СтрЗаменить(Рез,"б","b");
    Рез = СтрЗаменить(Рез,"в","v");
    Рез = СтрЗаменить(Рез,"г","g");
    Рез = СтрЗаменить(Рез,"д","d");
    Рез = СтрЗаменить(Рез,"е","e");
    Рез = СтрЗаменить(Рез,"ё","e");
    Рез = СтрЗаменить(Рез,"ж","zh");
    Рез = СтрЗаменить(Рез,"з","z");
    Рез = СтрЗаменить(Рез,"и","i");
    Рез = СтрЗаменить(Рез,"к","k");
    Рез = СтрЗаменить(Рез,"л","l");
    Рез = СтрЗаменить(Рез,"м","m");
    Рез = СтрЗаменить(Рез,"н","n");
    Рез = СтрЗаменить(Рез,"о","o");
    Рез = СтрЗаменить(Рез,"п","p");
    Рез = СтрЗаменить(Рез,"р","r");
    Рез = СтрЗаменить(Рез,"с","s");
    Рез = СтрЗаменить(Рез,"т","t");
    Рез = СтрЗаменить(Рез,"у","u");
    Рез = СтрЗаменить(Рез,"ф","f");
    Рез = СтрЗаменить(Рез,"х","h");
    Рез = СтрЗаменить(Рез,"ч","ch");
    Рез = СтрЗаменить(Рез,"ш","sh");
    Рез = СтрЗаменить(Рез,"щ","sch");
    Рез = СтрЗаменить(Рез,"ъ","");
    Рез = СтрЗаменить(Рез,"ь","");
    Рез = СтрЗаменить(Рез,"э","e");
    Рез = СтрЗаменить(Рез,"ю","yu");
    Рез = СтрЗаменить(Рез,"й","i");
    Рез = СтрЗаменить(Рез,"ц","c");
    Рез = СтрЗаменить(Рез,"я","ya");
    Рез = СтрЗаменить(Рез,"ы","i");
    Рез = СтрЗаменить(Рез,"А","A");
    Рез = СтрЗаменить(Рез,"Б","B");
    Рез = СтрЗаменить(Рез,"В","V");
    Рез = СтрЗаменить(Рез,"Г","G");
    Рез = СтрЗаменить(Рез,"Д","D");
    Рез = СтрЗаменить(Рез,"Е","E");
    Рез = СтрЗаменить(Рез,"Ё","E");
    Рез = СтрЗаменить(Рез,"Ж","ZH");
    Рез = СтрЗаменить(Рез,"З","Z");
    Рез = СтрЗаменить(Рез,"И","I");
    Рез = СтрЗаменить(Рез,"К","K");
    Рез = СтрЗаменить(Рез,"Л","L");
    Рез = СтрЗаменить(Рез,"М","M");
    Рез = СтрЗаменить(Рез,"Н","N");
    Рез = СтрЗаменить(Рез,"О","O");
    Рез = СтрЗаменить(Рез,"П","P");
    Рез = СтрЗаменить(Рез,"Р","R");
    Рез = СтрЗаменить(Рез,"С","S");
    Рез = СтрЗаменить(Рез,"Т","T");
    Рез = СтрЗаменить(Рез,"У","U");
    Рез = СтрЗаменить(Рез,"Ф","F");
    Рез = СтрЗаменить(Рез,"Х","H");
    Рез = СтрЗаменить(Рез,"Ч","CH");
    Рез = СтрЗаменить(Рез,"Ш","SH");
    Рез = СтрЗаменить(Рез,"Щ","SCH");
    Рез = СтрЗаменить(Рез,"Ъ","");
    Рез = СтрЗаменить(Рез,"Ь","");
    Рез = СтрЗаменить(Рез,"Ы","I");
    Рез = СтрЗаменить(Рез,"Ц","C");
    Рез = СтрЗаменить(Рез,"Э","E");
    Рез = СтрЗаменить(Рез,"Ю","YU");
    Рез = СтрЗаменить(Рез,"Я","YA");
    Рез = СтрЗаменить(Рез,"Й","I");
    Возврат Рез;
КонецФункции

Тем не менее, правильным и надежным системным решением всегда является перевод запросов в формат UTF-8 с применением функции КодироватьСтроку(). Это позволит находить точные адреса по всей России без риска искажения названий при транслитерации.

Резюме

Для успешного вывода интерактивной Яндекс.Карты в 1С по координатам необходимо решить три ключевые задачи:

  1. Обязательно получить рабочий apikey в Кабинете разработчика Яндекса и указать его при загрузке API-скрипта в HTML.
  2. Включить режим поддержки современных стандартов браузера, добавив в HTML-заголовок директиву IE=edge и настроив ветку реестра FEATURE_BROWSER_EMULATION для исполняемого файла 1С.
  3. Правильно кодировать кириллические адреса при общении с геокодером через КодироватьСтроку(), чтобы избежать пустых ответов при поиске координат объектов.
← На главную