Как отключить JavaScript и избавиться от ошибок сценариев в поле HTML-документа 1С

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

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

Выясним причину возникновения ошибок выполнения сценариев

Проанализируем ситуацию. В тонком и толстом клиенте платформа 1С для отображения поля HTML-документа использует встроенный системный компонент Internet Explorer (ActiveX WebBrowser). По умолчанию данный компонент работает в режиме эмуляции устаревших версий (IE7/IE8).

Современные веб-страницы активно используют стандарты JavaScript, не поддерживаемые старыми версиями IE, из-за чего при загрузке генерируются многочисленные исключения. Если попытаться вырезать теги script в событии ДокументСформирован, это не даст желаемого результата, так как базовые скрипты успевают выполниться еще в процессе загрузки страницы.

Способ 1. Получение HTML-кода, его очистка и загрузка в документ

Рассмотрим подход, предложенный на форуме: вместо того чтобы указывать прямой URL для поля HTML-документа, мы самостоятельно скачиваем текст страницы через HTTP-запрос, удаляем или заменяем скрипты и загружаем итоговый код в реквизит.

Разберем по шагам реализацию данного метода:

  1. Выполняем HTTP-запрос к веб-сайту на стороне 1С.
  2. Получаем исходный HTML-код в виде строки.
  3. Удаляем блоки script или заменяем их на комментарии.
  4. Загружаем полученный текст в поле HTML-документа.

Посмотрим на пример кода на языке 1С:


Соединение = Новый HTTPСоединение("example.com");
Запрос = Новый HTTPЗапрос("/page.html");
Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда
    ТекстHTML = Ответ.ПолучитьТелоКакСтроку();
    
    // Закомментируем теги script, чтобы отключить исполнение кода
    ТекстHTML = СтрЗаменить(ТекстHTML, "<script", "<!-- <script");
    ТекстHTML = СтрЗаменить(ТекстHTML, "</script>", "</script> -->");
    
    // Загружаем очищенный текст в элемент формы
    Элементы.ПолеHTMLДокумента.УстановитьТекст(ТекстHTML);
КонецЕсли;

Ограничения метода: Полная очистка кода от тегов script нарушает верстку и логику работы большинства современных сайтов. Перестают работать динамические формы, стили, AJAX-запросы и кнопки. Кроме того, теряется контекст текущей сессии (куки) и базовые относительные пути к файлам.

Способ 2. Подавление ошибок через внедрение window.onerror

Если необходимо сохранить работоспособность страницы, но убрать всплывающие диалоговые окна с ошибками, разберем более мягкий вариант — внедрение обработчика ошибок window.onerror в заголовок HTML-документа.


Функция ОтключитьДиалогиОшибок(ИсходныйHTML)
    СкриптЗаглушка = "<script>window.onerror = function() { return true; };</script>";
    Возврат СтрЗаменить(ИсходныйHTML, "<head>", "<head>" + Символы.ПС + СкриптЗаглушка);
КонецФункции

Функция window.onerror = function() { return true; }; перехватывает абсолютно все ошибки сценариев на странице и сообщает браузеру, что ошибка обработана, предотвращая появление системного окна.

Способ 3. Переключение режима эмуляции браузера в реестре Windows

Чтобы встроенный компонент ActiveX использовал современный движок рендеринга и корректно исполнял JavaScript, настроим режим эмуляции в реестре Windows.

Проанализируем необходимые настройки:

  1. Откроем редактор реестра (regedit).
  2. Перейдем в ветку: HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION.
  3. Создадим параметры типа DWORD (32 бита) для исполняемых файлов платформы: 1cv8.exe и 1cv8c.exe.
  4. Установим значение 11000 в десятичной системе счисления (что соответствует режиму IE11).

Альтернативные решения для сбора данных с сайтов

Если основная цель задачи — серфинг по сайту для сбора информации (скрейпинг), рекомендуем отказаться от использования визуального компонента «Поле HTML документа». Намного надежнее и быстрее выполнять обработку на стороне сервера:

  1. Отправка запросов через объекты HTTPСоединение и HTTPЗапрос.
  2. Разбор полученного HTML-кода с помощью объектов ЧтениеHTML и DOMДокумент.

При таком подходе JavaScript в принципе не исполняется, что полностью исключает появление ошибок и ускоряет работу обработки в несколько раз.

← На главную