В процессе разработки и поддержки интерфейсов в 1С:Предприятии разработчики часто используют элемент формы Поле HTML документа. Этот инструмент позволяет встраивать интерактивные веб-страницы, дашборды, текстовые редакторы и интеграционные формы непосредственно в конфигурацию. Однако при работе с этим элементом на устаревших версиях платформы можно столкнуться с крайне неприятным визуальным багом: поле HTML-документа «убегает» (съезжает) вверх формы или отображается в виде двух перекрывающихся окон. При этом интерактивные элементы (кнопки, ссылки, поля ввода) остаются кликабельными на своих исходных местах, словно отображается лишь «призрачная» копия верстки.
В рамках этой статьи мы подробно разберем, почему возникает данная проблема, как на отображение веб-интерфейсов в 1С влияет стороннее программное обеспечение (например, SAP), и как раз и навсегда решить эту проблему, перейдя на современный движок рендеринга.
Для того чтобы понять природу этого сбоя, проанализируем архитектуру платформы 1С:Предприятие до версии 8.3.14. В операционных системах семейства Windows для работы объекта ПолеHTMLДокумента использовался встроенный системный компонент Internet Explorer (а именно библиотека mshtml.dll через ActiveX-объект Microsoft Web Browser).
Использование системного Internet Explorer порождало две фундаментальные проблемы, которые и приводили к плавающим багам верстки:
mshtml.dll, jscript.dll). Если в стороннем приложении (SAP) происходит критический сбой выполнения сценариев JavaScript или некорректно обрабатывается ошибка DOM, это может привести к нестабильности всего разделяемого движка скриптов. В результате в 1С перестают корректно отрабатывать CSS-стили позиционирования и сценарии инициализации разметки, из-за чего визуальное поле «схлопывается» и улетает вверх.FEATURE_BROWSER_EMULATION. Если сторонний софт перезаписывает параметры эмуляции для процессов 1С или глобально переопределяет версию рендеринга, движок MSHTML мгновенно переключается в режим совместимости. В этом режиме современные CSS-свойства (такие как Flexbox, CSS Grid или абсолютное позиционирование position: absolute;) обрабатываются неверно, приводя к визуальному раздвоению или смещению контейнера HTML вверх формы.Начиная с релиза платформы 8.3.14.1565, фирма «1С» полностью перевела клиентские приложения для Windows на изолированный современный движок рендеринга WebKit (отказавшись от использования системного Internet Explorer). На операционных системах Linux и macOS WebKit использовался и ранее.
Рассмотрим, как это технологическое изменение решает проблему смещения поля HTML:
Таким образом, самым простым и эффективным решением проблемы «съезжания» верстки является обновление платформы 1С:Предприятие до актуального релиза (не ниже 8.3.14).
Несмотря на то, что обновление платформы автоматически устраняет плавающие графические баги, разработчикам важно учитывать, что переход с Internet Explorer на WebKit может потребовать рефакторинга существующего кода. Старый программный код, написанный с расчетом на особенности ActiveX IE, выдаст ошибки в новых версиях платформы.
Разберем ключевые изменения объектной модели документа (DOM), которые необходимо внести в конфигурацию:
При использовании 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("Параметр");
КонецЕсли;
В отличие от 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С!";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В сценариях 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 при проектировании интерфейсов ваших решений.