Не обновляется картинка на форме в веб клиенте

1. sasha777666 321 18.10.18 12:50 Сейчас в теме
На форме обработки есть поле картинки которое связано с реквизитом объекта (Строка неограниченной длины). В реквизит объекта помещаю навигационную ссылку на реквизит регистра сведений (Хранилище значения) в котором хранится картинка.
Если картинка в регистре меняется то на форме в тонком клиенте изображение тоже меняется, а в веб клиенте остаётся висеть старая.

Не помогло:
-ОбновитьОтображениеДанных(Элементы.Картинка),
-ЭтаФорма.ОбновитьОтображениеДанных(),
-Элементы.Картинка.Обновить();
-Программная замена навигационной ссылки на другую (сделал второй реквизит дублирующий изображение)

Помогло но не подходит:
-С помощью обработчика ожидания каждые 0,5 сек включать выключать видимость поля картинки (при включении видимости изображение обновляется на новое)
-Интерактивная замена навигационной ссылки, тоесть кнопка по нажатию на которую происходит замена навигационной ссылки на другую (сделал второй реквизит дублирующий изображение)

Какие есть ещё варианты?
(Платформа 8.3.12, веб сервер апач)
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. qazaas 18.10.18 13:42 Сейчас в теме
(1) Получается, вы форму даже не закрываете, а хотите, чтобы в реальном времени она изменялась, так?

А почему обработчик ожидания не устраивает?
4. sasha777666 321 18.10.18 13:53 Сейчас в теме
(2) Да, всё так. Почему же не устраивает, вполне устраивает, с помощью него я каждые 0,5 сек вызываю Элементы.Картинка.Обновить(), в тонком клиенте это работает, в веб - нет
6. spacecraft 18.10.18 14:06 Сейчас в теме
(1) это вообще проблема не 1С, а браузера. Он все картинки тупо кеширует.
7. sasha777666 321 18.10.18 14:17 Сейчас в теме
(6) при переключении видимости поля картинка обновляется
8. spacecraft 18.10.18 14:23 Сейчас в теме
(7) при переключении видимости в ложь, браузер получает данные без картинки, соответственно убирает ее из кеша (кеш хранит актуальные данные с последнего получения данных). При включении картинки в предыдущем кеше ее нет, вот и загружает.
При последующем получении, если она есть в кеше, то не качает ее, а подставляет из кеша.
9. sasha777666 321 18.10.18 14:31 Сейчас в теме
(8) Интерактивная замена навигационной ссылки тоже помогает, на форме есть кнопка по нажатию на которую меняется навигационная ссылка в поле объекта связанным с картинкой, в этом случае поле картинки остаётся в браузере но он её меняет на новую, если же делать замену навигационной ссылки программно (обработчиком ожидания) то картинка не обновляется. С точки зрения браузера разницы нет ( ему в обоих случаях приходят одинаковые новые данные), а вот с точки зрения 1С первое действие интерактивное, а второе нет.
10. spacecraft 18.10.18 15:10 Сейчас в теме
(9) Браузер ничего не знает про 1С. Данные браузер получает в виде html, css и js, которые ему передает веб-сервер. Если адрес картинки указан ссылкой в html один и тот же, то картинка берется из кеша, если она там же по тому же адресу сохранена. Как работает навигационная ссылка нужно смотреть.
11. sasha777666 321 18.10.18 15:35 Сейчас в теме
(10)
Браузер ничего не знает про 1С

Я вам про это и говорил, что с точки зрения браузера разницы нет как будет сгенерирован для него код

Данные браузер получает в виде html, css и js

Это вообще к чему?

Как работает навигационная ссылка нужно смотреть

