Как устранить ошибки сценариев JavaScript в элементе ПолеHTMLДокумента в 1С

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

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

Причины возникновения ошибок сценариев

Проанализируем технические особенности работы встроенного браузера платформы 1С:

  1. Устаревший режим совместимости по умолчанию. В среде операционной системы Windows встроенный элемент управления (компонент MSHTML/WebBrowser) по умолчанию запускается в режиме совместимости с Internet Explorer 7. Современные веб-страницы используют стандарты ECMAScript 6+, фреймворки и сторонние библиотеки (jQuery, счетчики метрик, карты), синтаксис которых браузерный движок IE7 обработать не может, что вызывает критические синтаксические ошибки.
  2. Игнорирование системных настроек браузера. Отключение отладки скриптов в общих свойствах браузера Windows часто не распространяется на встроенные процессы ActiveX, если для исполняемых файлов 1С не переопределены специальные флаги эмуляции.
  3. Попытка автоматизации интерактивного сайта через визуальный интерфейс. При программной подмене HTML-кода динамических страниц через УстановитьСтроку() нарушаются контексты исполнения AJAX-запросов и скриптов безопасности (CORS), что приводит к блокировке или непредвиденным диалоговым окнам.

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

Рассмотрим основной способ решения проблемы для отображения современных страниц. Чтобы заставить встроенный движок работать по современным стандартам (IE11 Edge Mode), необходимо зарегистрировать исполняемые файлы 1С в параметрах реестра Windows FEATURE_BROWSER_EMULATION.

Выполним настройку по шагам:

  1. Откроем редактор реестра Windows и перейдем в ветку для текущего пользователя:

    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).

  2. Создадим параметры типа DWORD (32 бита) для клиентов платформы:

    Для толстого клиента и конфигуратора: имя параметра 1cv8.exe, десятичное значение 11000 (или 11001).

    Для тонкого клиента: имя параметра 1cv8c.exe, десятичное значение 11000 (или 11001).

  3. Перезапустим сеанс 1С:Предприятия. После этого встроенный элемент начнет корректно разбирать современный JavaScript и CSS без вывода синтаксических ошибок.

Способ 2. Указание метатега совместимости в HTML-документе

Если 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 заставляет компонент использовать наивысшую доступную версию движка, установленного в операционной системе.

Способ 3. Программное подавление ошибок через JavaScript

Если страница формируется динамически или есть возможность внедрить код до выполнения сторонних скриптов, перехватим глобальные ошибки объекта window. Разберем пример сценария:


<script type="text/javascript">
    window.onerror = function(message, url, lineNumber) {
        // Возврат true блокирует стандартное модальное окно с ошибкой браузера
        return true;
    };
</script>

Разместим данный блок в самом начале секции <head>, чтобы перехватчик сработал до инициализации внешних библиотек и счетчиков аналитики.

Способ 4. Переход на прямые HTTP-запросы и API вместо скрапинга через форму

Когда целью разработки является отправка форм, заполнение полей на стороннем ресурсе и получение ответа, использование визуального элемента ПолеHTMLДокумента является архитектурно неоптимальным подходом. Страницы перегружены скриптами аналитики, рекламными модулями и механизмами валидации, не предназначенными для эмуляции через встроенный браузер.

Оптимальным решением будет отказ от визуального рендеринга и переход на прямое межсистемное взаимодействие с помощью объектов платформы HTTPСоединение, HTTPЗапрос и HTTPОтвет.

Рассмотрим последовательность действий:

  1. Проанализируем сетевой обмен целевого сервиса (в отладчике внешнего браузера на вкладке Network/Сеть) или найдем официальную документацию к его API.
  2. Определим конечный адрес (URL), тип метода (POST/GET), обязательные заголовки (Headers) и формат тела запроса (JSON, XML или URL-encoded).
  3. Отправим запрос средствами встроенного языка 1С без отрисовки веб-страниц в интерфейсе.

Посмотрим на типовой пример отправки запроса в 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, существенно ускоряет работу алгоритма и обеспечивает независимость от изменений верстки визуальной страницы стороннего сайта.

← На главную