На форме обработки есть поле картинки которое связано с реквизитом объекта (Строка неограниченной длины). В реквизит объекта помещаю навигационную ссылку на реквизит регистра сведений (Хранилище значения) в котором хранится картинка.
Если картинка в регистре меняется то на форме в тонком клиенте изображение тоже меняется, а в веб клиенте остаётся висеть старая.
Не помогло:
-ОбновитьОтображениеДанных(Элементы.Картинка),
-ЭтаФорма.ОбновитьОтображениеДанных(),
-Элементы.Картинка.Обновить();
-Программная замена навигационной ссылки на другую (сделал второй реквизит дублирующий изображение)
Помогло но не подходит:
-С помощью обработчика ожидания каждые 0,5 сек включать выключать видимость поля картинки (при включении видимости изображение обновляется на новое)
-Интерактивная замена навигационной ссылки, тоесть кнопка по нажатию на которую происходит замена навигационной ссылки на другую (сделал второй реквизит дублирующий изображение)
Какие есть ещё варианты?
(Платформа 8.3.12, веб сервер апач)
(2) Да, всё так. Почему же не устраивает, вполне устраивает, с помощью него я каждые 0,5 сек вызываю Элементы.Картинка.Обновить(), в тонком клиенте это работает, в веб - нет
(7) при переключении видимости в ложь, браузер получает данные без картинки, соответственно убирает ее из кеша (кеш хранит актуальные данные с последнего получения данных). При включении картинки в предыдущем кеше ее нет, вот и загружает.
При последующем получении, если она есть в кеше, то не качает ее, а подставляет из кеша.
(8) Интерактивная замена навигационной ссылки тоже помогает, на форме есть кнопка по нажатию на которую меняется навигационная ссылка в поле объекта связанным с картинкой, в этом случае поле картинки остаётся в браузере но он её меняет на новую, если же делать замену навигационной ссылки программно (обработчиком ожидания) то картинка не обновляется. С точки зрения браузера разницы нет ( ему в обоих случаях приходят одинаковые новые данные), а вот с точки зрения 1С первое действие интерактивное, а второе нет.
(9) Браузер ничего не знает про 1С. Данные браузер получает в виде html, css и js, которые ему передает веб-сервер. Если адрес картинки указан ссылкой в html один и тот же, то картинка берется из кеша, если она там же по тому же адресу сохранена. Как работает навигационная ссылка нужно смотреть.
(11) если не поняли, то это не мои проблемы.
Первоначально: "На форме обработки есть поле картинки которое связано с реквизитом объекта".
Это будет преобразовано в html разметку со ссылкой на адрес картинки. Вот про это и обсуждали.
Потом уже начали это сравнивать с навигационной ссылкой. Думаете механизм одинаковый? Удачи в неведении дальше.
(12) Реквизит объекта это и есть навигационная ссылка. В ХТМЛЬ код будет преобразовано всё что отображается в браузере и браузеру всё равно каким механизмом это будет сделано. Вы пишите какую-то ерунду про кеш браузера, когда я вам привёл пример рабочего варианта из которого очевидный вывод - проблема в 1С, ведь выходит что она может сгенерировать хтмль код который будет корректно работать но не хочет этого делать без интерактивного события.
(13) смотрите. Когда интерактивно заменяете навигационную ссылку, в ссылке на картинку в html будет другой адрес. Соответственно браузер будет получать новую картинку.
Почему при программном подмене ссылки адрес не меняется я не знаю. Именно об этом и говорил.
Но мы же обсуждали сам факт, почему картинка не подгружается. Не в зависимости от подмены навигационной ссылки. Во всяком случае я это обсуждал. Если адрес не поменялся (не зависимо от самой картинки), то браузер считает это той-же самой картинкой.
(22) Это встроенная обработка + фотография в регистре обновляется с камеры регламентным заданием, слишком много переделывать чтобы работала вне моей системы.
Если картинка в регистре меняется то на форме в тонком клиенте изображение тоже меняется, а в веб клиенте остаётся висеть старая.
Если картинку меняет тот же пользователь, то можно вызвать оповещение о событии - и в открытой форме с картинкой обработать оповещение - сходить на сервер и обновить картинку.
данные картинки с сервера вроде приходят, не обновляется поле картинки которое должно их отображать.
1. Сделал 2 поля картинки привязанных к одному и тому же реквизиту объекта с навигационной ссылкой.
2. Обработчиком ожидания каждые 0,5 сек для первого поля выполнял :
ОбновитьОтображениеДанных(Элементы.Картинка),
Элементы.Картинка.Обновить();
а для второго тоже самое + переключал видимость (видимо/невидимо)
во втором поле картинка обновлялась, в первом - нет
данные картинки с сервера вроде приходят, не обновляется поле картинки которое должно их отображать.
Они может и приходят, но чтобы в веб-клиенте перерисовалась форма - бывает нужно сходить на сервер.
Когда вы меняете видимость - выполняется серверный вызов.
Покажите лучше код.
(26) Делал так, не помогло, более того, даже если менять навигационную ссылку на другую (для другой картинки) - тоже не помогает, картинка в веб клиенте остаётся статичной
(27) Ясно. Не представляю полностью Вашего решения, поэтому еще вариант. Выкладывать картинку из регистра по какому-то URL на веб-сервер, положить на форму поле HTML-документа с URL-картинки и обновлять его с периодичностью.
А так да, получается, что без полной "перерисовки" формы не получить новую картинку.
(1) Итак, экспериментально было определено, что веб клиент обновляет картинку при программном изменении навигационной ссылки в поле объекта связанным с картинкой если:
1.навигационная ссылка не повторяется в течении 10 сек.
2.после изменения поле объекта не меняется в течении 4 сек.
В качестве решения было сделано 3 реквизитов с хранилищем двоичных данных картинки, навигационные ссылки на которые которые последовательно с интервалом в 4 сек вставляются в поле объекта связанное с картинкой.
Помимо некошерности данного варианта, 1С начинает дико жрать память и когда она заканчивается в поле картинки отображается крестик, через некоторое время 1с падает с ошибкой из-за нехватки памяти.
Судя по всему память съедается кэшем в который помещается "Новое" изображение, как его можно принудительно очищать?
П.С.
Пробовал создавать временное хранилище помещать в него картинку и привязывать его адрес к полю объекта, а при обновлении удалять старые данные временного хранилища, память всёравно съедалась (сразу после выполнения "УдалитьИзВременногоХранилища" память освобождалась, но на меньший объём чем занималась при следующей итерации с картинкой)
(30) - при работе через веб клиент процесс "rphost" (C:\Program Files (x86)\1cv8\8.3.12.1469\bin\rphost.exe) съедает 2910 Мбайт оперативки и 2850 Мбайт файла подкачки, после чего видимо начинает сам себя очищать, работа 1С продолжается ошибок нет, но нагрузка на диск около 5 Мбайт/сек.
- при работе через тонкий клиент оперативка съедается до сбоя с сообщение о нехватке памяти
на ум приходит только генерация какого нибудь оповещения, при изменении регистра сведений.
Но если он где то в другом сеансе меняется, то тут кроме обработчика ожидания сложно что-то придумать.
Единственное не постоянно щелкать нужно картинку, а проверять регистр и по какому то признаку, чтобы оно щелкало именно когда картинка изменилась. Флаг там булевский сделать, или дата записи, или еще по какому то признаку.
Вхолостую щелкать видимость, конечно не стоит. А сам по себе обработчик ожидания, это стандартная тема, вполне себе подходит для подобных решений.
(3) Обработчиком ожидания каждые 0,5 сек выполняю
Элементы.Картинка.Обновить();
ЭтаФорма.ОбновитьОтображениеДанных();
не помогает
"а проверять регистр и по какому то признаку, чтобы оно щелкало именно когда картинка изменилась" программное щёлканье тоже не помогает, менял навигационную ссылку программно ничего не происходило, делал то же самое по событию нажатия на кнопку - работало
Если проблема реально в кешировании, то может быть попробовать отключить кеширование на стороне веб-сервера?
Можно вот так попробовать. На сколько трафик увеличится - надо пробовать.
Запретить кэширование страницы с помощью .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 файл будет распространяться на директорию, в которой лежит, и на все субдиректории.
# Заголовок Expires
<IfModule mod_expires.c>
ExpiresActive On ExpiresDefault "now"
</IfModule>
Важно заметить, что полный запрет кэширования, повышает нагрузку на сервер. Поэтому, играйтесь с этим осторожно! А лучше, установите определенное время, на которое можно кэшировать документы. Например, установим кэширование на 1 час:
(31) В случае с тонким клиентом память съедает процесс клиентской 1С на стороне клиента, а в случае с веб память съедается процессом "rphost" (C:\Program Files (x86)\1cv8\8.3.12.1469\bin\rphost.exe) на стороне сервера. Я так понимаю именно в нём находятся данные клиента которые апач отправляет в веб.
В случае с тонким клиентом память съедает процесс клиентской 1С на стороне клиента, а в случае с веб память съедается процессом "rphost" (C:\Program Files (x86)\1cv8\8.3.12.1469\bin\rphost.exe) на стороне сервера.
Убрать этот костыль, отключить кэширование на апаче и проверить.
В качестве решения было сделано 3 реквизитов с хранилищем двоичных данных картинки, навигационные ссылки на которые которые последовательно с интервалом в 4 сек вставляются в поле объекта связанное с картинкой.
Помимо некошерности данного варианта, 1С начинает дико жрать память и когда она заканчивается в поле картинки отображается крестик, через некоторое время 1с падает с ошибкой из-за нехватки памяти.
(34) Дело в том что память съедается и при правильном варианте (в регистре сведений один реквизит с данными картинки, навигационнаяя ссылка одна и не меняется). Когда в регистре меняется фото, то тонкий клиент его обновляет, но при этом жрёт память(я сразу этого не заметил, т.к. был сконцентрирован на веб клиенте), веб клиент в этом случае вообще не работает (отображает статичную картинку). Даже если отключение кэша на стороне веб клиента поможет решить проблему с обновлением изображения, то работать оно не будет из-за проблемы с памятью.
Можно попробовать создавать реквизит, в котором хранится ссылка на картинку в 1С программно, а при смене картинки этот реквизит удалять и создавать новый. В этом случае ссылка на картинку наверняка будет другой и не будет повторяться.
(37)Не получилось привязать поле картинки к созданному реквизиту, свойство элемента формы "ПутьКДанным" можно редактировать только если оно не задано, а для вида элемента Поле картинки оно не может быть не заданным ( если оно не задано то нет возможности выбрать вид поля)