При разработке мобильных приложений на платформе 1С:Предприятие разработчики часто сталкиваются с существенным ограничением стандартного элемента формы ПолеHTMLДокумента. Основная проблема заключается в «закрытости» системного движка WebView: мы получаем событие ДокументСформирован только тогда, когда страница полностью загружена. Если внутри страницы происходит серия редиректов через JavaScript (например, window.location.replace), 1С покажет нам только финальный URL, проигнорировав промежуточные состояния, в которых часто содержатся важные данные (токены авторизации, коды подтверждения и т.д.).
В этой статье мы подробно разберем, как обойти эти ограничения, проанализируем механизмы работы движков на Android и iOS и внедрим несколько практических решений для перехвата управления над WebView.
Рассмотрим стандартный жизненный цикл страницы в 1С. Когда мы присваиваем значение свойству Текст или URL поля HTML-документа, платформа инициирует загрузку. В мобильной платформе 1С использует системный компонент (Chromium на Android и WebKit на iOS). Эти компоненты выполняют JS-код автономно от основного потока 1С. Если сайт провайдера использует программный редирект, то для платформы 1С это выглядит как одна затянувшаяся загрузка. Событие ДокументСформирован возникнет только один раз — в самом конце пути.
Важный момент: попытка имитировать браузер через HTTPСоединение часто терпит крах. Современные системы защиты (анти-фрод, капча, проверка TLS-fingerprint) легко определяют запросы от библиотек 1С, так как они не передают все необходимые заголовки и не поддерживают исполнение сложного JS, который необходим для прохождения проверки «на человечность».
Это самый простой и часто эффективный способ. Несмотря на то, что событие ДокументСформирован еще не наступило, свойство Элементы.ПолеHTML.URL может обновляться в режиме реального времени, как только движок WebView получает команду на смену адреса. Выясним, как это реализовать программно.
Разберем алгоритм действий:
Пример кода для реализации этого метода:
&НаКлиенте
Процедура ОткрытьАвторизацию(Команда)
// Инициализируем переход на сайт провайдера
Объект.СсылкаНаСайт = "https://provider.com/login";
Элементы.ПолеHTML.Перейти(Объект.СсылкаНаСайт);
// Запускаем мониторинг URL
ПодключитьОбработчикОжидания("ПроверитьТекущийURL", 0.1);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьТекущийURL()
ТекущийАдрес = Элементы.ПолеHTML.URL;
// Проанализируем ситуацию: ищем токен в строке
Если Найти(ТекущийАдрес, "access_token=") > 0 Тогда
ОтключитьОбработчикОжидания("ПроверитьТекущийURL");
ПарситьРезультат(ТекущийАдрес);
// Можно прервать дальнейшую загрузку, очистив поле или закрыв форму
Элементы.ПолеHTML.Текст = "<html><body>Авторизация успешна!</body></html>";
КонецЕсли;
КонецПроцедуры
Если таймер не успевает «поймать» промежуточный URL (что бывает при очень быстрой работе движка), мы можем использовать более продвинутый метод — внедрение собственного кода в контекст страницы. Нам нужно переопределить стандартные функции браузера, такие как location.replace или location.assign.
Проанализируем стратегию: мы должны внедрить скрипт сразу после загрузки первой страницы. Скрипт подменит функцию перехода на свою собственную, которая будет уведомлять 1С о попытке редиректа. Один из способов уведомления — попытка перехода по «несуществующей» схеме, которую 1С может перехватить в событии ПриНажатии.
Рассмотрим пример JS-кода для инъекции:
window.location.replace = function(newUrl) {
// Вместо обычного перехода вызываем кастомную схему
window.location.href = "my1capp://intercept?url=" + encodeURIComponent(newUrl);
};
В 1С этот метод требует поддержки со стороны мобильного приложения. При попытке перехода на my1capp:// WebView сгенерирует ошибку или событие навигации, которое мы сможем отловить. Важно помнить, что метод ИсполнитьJavaScript доступен только после того, как в поле HTML загружен хотя бы какой-то документ.
Для взаимодействия мобильного сайта и приложения 1С идеально подходят Deep Links. Если у вас есть возможность управлять настройками на стороне провайдера (например, вы указываете redirect_uri), всегда используйте кастомные схемы вместо http/https.
Например, укажите redirect_uri = "v8auth-app://success". Когда браузер попытается выполнить переход по этой ссылке:
v8auth-app.intent-filter (для Android), управление вернется в 1С.Это самый надежный способ, который рекомендуют разработчики мобильных ОС, так как он полностью исключает проблему «пролетания» мимо промежуточного URL в WebView.
Когда штатных средств ПоляHTMLДокумента недостаточно (например, нужно перехватывать заголовки запросов или работать с cookies на низком уровне), единственным выходом остается написание или использование готовой внешней компоненты.
Внешняя компонента на Java (для Android) или Objective-C/Swift (для iOS) может создать экземпляр WebView программно и подписаться на событие shouldOverrideUrlLoading. Это позволяет:
Разберем пример логики в нативном коде (Android):
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.contains("my-secret-token")) {
// Передаем данные обратно в 1С через механизм внешних событий
sendEventTo1C("TokenReceived", url);
return true; // Останавливаем загрузку
}
return false;
}
});
Если вы все же решили использовать HTTPСоединение для некоторых этапов, проанализируем, почему провайдер может вас блокировать. Современные системы защиты проверяют User-Agent. В 1С по умолчанию он может отсутствовать или быть специфичным. Всегда устанавливайте валидный заголовок браузера:
Заголовки = Новый Соответствие;
Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Linux; Android 10; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Mobile Safari/537.36");
// Добавьте также Accept-Language и Referer
Однако, как было замечено в обсуждении, если сайт использует капчу, то HTTPСоединение становится практически бесполезным. В этом случае использование ПоляHTMLДокумента с методами перехвата из Решения №1 или №2 является единственным легитимным способом автоматизации внутри 1С.
Для полноценного взаимодействия с WebView в мобильной 1С рекомендуем придерживаться следующей иерархии решений:
URL.Выяснив эти особенности, вы сможете эффективно интегрировать мобильные приложения 1С с любыми современными веб-сервисами, сохраняя при этом безопасность и удобство пользователя.