Зачем давать ответы если не знаете как она работает? здесь не Ответы на Мейл ру
12. spacecraft 18.10.18 15:51 Сейчас в теме
(11) если не поняли, то это не мои проблемы.
Первоначально: "На форме обработки есть поле картинки которое связано с реквизитом объекта".
Это будет преобразовано в html разметку со ссылкой на адрес картинки. Вот про это и обсуждали.
Потом уже начали это сравнивать с навигационной ссылкой. Думаете механизм одинаковый? Удачи в неведении дальше.
13. sasha777666 321 18.10.18 16:02 Сейчас в теме
(12) Реквизит объекта это и есть навигационная ссылка. В ХТМЛЬ код будет преобразовано всё что отображается в браузере и браузеру всё равно каким механизмом это будет сделано. Вы пишите какую-то ерунду про кеш браузера, когда я вам привёл пример рабочего варианта из которого очевидный вывод - проблема в 1С, ведь выходит что она может сгенерировать хтмль код который будет корректно работать но не хочет этого делать без интерактивного события.
14. spacecraft 18.10.18 16:10 Сейчас в теме
(13) смотрите. Когда интерактивно заменяете навигационную ссылку, в ссылке на картинку в html будет другой адрес. Соответственно браузер будет получать новую картинку.
Почему при программном подмене ссылки адрес не меняется я не знаю. Именно об этом и говорил.
Но мы же обсуждали сам факт, почему картинка не подгружается. Не в зависимости от подмены навигационной ссылки. Во всяком случае я это обсуждал. Если адрес не поменялся (не зависимо от самой картинки), то браузер считает это той-же самой картинкой.
15. Sashares 34 18.10.18 17:37 Сейчас в теме
(1)
Какие есть ещё варианты?

Чтобы в веб-клиенте перерисовалась картинка, нужно выполнить серверный вызов.
Мне такое помогало.
17. sasha777666 321 19.10.18 07:52 Сейчас в теме
(15)
обработчиком ожидания каждые 0,5 сек вызывал:
&НаСервере
Процедура СерверныйВызов()

ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
ОбработкаОбъект.ПустаяПроцедура();
ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект");

КонецПроцедуры

не помогло
20. Sashares 34 19.10.18 10:07 Сейчас в теме
(17)В серверной процедуре выполните
Элементы.Картинка.Обновить();
Или заново установите значение для картинки.
21. sasha777666 321 19.10.18 10:28 Сейчас в теме
(20)
Элементы.Картинка.Обновить();

На сервере нельзя, ошибка
"Метод поля картинки недоступен на сервере",

заново установите значение для картинки

Что имеете ввиду под заного установить? перезаполнить поле с навигационной ссылкой ею же ? так делал, не помогло
22. Sashares 34 19.10.18 10:31 Сейчас в теме
(21)А можете демо пример приложить?
24. sasha777666 321 19.10.18 10:50 Сейчас в теме
(22) Это встроенная обработка + фотография в регистре обновляется с камеры регламентным заданием, слишком много переделывать чтобы работала вне моей системы.
16. Sashares 34 18.10.18 17:41 Сейчас в теме
(1)
Если картинка в регистре меняется то на форме в тонком клиенте изображение тоже меняется, а в веб клиенте остаётся висеть старая.

Если картинку меняет тот же пользователь, то можно вызвать оповещение о событии - и в открытой форме с картинкой обработать оповещение - сходить на сервер и обновить картинку.
18. sasha777666 321 19.10.18 07:57 Сейчас в теме
(16)
сходить на сервер и обновить картинку

данные картинки с сервера вроде приходят, не обновляется поле картинки которое должно их отображать.
1. Сделал 2 поля картинки привязанных к одному и тому же реквизиту объекта с навигационной ссылкой.
2. Обработчиком ожидания каждые 0,5 сек для первого поля выполнял :
ОбновитьОтображениеДанных(Элементы.Картинка),
Элементы.Картинка.Обновить();
а для второго тоже самое + переключал видимость (видимо/невидимо)

во втором поле картинка обновлялась, в первом - нет
19. Sashares 34 19.10.18 10:06 Сейчас в теме
(18)

данные картинки с сервера вроде приходят, не обновляется поле картинки которое должно их отображать.

Они может и приходят, но чтобы в веб-клиенте перерисовалась форма - бывает нужно сходить на сервер.
Когда вы меняете видимость - выполняется серверный вызов.
Покажите лучше код.
23. sasha777666 321 19.10.18 10:39 Сейчас в теме
(19)
Поле картинки связано с реквизитом Объект.НавигационнаяСсылкаКартинки
Регистр непереодический с 1 измерением

&НаКлиенте
Процедура Мониторинг(Команда)
		  	 
     ПолучитьНавигационнуюСсылкуИзНаФотоВРегистре(); 
     ОбновитьКартинку();
				
КонецПроцедуры

&НаСервере
Процедура ПолучитьНавигационнуюСсылкуИзНаФотоВРегистре()
	
     КлючРегистра = РегистрыСведений.ТрансляцииКамерПоказ.СоздатьКлючЗаписи(Новый Структура("ИзмеренияРегистра", Объект.ЗначениеИзмеренияРегистра));  
	Объект.НавигационнаяСсылкаКартинки = ПолучитьНавигационнуюСсылку(КлючРегистра, "ХранилищеСФотографией");  						
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьКартинку()

     Элементы.КартинкаКамеры.Обновить();
     ПодключитьОбработчикОжидания("ОбновитьКартинку", 0.5, Истина);

