Как обновить поле HTML-документа и реализовать кнопку перехода на главную страницу в 1С

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

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

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

Почему стандартные методы обновления формы не работают

Рассмотрим типичную ошибку начинающих разработчиков. При попытке обновить содержимое поля HTML-документа часто пытаются повторно вызвать метод ОткрытьФорму или программно присвоить строковому реквизиту формы, связанному с полем HTML, исходный код страницы, очистив его перед этим:


&НаКлиенте
Процедура Домой(Команда)
    Реквизит1 = "";
    ОбновитьОтображениеДанных(Элементы.Реквизит1);
    Реквизит1 = "Код страницы";
    ОбновитьОтображениеДанных(Элементы.Реквизит1);
КонецПроцедуры

Такой подход не дает результата по одной простой причине: оптимизация платформы 1С не инициирует полную перезагрузку DOM-модели встроенного браузера, если строковое значение реквизита кажется ей идентичным или если навигация внутри HTML-документа увела пользователя на другую страницу. Метод ОбновитьОтображениеДанных предназначен для элементов интерфейса 1С, но он не управляет напрямую внутренним состоянием кэша и истории переходов браузера (особенно после перехода по внешним ссылкам).

Разберем два надежных и профессиональных способа решения этой задачи напрямую в 1С без выгрузки страниц на внешние сервера.

Способ 1. Прямое управление DOM-моделью HTML-документа

Самый быстрый и надежный способ принудительно обновить содержимое поля — использовать прямые методы документа встроенного браузера. Для этого мы получаем доступ к объекту документа через элементы формы и перезаписываем его содержимое.

Рассмотрим по шагам реализацию этого метода в модуле управляемой формы:

  1. Создадим команду формы, например, КомандаДомой, и выведем ее на форму в виде кнопки.
  2. В обработчике команды обратимся к свойству Документ нашего поля HTML.
  3. Используем методы 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>";
КонецФункции

Этот способ мгновенно перерисовывает страницу прямо на клиенте, полностью игнорируя историю переходов браузера и предыдущие изменения на веб-странице.

Способ 2. Использование перехвата событий (Лучшая практика)

Вместо создания кнопок на управляемой форме 1С мы можем сделать кнопку «Домой» внутри самого HTML-кода нашей страницы. Чтобы не связываться с внешними хостингами и сложной маршрутизацией, мы можем перехватить нажатие на эту кнопку на стороне 1С через специальное событие поля HTML-документа ПриНажатии.

Выполним следующие шаги:

  1. Добавим в HTML-код нашей страницы ссылку-заглушку с уникальным идентификатором: <a href="#home" id="btnHome">Перейти на главную</a>
  2. Для элемента формы «Поле HTML-документа» определим клиентское событие ПриНажатии.
  3. В обработчике события проверим, какой именно элемент вызвал событие, отменим стандартное поведение браузера (чтобы не происходил реальный переход по ссылке) и программно обновим реквизит страницы.

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


&НаКлиенте
Процедура ПолеHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
    
    // Проверяем, кликнул ли пользователь на нашу ссылку возврата на главную
    Если ДанныеСобытия.Element.id = "btnHome" Или Найти(ДанныеСобытия.Href, "#home") > 0 Тогда
        
        // Отменяем стандартный переход браузера по ссылке
        СтандартнаяОбработка = Ложь; 
        
        // Возвращаем исходный код страницы в реквизит формы, связанный с полем HTML
        ИмяРеквизитаСвязанногоСПолем = ПолучитьИсходныйКодСтраницы(); 
        
    КонецЕсли;
    
КонецПроцедуры

Этот метод чрезвычайно удобен, так как позволяет осуществлять бесшовную коммуникацию между интерфейсом HTML-страницы и платформой 1С без перезагрузки всей формы. Примером практической реализации подобного взаимодействия является решение для передачи файлов через Drag and Drop средствами HTML и 1С.

Решение проблемы белого экрана на платформе 8.3.14+ (Переход на WebKit)

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

Причина кроется в глубоком изменении архитектуры платформы. Начиная с версии 8.3.14.1565, фирма «1С» перевела клиентские приложения под ОС Windows со старого движка отображения Internet Explorer (MSHTML/Trident) на современный кроссплатформенный движок WebKit.

Новый движок WebKit значительно ускорил работу интерфейсов, но наложил жесткие требования на качество кода:

Рекомендации по адаптации HTML-кода для новых версий 1С

Чтобы ваша внешняя обработка гарантированно работала на любых релизах платформы (включая самые современные), придерживайтесь следующих правил верстки:

  1. Всегда объявляйте DOCTYPE: Начинайте формирование любой HTML-строки со следующей декларации: <!DOCTYPE html> Это переключит движок встроенного браузера в режим стандартов (Standards Mode).
  2. Внедряйте стили (CSS) непосредственно в документ: Откажитесь от внешних CSS-файлов. Описывайте стили в теге <style> внутри секции <head>. Это гарантирует их применение вне зависимости от настроек безопасности локальной файловой системы.
  3. Кодируйте картинки в Base64: Вместо указания локальных путей к файлам картинок (например, C:\Temp\logo.png) преобразуйте картинки в двоичные данные Base64 в коде 1С и передавайте их прямо в тег изображения: <img src="data:image/png;base64,iVBORw0KGgoAAAANS..." />
  4. Используйте defaultView вместо parentWindow: Если вы получаете доступ к глобальному объекту окна браузера из модуля 1С, замените устаревшие обращения:
    
    // Неправильно (работает только в старых версиях):
    ОкноHTML = Элементы.ПолеHTML.Документ.parentWindow;
            
    // Правильно (работает на WebKit и IE):
    ОкноHTML = Элементы.ПолеHTML.Документ.defaultView;
    

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

← На главную