При реализации механизмов автоматизации, навигации по сайтам или сбора данных внутри платформы 1С:Предприятие разработчики часто сталкиваются с проблемой: при загрузке страниц в поле HTML-документа возникают ошибки выполнения сценариев JavaScript. В результате пользователю постоянно выводятся навязчивые системные диалоговые окна с вопросом о продолжении выполнения скрипта. Разберем по шагам, почему возникает эта проблема и как корректно загрузить страницу без ошибок.
Проанализируем ситуацию. В тонком и толстом клиенте платформа 1С для отображения поля HTML-документа использует встроенный системный компонент Internet Explorer (ActiveX WebBrowser). По умолчанию данный компонент работает в режиме эмуляции устаревших версий (IE7/IE8).
Современные веб-страницы активно используют стандарты JavaScript, не поддерживаемые старыми версиями IE, из-за чего при загрузке генерируются многочисленные исключения. Если попытаться вырезать теги script в событии ДокументСформирован, это не даст желаемого результата, так как базовые скрипты успевают выполниться еще в процессе загрузки страницы.
Рассмотрим подход, предложенный на форуме: вместо того чтобы указывать прямой URL для поля HTML-документа, мы самостоятельно скачиваем текст страницы через HTTP-запрос, удаляем или заменяем скрипты и загружаем итоговый код в реквизит.
Разберем по шагам реализацию данного метода:
script или заменяем их на комментарии.Посмотрим на пример кода на языке 1С:
Соединение = Новый HTTPСоединение("example.com");
Запрос = Новый HTTPЗапрос("/page.html");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
ТекстHTML = Ответ.ПолучитьТелоКакСтроку();
// Закомментируем теги script, чтобы отключить исполнение кода
ТекстHTML = СтрЗаменить(ТекстHTML, "<script", "<!-- <script");
ТекстHTML = СтрЗаменить(ТекстHTML, "</script>", "</script> -->");
// Загружаем очищенный текст в элемент формы
Элементы.ПолеHTMLДокумента.УстановитьТекст(ТекстHTML);
КонецЕсли;
Ограничения метода: Полная очистка кода от тегов script нарушает верстку и логику работы большинства современных сайтов. Перестают работать динамические формы, стили, AJAX-запросы и кнопки. Кроме того, теряется контекст текущей сессии (куки) и базовые относительные пути к файлам.
Если необходимо сохранить работоспособность страницы, но убрать всплывающие диалоговые окна с ошибками, разберем более мягкий вариант — внедрение обработчика ошибок window.onerror в заголовок HTML-документа.
Функция ОтключитьДиалогиОшибок(ИсходныйHTML)
СкриптЗаглушка = "<script>window.onerror = function() { return true; };</script>";
Возврат СтрЗаменить(ИсходныйHTML, "<head>", "<head>" + Символы.ПС + СкриптЗаглушка);
КонецФункции
Функция window.onerror = function() { return true; }; перехватывает абсолютно все ошибки сценариев на странице и сообщает браузеру, что ошибка обработана, предотвращая появление системного окна.
Чтобы встроенный компонент ActiveX использовал современный движок рендеринга и корректно исполнял JavaScript, настроим режим эмуляции в реестре Windows.
Проанализируем необходимые настройки:
regedit).HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION.DWORD (32 бита) для исполняемых файлов платформы: 1cv8.exe и 1cv8c.exe.11000 в десятичной системе счисления (что соответствует режиму IE11).Если основная цель задачи — серфинг по сайту для сбора информации (скрейпинг), рекомендуем отказаться от использования визуального компонента «Поле HTML документа». Намного надежнее и быстрее выполнять обработку на стороне сервера:
HTTPСоединение и HTTPЗапрос.ЧтениеHTML и DOMДокумент.При таком подходе JavaScript в принципе не исполняется, что полностью исключает появление ошибок и ускоряет работу обработки в несколько раз.