КонецПроцедуры
Показать
25. Sashares 34 19.10.18 11:44 Сейчас в теме
(23)Воспроизвел у себя, и правда ничего нормального в вебе не помогает =(
26. kuzev 47 19.10.18 11:58 Сейчас в теме
(23) а если перенести вызов в процедуру ОбновитьКартинку() строку:
Объект.НавигационнаяСсылкаКартинки = ПолучитьНавигационнуюСсылку(КлючРегистра, "ХранилищеСФотографией");
27. sasha777666 321 19.10.18 13:36 Сейчас в теме
(26) Делал так, не помогло, более того, даже если менять навигационную ссылку на другую (для другой картинки) - тоже не помогает, картинка в веб клиенте остаётся статичной
28. kuzev 47 19.10.18 13:44 Сейчас в теме
(27) Ясно. Не представляю полностью Вашего решения, поэтому еще вариант. Выкладывать картинку из регистра по какому-то URL на веб-сервер, положить на форму поле HTML-документа с URL-картинки и обновлять его с периодичностью.
А так да, получается, что без полной "перерисовки" формы не получить новую картинку.
29. sasha777666 321 19.10.18 13:58 Сейчас в теме
(28) нет, такой вариант точно не подходит
30. sasha777666 321 22.10.18 08:17 Сейчас в теме
(1) Итак, экспериментально было определено, что веб клиент обновляет картинку при программном изменении навигационной ссылки в поле объекта связанным с картинкой если:
1.навигационная ссылка не повторяется в течении 10 сек.
2.после изменения поле объекта не меняется в течении 4 сек.

В качестве решения было сделано 3 реквизитов с хранилищем двоичных данных картинки, навигационные ссылки на которые которые последовательно с интервалом в 4 сек вставляются в поле объекта связанное с картинкой.

Помимо некошерности данного варианта, 1С начинает дико жрать память и когда она заканчивается в поле картинки отображается крестик, через некоторое время 1с падает с ошибкой из-за нехватки памяти.

Судя по всему память съедается кэшем в который помещается "Новое" изображение, как его можно принудительно очищать?

П.С.
Пробовал создавать временное хранилище помещать в него картинку и привязывать его адрес к полю объекта, а при обновлении удалять старые данные временного хранилища, память всёравно съедалась (сразу после выполнения "УдалитьИзВременногоХранилища" память освобождалась, но на меньший объём чем занималась при следующей итерации с картинкой)
40. sasha777666 321 22.10.18 12:09 Сейчас в теме
(30) - при работе через веб клиент процесс "rphost" (C:\Program Files (x86)\1cv8\8.3.12.1469\bin\rphost.exe) съедает 2910 Мбайт оперативки и 2850 Мбайт файла подкачки, после чего видимо начинает сам себя очищать, работа 1С продолжается ошибок нет, но нагрузка на диск около 5 Мбайт/сек.
- при работе через тонкий клиент оперативка съедается до сбоя с сообщение о нехватке памяти
33. Sashares 34 22.10.18 10:15 Сейчас в теме
(1)
Какие есть ещё варианты?

Не использовать веб-клиент, а вместо этого подключаться через тонкий клиент, не предлагать?
35. sasha777666 321 22.10.18 10:20 Сейчас в теме
(33)
иент, а вместо этого подключаться через тонкий клиент, не пр

:)) проблема с памятью всёравно остаётся
3. Boneman 298 18.10.18 13:49 Сейчас в теме
на ум приходит только генерация какого нибудь оповещения, при изменении регистра сведений.
Но если он где то в другом сеансе меняется, то тут кроме обработчика ожидания сложно что-то придумать.
Единственное не постоянно щелкать нужно картинку, а проверять регистр и по какому то признаку, чтобы оно щелкало именно когда картинка изменилась. Флаг там булевский сделать, или дата записи, или еще по какому то признаку.
Вхолостую щелкать видимость, конечно не стоит. А сам по себе обработчик ожидания, это стандартная тема, вполне себе подходит для подобных решений.
5. sasha777666 321 18.10.18 13:57 Сейчас в теме
(3) Обработчиком ожидания каждые 0,5 сек выполняю
Элементы.Картинка.Обновить();
ЭтаФорма.ОбновитьОтображениеДанных();
не помогает

