При разработке интерфейсов в 1С:Предприятии с использованием элемента «Поле HTML-документа» программисты часто сталкиваются со сложным поведением встроенного браузера. Типичный сценарий: внутри формы 1С отображается локальная веб-страница (например, интерактивное меню или дашборд), пользователь переходит по внутренним ссылкам, и нам требуется предоставить ему кнопку «Домой» или «На главную» на панели самой управляемой формы 1С. Однако простая очистка или перезапись реквизита, связанного с полем HTML, не всегда приводит к обновлению отображения. Ситуация осложняется при обновлении платформы, когда отлаженный код внезапно превращается в пустой белый экран.
В этой статье мы подробно разберем, как правильно реализовать возврат на главную страницу локального HTML-документа без использования внешних хостингов, а также выясним причины появления белого экрана на современных версиях платформы 1С и способы устранения этой проблемы.
Рассмотрим типичную ошибку начинающих разработчиков. При попытке обновить содержимое поля HTML-документа часто пытаются повторно вызвать метод ОткрытьФорму или программно присвоить строковому реквизиту формы, связанному с полем HTML, исходный код страницы, очистив его перед этим:
&НаКлиенте
Процедура Домой(Команда)
Реквизит1 = "";
ОбновитьОтображениеДанных(Элементы.Реквизит1);
Реквизит1 = "Код страницы";
ОбновитьОтображениеДанных(Элементы.Реквизит1);
КонецПроцедуры
Такой подход не дает результата по одной простой причине: оптимизация платформы 1С не инициирует полную перезагрузку DOM-модели встроенного браузера, если строковое значение реквизита кажется ей идентичным или если навигация внутри HTML-документа увела пользователя на другую страницу. Метод ОбновитьОтображениеДанных предназначен для элементов интерфейса 1С, но он не управляет напрямую внутренним состоянием кэша и истории переходов браузера (особенно после перехода по внешним ссылкам).
Разберем два надежных и профессиональных способа решения этой задачи напрямую в 1С без выгрузки страниц на внешние сервера.
Самый быстрый и надежный способ принудительно обновить содержимое поля — использовать прямые методы документа встроенного браузера. Для этого мы получаем доступ к объекту документа через элементы формы и перезаписываем его содержимое.
Рассмотрим по шагам реализацию этого метода в модуле управляемой формы:
КомандаДомой, и выведем ее на форму в виде кнопки.Документ нашего поля HTML.open(), write() и close() для полной перезаписи HTML-кода.Посмотрим на пример программного кода:
&НаКлиенте
Процедура КомандаДомой(Команда)
// Получаем доступ к внутреннему объекту документа HTML-поля
ДокументHTML = Элементы.ИмяПоляHTMLДокумента.Документ;
Если ДокументHTML <> Неопределено Тогда
// Открываем поток для записи, это очищает текущую страницу и сбрасывает состояние
ДокументHTML.open();
// Записываем исходный код главной страницы
ДокументHTML.write(ПолучитьИсходныйКодСтраницы());
// Закрываем поток, инициируя рендеринг страницы браузером
ДокументHTML.close();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ПолучитьИсходныйКодСтраницы()
// Возвращаем HTML-код вашей главной страницы
Возврат "<!DOCTYPE html><html><head><meta charset='utf-8'></head><body><h1>Главная страница</h1><p>Добро пожаловать в интерфейс!</p></body></html>";
КонецФункции
Этот способ мгновенно перерисовывает страницу прямо на клиенте, полностью игнорируя историю переходов браузера и предыдущие изменения на веб-странице.
Вместо создания кнопок на управляемой форме 1С мы можем сделать кнопку «Домой» внутри самого HTML-кода нашей страницы. Чтобы не связываться с внешними хостингами и сложной маршрутизацией, мы можем перехватить нажатие на эту кнопку на стороне 1С через специальное событие поля HTML-документа ПриНажатии.
Выполним следующие шаги:
<a href="#home" id="btnHome">Перейти на главную</a>
ПриНажатии.Проанализируем программный код обработчика события в 1С:
&НаКлиенте
Процедура ПолеHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
// Проверяем, кликнул ли пользователь на нашу ссылку возврата на главную
Если ДанныеСобытия.Element.id = "btnHome" Или Найти(ДанныеСобытия.Href, "#home") > 0 Тогда
// Отменяем стандартный переход браузера по ссылке
СтандартнаяОбработка = Ложь;
// Возвращаем исходный код страницы в реквизит формы, связанный с полем HTML
ИмяРеквизитаСвязанногоСПолем = ПолучитьИсходныйКодСтраницы();
КонецЕсли;
КонецПроцедуры
Этот метод чрезвычайно удобен, так как позволяет осуществлять бесшовную коммуникацию между интерфейсом HTML-страницы и платформой 1С без перезагрузки всей формы. Примером практической реализации подобного взаимодействия является решение для передачи файлов через Drag and Drop средствами HTML и 1С.
Выясним причину другой важной проблемы, упомянутой в обсуждении: почему на старых версиях платформы (например, 8.3.10) обработка открывается отлично, а на новых версиях (8.3.15 и выше) отображается совершенно пустой белый экран. Для контроля стабильности работы систем при массовом переходе на новые релизы пригодится инструмент для автоматического тестирования и обновления баз 1С в пакетном режиме.
Причина кроется в глубоком изменении архитектуры платформы. Начиная с версии 8.3.14.1565, фирма «1С» перевела клиентские приложения под ОС Windows со старого движка отображения Internet Explorer (MSHTML/Trident) на современный кроссплатформенный движок WebKit.
Новый движок WebKit значительно ускорил работу интерфейсов, но наложил жесткие требования на качество кода:
parentWindow для получения объекта окна) вызывают фатальные ошибки выполнения JS, останавливающие загрузку страницы.Чтобы ваша внешняя обработка гарантированно работала на любых релизах платформы (включая самые современные), придерживайтесь следующих правил верстки:
<!DOCTYPE html>
Это переключит движок встроенного браузера в режим стандартов (Standards Mode).
<style> внутри секции <head>. Это гарантирует их применение вне зависимости от настроек безопасности локальной файловой системы.C:\Temp\logo.png) преобразуйте картинки в двоичные данные Base64 в коде 1С и передавайте их прямо в тег изображения:
<img src="data:image/png;base64,iVBORw0KGgoAAAANS..." />
// Неправильно (работает только в старых версиях):
ОкноHTML = Элементы.ПолеHTML.Документ.parentWindow;
// Правильно (работает на WebKit и IE):
ОкноHTML = Элементы.ПолеHTML.Документ.defaultView;
Применение этих простых правил позволит создавать надежные и производительные интерактивные формы, которые сохранят полную работоспособность при любых обновлениях технологической платформы 1С:Предприятие. При необходимости подготовки и отладки разметки на форме можно воспользоваться обработкой-редактором HTML для управляемого интерфейса 1С.