При отображении внешних веб-страниц или сложных интерактивных HTML-интерфейсов в элементе ПолеHTMLДокумента разработчики часто сталкиваются с каскадом модальных окон: «Ошибка сценария», «Синтаксическая ошибка» или сообщениями о неподдерживаемых свойствах JavaScript. В некоторых случаях выполнение скрипта полностью блокирует интерфейс клиента 1С или приводит к аварийному зависанию формы при вызове методов ПолучитьСтроку() и УстановитьСтроку(). Разберем детально, почему это происходит и как правильно решить данную проблему.
Проанализируем технические особенности работы встроенного браузера платформы 1С:
УстановитьСтроку() нарушаются контексты исполнения AJAX-запросов и скриптов безопасности (CORS), что приводит к блокировке или непредвиденным диалоговым окнам.Рассмотрим основной способ решения проблемы для отображения современных страниц. Чтобы заставить встроенный движок работать по современным стандартам (IE11 Edge Mode), необходимо зарегистрировать исполняемые файлы 1С в параметрах реестра Windows FEATURE_BROWSER_EMULATION.
Выполним настройку по шагам:
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION
или глобально для всей системы (для 64-разрядных ОС с 32-разрядным клиентом 1С дополнительно проверьте ветку HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION).
Для толстого клиента и конфигуратора: имя параметра 1cv8.exe, десятичное значение 11000 (или 11001).
Для тонкого клиента: имя параметра 1cv8c.exe, десятичное значение 11000 (или 11001).
Если HTML-страница формируется внутри 1С или загружается в виде локального макета, добавим директиву совместимости непосредственно в блок заголовка документа <head>. Посмотрим на пример разметки:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta charset="utf-8" />
</head>
<body>
<!-- Основной контент страницы -->
</body>
</html>
Значение IE=edge заставляет компонент использовать наивысшую доступную версию движка, установленного в операционной системе.
Если страница формируется динамически или есть возможность внедрить код до выполнения сторонних скриптов, перехватим глобальные ошибки объекта window. Разберем пример сценария:
<script type="text/javascript">
window.onerror = function(message, url, lineNumber) {
// Возврат true блокирует стандартное модальное окно с ошибкой браузера
return true;
};
</script>
Разместим данный блок в самом начале секции <head>, чтобы перехватчик сработал до инициализации внешних библиотек и счетчиков аналитики.
Когда целью разработки является отправка форм, заполнение полей на стороннем ресурсе и получение ответа, использование визуального элемента ПолеHTMLДокумента является архитектурно неоптимальным подходом. Страницы перегружены скриптами аналитики, рекламными модулями и механизмами валидации, не предназначенными для эмуляции через встроенный браузер.
Оптимальным решением будет отказ от визуального рендеринга и переход на прямое межсистемное взаимодействие с помощью объектов платформы HTTPСоединение, HTTPЗапрос и HTTPОтвет.
Рассмотрим последовательность действий:
Посмотрим на типовой пример отправки запроса в 1С:
Соединение = Новый HTTPСоединение(
"api.service.ru",
443,
,
,
,
30,
Новый ЗащищенноеСоединениеOpenSSL()
);
Запрос = Новый HTTPЗапрос("/v1/search");
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.Заголовки.Вставить("Authorization", "Bearer ВАШ_ТОКЕН_АВТОРИЗАЦИИ");
ТелоJSON = "{""query"": ""Иванов Иван Иванович""}";
Запрос.УстановитьТелоИзСтроки(ТелоJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Попытка
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния = 200 Тогда
РезультатСтрока = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
// Выполняем разбор полученного JSON-ответа
Иначе
ВызватьИсключение "Ошибка сервиса: " + Формат(Ответ.КодСостояния, "ЧГ=0");
КонецЕсли;
Исключение
Сообщить("Не удалось выполнить запрос: " + ОписаниеОшибки());
КонецПопытки;
Такой подход полностью исключает появление ошибок JavaScript, существенно ускоряет работу алгоритма и обеспечивает независимость от изменений верстки визуальной страницы стороннего сайта.