"а проверять регистр и по какому то признаку, чтобы оно щелкало именно когда картинка изменилась" программное щёлканье тоже не помогает, менял навигационную ссылку программно ничего не происходило, делал то же самое по событию нажатия на кнопку - работало
31. EVKash 14 22.10.18 08:39 Сейчас в теме
Если проблема реально в кешировании, то может быть попробовать отключить кеширование на стороне веб-сервера?
Можно вот так попробовать. На сколько трафик увеличится - надо пробовать.
Запретить кэширование страницы с помощью .htaccess
Для простоты реализации идеи, можно все сделать на уровне конфигураций сервера Apache. Перед этим, нам нужно убедиться в том, что необходимые модули находятся в рабочем состоянии. Открываем конфигурационный файл Apache и наблюдаем следующую картину:

LoadModule expires_module modules/mod_expires.so
LoadModule headers_module modules/mod_headers.so
...
AddModule mod_expires.c
AddModule mod_headers.c
Теперь в файле .htaccess, собственно запрещаем кэшировать выводимые данные. Как нам известно, .htaccess файл будет распространяться на директорию, в которой лежит, и на все субдиректории.


# Заголовок Cache-Control
<IfModule mod_headers.c>
Header append Cache-Control "no-store, no-cache, must-revalidate"
</IfModule>

# Заголовок Expires
<IfModule mod_expires.c>
ExpiresActive On ExpiresDefault "now"
</IfModule>
Важно заметить, что полный запрет кэширования, повышает нагрузку на сервер. Поэтому, играйтесь с этим осторожно! А лучше, установите определенное время, на которое можно кэшировать документы. Например, установим кэширование на 1 час:

# Заголовок Cache-Control
<IfModule mod_headers.c>
Header append Cache-Control "public"
</IfModule>

# Заголовок Expires
<IfModule mod_expires.c>
ExpiresActive On ExpiresDefault "access plus 1 hours"
</IfModule>
Показать
32. sasha777666 321 22.10.18 10:04 Сейчас в теме
(31) В случае с тонким клиентом память съедает процесс клиентской 1С на стороне клиента, а в случае с веб память съедается процессом "rphost" (C:\Program Files (x86)\1cv8\8.3.12.1469\bin\rphost.exe) на стороне сервера. Я так понимаю именно в нём находятся данные клиента которые апач отправляет в веб.
34. EVKash 14 22.10.18 10:19 Сейчас в теме
(32)
В случае с тонким клиентом память съедает процесс клиентской 1С на стороне клиента, а в случае с веб память съедается процессом "rphost" (C:\Program Files (x86)\1cv8\8.3.12.1469\bin\rphost.exe) на стороне сервера.

Убрать этот костыль, отключить кэширование на апаче и проверить.
В качестве решения было сделано 3 реквизитов с хранилищем двоичных данных картинки, навигационные ссылки на которые которые последовательно с интервалом в 4 сек вставляются в поле объекта связанное с картинкой.

Помимо некошерности данного варианта, 1С начинает дико жрать память и когда она заканчивается в поле картинки отображается крестик, через некоторое время 1с падает с ошибкой из-за нехватки памяти.
36. sasha777666 321 22.10.18 10:26 Сейчас в теме
(34) Дело в том что память съедается и при правильном варианте (в регистре сведений один реквизит с данными картинки, навигационнаяя ссылка одна и не меняется). Когда в регистре меняется фото, то тонкий клиент его обновляет, но при этом жрёт память(я сразу этого не заметил, т.к. был сконцентрирован на веб клиенте), веб клиент в этом случае вообще не работает (отображает статичную картинку). Даже если отключение кэша на стороне веб клиента поможет решить проблему с обновлением изображения, то работать оно не будет из-за проблемы с памятью.
37. DarkUser 22.10.18 10:45 Сейчас в теме
Можно попробовать создавать реквизит, в котором хранится ссылка на картинку в 1С программно, а при смене картинки этот реквизит удалять и создавать новый. В этом случае ссылка на картинку наверняка будет другой и не будет повторяться.
38. sasha777666 321 22.10.18 12:04 Сейчас в теме
(37)Не получилось привязать поле картинки к созданному реквизиту, свойство элемента формы "ПутьКДанным" можно редактировать только если оно не задано, а для вида элемента Поле картинки оно не может быть не заданным ( если оно не задано то нет возможности выбрать вид поля)
39. Sashares 34 22.10.18 12:07 Сейчас в теме
Вы не первый, кто таким заморачивается))
Тут тоже пишут про проблемы с памятью
https://partners.v8.1c.ru/forum/t/1389507/m/1389507
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот