Как реализовать полноценное взаимодействие с WebView в 1С: мобильная платформа и перехват редиректов

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

При разработке мобильных приложений на платформе 1С:Предприятие разработчики часто сталкиваются с существенным ограничением стандартного элемента формы ПолеHTMLДокумента. Основная проблема заключается в «закрытости» системного движка WebView: мы получаем событие ДокументСформирован только тогда, когда страница полностью загружена. Если внутри страницы происходит серия редиректов через JavaScript (например, window.location.replace), 1С покажет нам только финальный URL, проигнорировав промежуточные состояния, в которых часто содержатся важные данные (токены авторизации, коды подтверждения и т.д.).

В этой статье мы подробно разберем, как обойти эти ограничения, проанализируем механизмы работы движков на Android и iOS и внедрим несколько практических решений для перехвата управления над WebView.

Анализ проблемы: почему стандартные события 1С не помогают?

Рассмотрим стандартный жизненный цикл страницы в 1С. Когда мы присваиваем значение свойству Текст или URL поля HTML-документа, платформа инициирует загрузку. В мобильной платформе 1С использует системный компонент (Chromium на Android и WebKit на iOS). Эти компоненты выполняют JS-код автономно от основного потока 1С. Если сайт провайдера использует программный редирект, то для платформы 1С это выглядит как одна затянувшаяся загрузка. Событие ДокументСформирован возникнет только один раз — в самом конце пути.

Важный момент: попытка имитировать браузер через HTTPСоединение часто терпит крах. Современные системы защиты (анти-фрод, капча, проверка TLS-fingerprint) легко определяют запросы от библиотек 1С, так как они не передают все необходимые заголовки и не поддерживают исполнение сложного JS, который необходим для прохождения проверки «на человечность».

Решение №1: Использование обработчика ожидания (Таймер)

Это самый простой и часто эффективный способ. Несмотря на то, что событие ДокументСформирован еще не наступило, свойство Элементы.ПолеHTML.URL может обновляться в режиме реального времени, как только движок WebView получает команду на смену адреса. Выясним, как это реализовать программно.

Разберем алгоритм действий:

  1. Загружаем начальную страницу.
  2. Сразу после инициализации загрузки запускаем обработчик ожидания с минимально возможным интервалом (0.1 сек).
  3. В обработчике проверяем текущий URL на наличие нужных нам параметров.

Пример кода для реализации этого метода:


&НаКлиенте
Процедура ОткрытьАвторизацию(Команда)
    // Инициализируем переход на сайт провайдера
    Объект.СсылкаНаСайт = "https://provider.com/login";
    Элементы.ПолеHTML.Перейти(Объект.СсылкаНаСайт);
    
    // Запускаем мониторинг URL
    ПодключитьОбработчикОжидания("ПроверитьТекущийURL", 0.1);
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьТекущийURL()
    ТекущийАдрес = Элементы.ПолеHTML.URL;
    
    // Проанализируем ситуацию: ищем токен в строке
    Если Найти(ТекущийАдрес, "access_token=") > 0 Тогда
        ОтключитьОбработчикОжидания("ПроверитьТекущийURL");
        ПарситьРезультат(ТекущийАдрес);
        // Можно прервать дальнейшую загрузку, очистив поле или закрыв форму
        Элементы.ПолеHTML.Текст = "<html><body>Авторизация успешна!</body></html>";
    КонецЕсли;
КонецПроцедуры

Решение №2: Инъекция JavaScript для перехвата функций редиректа

Если таймер не успевает «поймать» промежуточный 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 загружен хотя бы какой-то документ.

Решение №3: Использование кастомных URL-схем (Deep Linking)

Для взаимодействия мобильного сайта и приложения 1С идеально подходят Deep Links. Если у вас есть возможность управлять настройками на стороне провайдера (например, вы указываете redirect_uri), всегда используйте кастомные схемы вместо http/https.

Например, укажите redirect_uri = "v8auth-app://success". Когда браузер попытается выполнить переход по этой ссылке:

  1. Системный WebView поймет, что это не веб-адрес.
  2. Операционная система (Android/iOS) попытается найти приложение, зарегистрированное для схемы v8auth-app.
  3. Если в манифесте вашего мобильного приложения 1С прописаны соответствующие intent-filter (для Android), управление вернется в 1С.

Это самый надежный способ, который рекомендуют разработчики мобильных ОС, так как он полностью исключает проблему «пролетания» мимо промежуточного URL в WebView.

Решение №4: Внешние компоненты (Native API)

Когда штатных средств Поля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С рекомендуем придерживаться следующей иерархии решений:

  1. Кастомные схемы (Deep Linking) — если есть доступ к настройкам сайта провайдера.
  2. Обработчик ожидания (Таймер) — для быстрого мониторинга свойства URL.
  3. Инъекция JS — если нужно перехватить программные действия внутри страницы.
  4. Внешние компоненты — если требуется стопроцентный контроль над сетевым трафиком внутри WebView.

Выяснив эти особенности, вы сможете эффективно интегрировать мобильные приложения 1С с любыми современными веб-сервисами, сохраняя при этом безопасность и удобство пользователя.

← На главную