При разработке мобильных приложений на платформе 1С:Предприятие часто возникает потребность в создании кастомного интерфейса с использованием HTML и JavaScript. Однако разработчики сталкиваются с неприятной особенностью: событие ПолеHTMLПриНажатии, которое прекрасно работает в тонком клиенте на Windows, на мобильном устройстве (или эмуляторе) Android попросту не реагирует на клики. В этой статье мы подробно разберем, почему это происходит, и изучим проверенные механизмы настройки взаимодействия между HTML-контентом и кодом 1С.
Для начала проанализируем ситуацию. В десктопной версии 1С (Windows) для отображения HTML используется движок Internet Explorer (или современные компоненты на базе Chromium), которые транслируют практически любое взаимодействие с DOM-моделью в события платформы. В мобильной же платформе на базе Android за отображение отвечает системный компонент WebView.
Важный нюанс: в мобильной версии событие ПолеHTMLПриНажатии перехватывается платформой 1С не как абстрактный «клик» по любому элементу, а именно как попытка перехода по навигационной ссылке. Если вы нажимаете на элемент div, span или даже на ссылку с пустым атрибутом href="#", Android WebView может не расценить это как навигацию, требующую уведомления внешнего приложения. Следовательно, обработчик в 1С не получает сигнал, и точка останова не срабатывает.
Рассмотрим самый надежный способ вызова события. Чтобы платформа 1С «увидела» нажатие, нам нужно инициировать переход по адресу, который система сочтет значимым, но при этом не попытается открыть в реальном браузере. Для этого мы будем использовать произвольные схемы (протоколы).
Разберем по шагам создание такой ссылки в вашем HTML-коде. Вместо стандартных http:// или пустых решеток, мы сформируем структуру следующего вида:
<!-- В HTML-документе -->
<a href="v8action://click_menu?id=123">Нажать на пункт меню</a>
В данном примере v8action:// — это произвольный префикс, который мы сами придумали для идентификации наших внутренних команд. Текст после него может содержать любые параметры, которые мы хотим передать в 1С. Практический пример организации такого интерактивного интерфейса представлен в решении для динамического подбора товаров в мобильном приложении.
Теперь проанализируем, как правильно принять этот сигнал в модуле формы 1С. Основной секрет заключается в использовании параметра СтандартнаяОбработка. Если мы не установим его в значение Ложь, система попытается выполнить переход по указанному адресу (что приведет к ошибке или пустой странице), а нам нужно просто перехватить данные.
Посмотрим на пример кода в обработчике события:
& mobileappclient
Процедура ИмяПоляHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
// Получаем URL, по которому пытался перейти пользователь
АдресПерехода = ДанныеСобытия.URL;
// Проверяем, наш ли это протокол
Если Найти(АдресПерехода, "v8action://") > 0 Тогда
// Обязательно отключаем штатное поведение WebView!
СтандартнаяОбработка = Ложь;
// Разбираем строку адреса и выполняем нужную логику
// Например, выделим команду
Команда = Сред(АдресПерехода, СтрДлина("v8action://") + 1);
Если Найти(Команда, "click_menu") > 0 Тогда
Сообщить("Нажато меню! Параметры: " + Команда);
// Здесь вызываем ваши процедуры 1С
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Часто возникает ситуация, когда событие должно инициироваться не по прямому клику пользователя на тег <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.
Проанализируем еще несколько технических нюансов, которые помогут сделать ваш интерфейс более отзывчивым и избежать «молчания» эмулятора:
div), добавьте в их стили свойство cursor: pointer;. Это принудительно включает обработку событий нажатия для данных элементов в движке WebKit.href="" пустым. Если вам не нужно передавать данные, пишите хотя бы href="v8:void". Пустые значения часто игнорируются мобильной платформой.window.location.href.Подводя итог, можно сказать: взаимодействие 1С и HTML на Android строится на принципе "Перехват навигации". Реализовав в своем приложении схему с кастомными URL-протоколами и обязательным отключением СтандартнаяОбработка, вы добьетесь стабильной работы интерфейса как в эмуляторе, так и на реальных мобильных устройствах. Ознакомиться с примером готового мобильного интерфейса на веб-технологиях можно в конфигурации для мобильного учёта доходов и расходов на HTML-UI.