При разработке внешних обработок в 1С:Предприятие часто возникает необходимость динамически изменять содержимое Поля HTML-документа. На старых версиях платформы, таких как 8.3.10, вызов метода ЭтаФорма.ОбновитьОтображениеДанных(Элементы.Реквизит1) работал безотказно. Однако при переходе на версии 8.3.15 и выше разработчики столкнулись с неприятным сюрпризом: после перехода по ссылкам внутри HTML-страницы принудительное обновление перестает реагировать, и содержимое не возвращается к исходному состоянию. Если требуется готовое решение для работы с разметкой на управляемой форме, можно использовать расширяемый редактор форматированного текста для 1С.
Давайте разберемся, в чем кроется причина такого поведения и как заставить форму корректно обновляться.
Проблема заключается не в ошибке платформы, а в изменившейся логике работы встроенного движка WebKit. Начиная с версии 8.3.15, механизм кэширования и перерисовки содержимого стал более строгим и оптимизированным. Если движок браузера «видит», что передаваемый ему HTML-код идентичен тому, что уже отрисован, он просто игнорирует запрос на обновление, чтобы не тратить ресурсы системы.
Таким образом, когда вы присваиваете реквизиту старую строку, платформа считает, что изменений нет, и ОбновитьОтображениеДанных не выполняет никакой работы. Чтобы система «увидела» изменения, нам необходимо гарантировать уникальность данных при каждом обновлении.
Самый надежный способ «обмануть» кэш браузера — это принудительно изменять содержимое передаваемой строки. Мы можем добавить в HTML-код невидимый комментарий, который будет содержать текущую метку времени. Благодаря этому каждый вызов кода будет уникальным с точки зрения WebKit.
Рассмотрим, как реализовать этот подход на практике:
&НаКлиенте
Процедура Команда1(Команда)
// Формируем уникальный идентификатор на основе времени в миллисекундах
УникальныйКод = XMLСтрока(ТекущаяУниверсальнаяДатаВМиллисекундах());
// Исходный HTML-код
ТекстХТМЛ = "<html><body><h3>Привет, мир!</h3><!-- Время: %1 --></body></html>";
// Заменяем метку на уникальное значение
ТекстХТМЛ = СтрЗаменить(ТекстХТМЛ, "%1", УникальныйКод);
// Записываем измененный текст в реквизит формы
ЭтотОбъект.Реквизит1 = ТекстХТМЛ;
КонецПроцедуры
Используя этот метод, вы принуждаете движок выполнять полную перерисовку страницы, так как для него содержимое документа каждый раз является «новым».
Если вы хотите обновить данные объекта формы, можно воспользоваться методом ЭтаФорма.Прочитать(). Этот метод предназначен для обновления данных формы клиентского приложения и в ряде сценариев позволяет принудительно обновить состояние элементов управления, привязанных к данным формы.
Обратите внимание на последовательность действий:
Прочитать() для фиксации изменений в интерфейсе.Часто возникает вопрос: можно ли вынести логику формирования HTML в модуль объекта, чтобы не загромождать форму? Да, это возможно, но с определенными оговорками.
Важно помнить:
Поле HTML-документа — это элемент формы, взаимодействие с ним всегда происходит на клиенте.Экспортную функцию в модуле объекта, которая будет возвращать готовую строку с HTML-кодом, включая динамическую метку времени.Мы выяснили, что отсутствие реакции на обновление связано с оптимизацией движка WebKit. Чтобы избежать зависания страницы:
ТекущаяУниверсальнаяДатаВМиллисекундах).Применив эти советы, вы сможете добиться стабильной работы ваших обработок на любых современных версиях платформы 1С:Предприятие 8.3.