Как заставить работать событие ПолеHTMLПриНажатии в мобильном приложении 1С на Android?

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

При разработке мобильных приложений на платформе 1С:Предприятие часто возникает потребность в создании кастомного интерфейса с использованием HTML и JavaScript. Однако разработчики сталкиваются с неприятной особенностью: событие ПолеHTMLПриНажатии, которое прекрасно работает в тонком клиенте на Windows, на мобильном устройстве (или эмуляторе) Android попросту не реагирует на клики. В этой статье мы подробно разберем, почему это происходит, и изучим проверенные механизмы настройки взаимодействия между HTML-контентом и кодом 1С.

Выясним причину проблемы: механика WebView в Android

Для начала проанализируем ситуацию. В десктопной версии 1С (Windows) для отображения HTML используется движок Internet Explorer (или современные компоненты на базе Chromium), которые транслируют практически любое взаимодействие с DOM-моделью в события платформы. В мобильной же платформе на базе Android за отображение отвечает системный компонент WebView.

Важный нюанс: в мобильной версии событие ПолеHTMLПриНажатии перехватывается платформой 1С не как абстрактный «клик» по любому элементу, а именно как попытка перехода по навигационной ссылке. Если вы нажимаете на элемент div, span или даже на ссылку с пустым атрибутом href="#", Android WebView может не расценить это как навигацию, требующую уведомления внешнего приложения. Следовательно, обработчик в 1С не получает сигнал, и точка останова не срабатывает.

Решение №1: Использование фиктивных протоколов в ссылках

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

Разберем по шагам создание такой ссылки в вашем HTML-коде. Вместо стандартных http:// или пустых решеток, мы сформируем структуру следующего вида:


<!-- В HTML-документе -->
<a href="v8action://click_menu?id=123">Нажать на пункт меню</a>

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

Решение №2: Обработка события на стороне 1С

Теперь проанализируем, как правильно принять этот сигнал в модуле формы 1С. Основной секрет заключается в использовании параметра СтандартнаяОбработка. Если мы не установим его в значение Ложь, система попытается выполнить переход по указанному адресу (что приведет к ошибке или пустой странице), а нам нужно просто перехватить данные.

Посмотрим на пример кода в обработчике события:


& mobileappclient
Процедура ИмяПоляHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
    
    // Получаем URL, по которому пытался перейти пользователь
    АдресПерехода = ДанныеСобытия.URL;
    
    // Проверяем, наш ли это протокол
    Если Найти(АдресПерехода, "v8action://") > 0 Тогда
        
        // Обязательно отключаем штатное поведение WebView!
        СтандартнаяОбработка = Ложь;
        
        // Разбираем строку адреса и выполняем нужную логику
        // Например, выделим команду
        Команда = Сред(АдресПерехода, СтрДлина("v8action://") + 1);
        
        Если Найти(Команда, "click_menu") > 0 Тогда
            Сообщить("Нажато меню! Параметры: " + Команда);
            // Здесь вызываем ваши процедуры 1С
        КонецЕсли;
        
    КонецЕсли;

КонецПроцедуры

Решение №3: Программный вызов из JavaScript через window.location

Часто возникает ситуация, когда событие должно инициироваться не по прямому клику пользователя на тег <a>, а программно из функции JavaScript (например, после сложных вычислений или проверки условий). В мобильном Android лучшим способом «достучаться» до 1С является изменение свойства window.location.href.

Рассмотрим пример JS-функции, которая передает данные в 1С:


function sendDataTo1C(actionName, payload) {
    // Формируем строку события
    var eventString = "v8action://" + actionName + "?" + JSON.stringify(payload);
    
    // Инициируем "переход", который перехватит 1С
    window.location.href = eventString;
}

Важное замечание: некоторые разработчики пытаются использовать устаревшие методы вроде document.fireEvent или createEventObject. Следует помнить, что в современном Android WebView (основанном на Chromium) эти методы либо не работают, либо не приводят к срабатыванию обработчика 1С. Самый стабильный «мост» на текущий момент — именно манипуляция с URL.

Дополнительные рекомендации для стабильной работы на Android

Проанализируем еще несколько технических нюансов, которые помогут сделать ваш интерфейс более отзывчивым и избежать «молчания» эмулятора:

  1. Использование CSS для интерактивности. Чтобы Android WebView корректно регистрировал клики на элементах, не являющихся ссылками (например, div), добавьте в их стили свойство cursor: pointer;. Это принудительно включает обработку событий нажатия для данных элементов в движке WebKit.
  2. Избегайте пустых атрибутов. Никогда не оставляйте href="" пустым. Если вам не нужно передавать данные, пишите хотя бы href="v8:void". Пустые значения часто игнорируются мобильной платформой.
  3. Проверка навигации. Если вы используете динамическое обновление страницы через AJAX или изменение DOM, 1С может «потерять» связь с документом. В таких случаях лучше всего работает именно метод с window.location.href.
  4. Отладка в эмуляторе. При отладке на Android-эмуляторе убедитесь, что версия мобильной платформы 1С актуальна. В версиях ниже 8.3.10 наблюдались проблемы с пробросом событий при использовании тяжелых JS-фреймворков.

Подводя итог, можно сказать: взаимодействие 1С и HTML на Android строится на принципе "Перехват навигации". Реализовав в своем приложении схему с кастомными URL-протоколами и обязательным отключением СтандартнаяОбработка, вы добьетесь стабильной работы интерфейса как в эмуляторе, так и на реальных мобильных устройствах. Ознакомиться с примером готового мобильного интерфейса на веб-технологиях можно в конфигурации для мобильного учёта доходов и расходов на HTML-UI.

← На главную