Как настроить взаимодействие JavaScript и 1С при использовании Google Maps в режиме эмуляции IE11

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

При разработке решений, интегрирующих внешние картографические сервисы, такие как Google Maps API, в программную среду 1С, разработчики часто сталкиваются с аппаратными ограничениями встроенного браузера. По умолчанию «Поле HTML документа» в 1С использует режим рендеринга устаревшего Internet Explorer 7. Поскольку современные API (включая Google Maps) требуют поддержки актуальных стандартов, нам необходимо принудительно переключить движок на IE11. Однако это влечет за собой серьезную проблему: привычные механизмы генерации событий, такие как fireEvent, перестают работать. Рассмотрим подробно, как правильно настроить систему и какие альтернативные способы передачи данных из JS в 1С существуют.

Настройка эмуляции версии браузера через реестр

Для начала разберем ситуацию, когда Google Maps выдает ошибку о неподдерживаемом браузере. Чтобы 1С начала использовать движок IE11, необходимо внести изменения в системный реестр Windows. Это делается через параметр FEATURE_BROWSER_EMULATION. Проанализируем, какие ключи и значения нам потребуются в зависимости от разрядности операционной системы и платформы 1С.

Вам необходимо создать параметр типа DWORD с именем исполняемого файла 1С (например, 1Cv8c.exe для тонкого клиента или 1Cv8.exe для толстого клиента) и установить значение 11000 (для IE11) или 11001 (для использования режима Edge). Посмотрим на пути к веткам реестра:

  1. Для 64-разрядной Windows с установленной 32-разрядной 1С:
    HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION
  2. Для 64-разрядной Windows с 64-разрядной 1С или для 32-разрядной системы:
    HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

Дополнительно в самом HTML-коде, который загружается в 1С, крайне желательно указать мета-тег совместимости:

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

Проблема передачи событий через dispatchEvent

Когда мы переводим страницу в режим IE11, стандартная модель событий Internet Explorer (так называемый Quirks Mode) заменяется на современную модель DOM Level 3. В старых версиях (IE7-9) для связи с 1С использовался метод fireEvent, который инициировал событие onhelp. Платформа 1С «слушала» это событие через COM-интерфейсы и вызывала соответствующую процедуру в коде 1С.

Рассмотрим код, который часто пытаются использовать разработчики при переходе на IE11:


var evt = document.createEvent('Event');        
evt.initEvent('onhelp', false, false);          
document.body.dispatchEvent(evt);

Проанализируем причину, по которой этот код не работает. Несмотря на то, что JavaScript выполняет генерацию события корректно, 1С не получает уведомление. Это происходит потому, что внутренняя реализация объекта ПолеHTMLДокумента в 1С (особенно в старых релизах платформы) жестко завязана на старую событийную модель. Метод dispatchEvent создает событие, которое «живет» только внутри объектной модели браузера и не пробрасывается наружу в COM-обертку так, как это делал специфичный для Microsoft метод fireEvent.

Способ 1: Использование изменения заголовка документа

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

В JavaScript мы пишем простую функцию для отправки данных:


function sendTo1C(data) {
    document.title = "v8data:" + data;
}

На стороне 1С в управляемой форме нам необходимо подписаться на событие поля HTML-документа ОбновлениеОтображения или использовать обработчик ожидания, который будет проверять свойство Заголовок (Title) документа. Однако эффективнее использовать событие ПриНажатии или программный перехват изменения свойств объекта через Документ.parentWindow.

Способ 2: Навигация по фиктивным URL

Еще один надежный метод — изменение window.location.href. Мы можем имитировать переход по адресу, который содержит наши данные. 1С перехватывает попытку перехода, и мы можем отменить ее, предварительно прочитав параметры.

В коде JavaScript реализуем следующую логику:


function triggerEvent(action, params) {
    window.location.href = "1cevent://" + action + "?" + JSON.stringify(params);
}

В модуле формы 1С используем событие ПередУстановкойТекста или ПриНажатии (в зависимости от контекста и версии платформы). Рассмотрим пример обработки в 1С:


&Процедура ПолеHTMLДокументаПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
    URL = ДанныеСобытия.Href;
    Если Найти(URL, "1cevent://") > 0 Тогда
        СтандартнаяОбработка = Ложь; // Отменяем переход
        // Парсим URL и выполняем нужную логику
        Сообщить("Данные из JS получены: " + URL);
    КонецЕсли;
КонецПроцедуры

Способ 3: Переход на современный движок Chromium (1С 8.3.14+)

Разберем наиболее радикальный и правильный в современных условиях путь. Начиная с версии 8.3.14, фирма 1С добавила возможность использовать современный движок на базе Chromium. Это полностью избавляет от проблем с реестром и устаревшим fireEvent.

Чтобы активировать этот режим, в свойствах конфигурации установите «Режим использования встроенного браузера» в значение «Chromium». После этого для взаимодействия с 1С следует использовать объект window.1c.

Пример отправки сообщения из JavaScript в новом режиме:

window.1c.postMessage("Любая строка данных или JSON");

В 1С это сообщение будет поймано в событии СообщениеИзДанных. Это штатный, быстрый и безопасный механизм, который поддерживает современные стандарты JS, необходимые для Google Maps.

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

Проанализировав ситуацию, можно сделать следующие выводы. Если вы вынуждены работать на старых версиях платформы через эмуляцию IE11, откажитесь от попыток использовать dispatchEvent(onhelp). Вместо этого выберите метод с изменением document.title или фиктивной навигацией.

Если же есть возможность обновить платформу, переходите на движок Chromium. Это решит проблемы с Google Maps API раз и навсегда, так как этот движок поддерживает WebGL и последние спецификации ECMAScript, необходимые для корректной отрисовки карт и работы скриптов оптимизации маршрутов.

← На главную