Почему съезжает вверх или двоится поле HTML-документа в 1С и как это исправить?

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

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

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

Выясняем причину: как устроен рендеринг HTML в старых версиях 1С

Для того чтобы понять природу этого сбоя, проанализируем архитектуру платформы 1С:Предприятие до версии 8.3.14. В операционных системах семейства Windows для работы объекта ПолеHTMLДокумента использовался встроенный системный компонент Internet Explorer (а именно библиотека mshtml.dll через ActiveX-объект Microsoft Web Browser).

Использование системного Internet Explorer порождало две фундаментальные проблемы, которые и приводили к плавающим багам верстки:

  1. Общее адресное пространство и разделяемые библиотеки: Многие другие крупные корпоративные системы (например, SAP GUI с его компонентом SAP HTML Viewer) также используют Internet Explorer в качестве встроенного браузера. Когда в рамках одной пользовательской сессии Windows параллельно запущены 1С и SAP, их ActiveX-компоненты обращаются к одним и тем же системным библиотекам рендеринга скриптов (mshtml.dll, jscript.dll). Если в стороннем приложении (SAP) происходит критический сбой выполнения сценариев JavaScript или некорректно обрабатывается ошибка DOM, это может привести к нестабильности всего разделяемого движка скриптов. В результате в 1С перестают корректно отрабатывать CSS-стили позиционирования и сценарии инициализации разметки, из-за чего визуальное поле «схлопывается» и улетает вверх.
  2. Конфликт режимов совместимости в реестре Windows: По умолчанию компоненты IE отображают веб-страницы в режиме совместимости с древней версией IE7. Чтобы заставить поле HTML в 1С поддерживать современные стандарты CSS и JS, разработчики часто прибегают к редактированию ветки реестра FEATURE_BROWSER_EMULATION. Если сторонний софт перезаписывает параметры эмуляции для процессов 1С или глобально переопределяет версию рендеринга, движок MSHTML мгновенно переключается в режим совместимости. В этом режиме современные CSS-свойства (такие как Flexbox, CSS Grid или абсолютное позиционирование position: absolute;) обрабатываются неверно, приводя к визуальному раздвоению или смещению контейнера HTML вверх формы.

Кардинальное решение проблемы: переход на WebKit в платформе 8.3.14+

Начиная с релиза платформы 8.3.14.1565, фирма «1С» полностью перевела клиентские приложения для Windows на изолированный современный движок рендеринга WebKit (отказавшись от использования системного Internet Explorer). На операционных системах Linux и macOS WebKit использовался и ранее.

Рассмотрим, как это технологическое изменение решает проблему смещения поля HTML:

Таким образом, самым простым и эффективным решением проблемы «съезжания» верстки является обновление платформы 1С:Предприятие до актуального релиза (не ниже 8.3.14).

Особенности перехода на WebKit: адаптация кода 1С

Несмотря на то, что обновление платформы автоматически устраняет плавающие графические баги, разработчикам важно учитывать, что переход с Internet Explorer на WebKit может потребовать рефакторинга существующего кода. Старый программный код, написанный с расчетом на особенности ActiveX IE, выдаст ошибки в новых версиях платформы.

Разберем ключевые изменения объектной модели документа (DOM), которые необходимо внести в конфигурацию:

1. Замена свойства parentWindow на defaultView

При использовании Internet Explorer доступ к глобальному объекту окна (Window) из документа 1С осуществлялся через устаревшее свойство parentWindow. В движке WebKit этого свойства не существует, и обращение к нему вызовет ошибку выполнения.

Вместо него необходимо использовать стандартное свойство defaultView. Рассмотрим пример адаптации кода:

Старый вариант кода (под Internet Explorer):


// Данный код вызовет ошибку на платформе 8.3.14 и выше!
ДокументHTML = Элементы.ПолеHTMLДокумента.Документ;
ОкноHTML = ДокументHTML.parentWindow;
ОкноHTML.вызватьФункциюJS("Параметр");

Новый универсальный вариант кода (под WebKit):


ДокументHTML = Элементы.ПолеHTMLДокумента.Документ;
// Используем стандартный defaultView для доступа к контексту окна
ОкноHTML = ДокументHTML.defaultView;
Если ОкноHTML <> Неопределено Тогда
    ОкноHTML.вызватьФункциюJS("Параметр");
КонецЕсли;

2. Контроль асинхронной загрузки документа

В отличие от Internet Explorer, построение объектной модели документа в WebKit происходит строго асинхронно. Если вы попытаетесь обратиться к элементам DOM или вызвать функции JavaScript сразу после программной установки текста в поле HTML, программа вернет ошибку, так как дерево документа еще не успело сформироваться.

Для решения этой проблемы необходимо обрабатывать событие ДокументСформирован и обязательно анализировать свойство readyState.

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


&НаКлиенте
Процедура ЗагрузитьДанныеВПолеHTML()
    
    ТекстHTML = "<html><body><div id='content'>Привет, мир!</div></body></html>";
    Элементы.ПолеHTMLДокумента.УстановитьТекст(ТекстHTML);
    
КонецПроцедуры

&НаКлиенте
Процедура ПолеHTMLДокументаДокументСформирован(Элемент)
    
    Документ = Элемент.Документ;
    
    // Проверяем полную готовность объектной модели
    Если Документ.readyState = "complete" Тогда
        
        Окно = Документ.defaultView;
        Если Окно <> Неопределено Тогда
            // Теперь мы можем безопасно работать со страницей
            ЭлементКонтента = Документ.getElementById("content");
            ЭлементКонтента.innerHTML = "Данные успешно обновлены из 1С!";
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

3. Отказ от использования ActiveXObject внутри HTML-страниц

В сценариях JavaScript, которые загружались в поле HTML-документа под управлением Internet Explorer, разработчики иногда использовали объект ActiveXObject для прямой работы с файловой системой Windows или COM-объектами (например, для запуска Excel или работы с локальными файлами).

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

В JavaScript-коде вашей страницы:


// Отправка данных из HTML обратно в 1С
function sendDataTo1C(data) {
    if (window.1c) {
        window.1c.postMessage(data);
    }
}

В модуле формы 1С (обработчик события "ПриНажатии" или внешнее событие в зависимости от реализации):


&НаКлиенте
Процедура ПолеHTMLДокументаПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
    // Обработка данных, переданных из WebKit-контекста
    Если ДанныеСобытия.Свойство("Message") Тогда
        Сообщить("Получены данные из HTML: " + ДанныеСобытия.Message);
    КонецЕсли;
КонецПроцедуры

Резюме

Если у ваших пользователей внезапно съезжает вверх или двоится поле HTML-документа, это верный признак конфликта системных библиотек Internet Explorer с внешним программным обеспечением. Лучшим и наиболее перспективным решением является обновление платформы 1С:Предприятие до версии 8.3.14 или выше.

Переход на WebKit не только решит проблему с версткой раз и навсегда благодаря изоляции процессов, но и позволит вам использовать современные стандарты HTML5, CSS3 и ECMAScript при проектировании интерфейсов ваших решений.

← На главную