В процессе разработки на платформе 1С:Предприятие 8.3 многие специалисты сталкиваются с ситуацией, когда при программном изменении содержимого реквизита, содержащего навигационную ссылку на ХранилищеЗначения, веб-клиент отказывается отображать актуальную картинку. В тонком клиенте изображение меняется корректно, а веб-браузер продолжает демонстрировать старую версию. Давайте разберемся, почему это происходит и какие существуют пути решения данной задачи.
Главная причина кроется не в самой платформе 1С, а в механизмах работы современных браузеров. Когда мы используем ПолеКартинки, связанное с навигационной ссылкой, 1С генерирует HTML-разметку, где тег img ссылается на определенный URL. Браузер, получив этот путь, кеширует ресурс. Если при обновлении картинки навигационная ссылка внешне остается прежней, браузер «считает», что содержимое не изменилось, и загружает изображение из локального кеша, игнорируя новые данные, пришедшие с сервера.
Экспериментально установлено, что веб-клиент корректно обновляет изображение, если изменение навигационной ссылки происходит в результате интерактивного действия пользователя (например, нажатия кнопки). Это происходит потому, что такие действия вызывают принудительную перерисовку части DOM-структуры страницы. Если у вас есть возможность реализовать обновление через явное действие пользователя, это самый простой путь, не требующий программных обходных путей.
Если обновление должно происходить автоматически, можно попробовать повлиять на поведение браузера через настройки веб-сервера Apache. Мы можем запретить кеширование данных, передаваемых через конкретные пути.
В файле .htaccess можно добавить инструкции, которые заставят браузер каждый раз запрашивать актуальную версию изображения:
# Запрет кеширования
Header append Cache-Control "no-store, no-cache, must-revalidate"
ExpiresActive On
ExpiresDefault "now"
Важно помнить, что полный запрет кеширования увеличивает нагрузку на ваш веб-сервер и ширину канала связи, поэтому используйте данный метод с осторожностью.
Если вы столкнулись с необходимостью автоматического обновления, вы можете использовать стратегию чередования нескольких реквизитов. Суть метода заключается в том, что мы создаем несколько реквизитов формы для хранения навигационных ссылок и переключаемся между ними программно. Браузер воспринимает новый URL как запрос к новому ресурсу и принудительно обновляет содержимое.
// Пример логики переключения
Процедура ОбновитьКартинкуВВеб()
Если ТекущийРеквизит = 1 Тогда
Объект.Ссылка = Ссылка1;
ТекущийРеквизит = 2;
Иначе
Объект.Ссылка = Ссылка2;
ТекущийРеквизит = 1;
КонецЕсли;
КонецПроцедуры
Однако будьте внимательны: при очень частых обновлениях (например, каждые 0,5 секунды) могут возникать утечки памяти на стороне сервера rphost, так как браузер и сервер 1С начинают накапливать большое количество объектов в памяти. Рекомендуется увеличить интервал обновления до 5-10 секунд.
Наиболее гибким и профессиональным способом решения данной задачи является отказ от стандартного ПоляКартинки в пользу ПоляHTMLДокумента. Этот подход дает нам полный контроль над тегом img и его атрибутом src.
Мы можем добавлять к навигационной ссылке случайный параметр или метку времени (timestamp), что гарантированно заставит браузер игнорировать кеш:
// Формирование HTML для отображения картинки
АктуальнаяСсылка = ПолучитьНавигационнуюСсылку(КлючЗаписи, "Хранилище");
ТекстHTML = "<html><body><img src='" + АктуальнаяСсылка + "&rnd=" + ТекущееВремя() + "'></body></html>";
Элементы.ПолеHTML.УстановитьТекст(ТекстHTML);
Благодаря добавлению параметра &rnd=..., для браузера каждый URL становится уникальным, что гарантирует получение свежих данных с сервера при каждом цикле обновления.
Чтобы избежать перегрузки системы и проблем с памятью, проанализируем следующие рекомендации:
Оповестить. Когда регламентное задание меняет фото в регистре, оно может отправить оповещение всем активным клиентам, чтобы они обновили отображение картинки в форме.УдалитьИзВременногоХранилища().Проанализировав эти способы, вы сможете подобрать оптимальное решение для вашей системы, которое обеспечит корректную работу в веб-клиенте без потери стабильности и производительности.