Коллеги, сегодня мы разберем важную и часто встречающуюся задачу: как отобразить файлы JPG, хранящиеся вне базы данных (например, когда была выполнена выгрузка картинок номенклатуры в каталог), в веб-клиенте 1С. Эта ситуация часто возникает, когда пользователям необходимо показать изображения, пути к которым известны.
Мы проанализируем основные подходы, включая такую задачу как выгрузка прикрепленных файлов, и рассмотрим примеры кода для веб-клиента.
Прежде чем перейти к решению, нам важно понять, почему прямая работа с файлами на сервере и отображение их в веб-клиенте имеет свои нюансы. Веб-клиент, по своей сути, является браузерным приложением, и на него распространяются стандартные ограничения безопасности веб-браузеров. Это означает, что веб-клиент:
Для решения подобных задач в 1С используется механизм временного хранилища. Этот механизм позволяет безопасно передавать двоичные данные между сервером и клиентом, будь то тонкий или веб-клиент.
Рассмотрим стандартный и наиболее эффективный способ отображения JPG-файлов из файловой системы сервера в веб-клиенте 1С. Этот подход включает в себя несколько этапов:
Все операции, связанные с доступом к файловой системе сервера, должны выполняться на сервере. Для этого мы создаем серверную процедуру. Предположим, у нас есть путь к папке (это могут быть и скриншоты, созданные в 1С), и мы хотим отобразить фотографию, имя которой формируется из идентификатора с расширением .jpg.
&НаСервере
Процедура ПоказатьКартинкуНаСервере()
// 1. Получаем базовый путь к папке с изображениями.
// Предполагается, что Константы.ПутьФото хранит путь вида "C:\Photos\" или "/var/www/photos/"
Перем ПутьКПапке;
ПутьКПапке = Константы.ПутьФото.Получить();
// 2. Формируем полное имя файла изображения.
// Объект.Код - это, например, код элемента справочника, к которому привязана картинка.
Перем ИмяФайла;
ИмяФайла = ПутьКПапке + Объект.Код + ".jpg";
// 3. Читаем файл в двоичные данные.
// Если файл не найден или недоступен, может возникнуть ошибка.
Перем ДвоичныеДанныеФайла;
Попытка
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИмяФайла);
Исключение
// Обработка ошибки, если файл не существует или недоступен.
// Можно установить пустую картинку или вывести сообщение пользователю.
ДвоичныеДанныеФайла = Неопределено;
Возврат;
КонецПопытки;
// 4. Помещаем двоичные данные во временное хранилище.
// УникальныйИдентификатор используется, чтобы данные хранились уникально и не пересекались.
// Адрес - это строка, которую мы передадим на клиент для отображения.
Перем АдресВХранилище;
АдресВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайла, УникальныйИдентификатор);
// 5. Передаем адрес временного хранилища в реквизит формы,
// который будет использоваться для отображения на клиенте.
// Предполагается, что на форме есть реквизит с именем СсылкаНаКартинку.
СсылкаНаКартинку = АдресВХранилище;
КонецПроцедуры
В этом примере мы используем объект ДвоичныеДанные, который позволяет работать с содержимым файла. Также может быть полезно сжатие строк внутренними методами 1С. Метод ПоместитьВоВременноеХранилище() возвращает строковый адрес на данные.
Для того чтобы изображение отобразилось в веб-клиенте, нам потребуется выполнить несколько настроек на форме:
СсылкаНаКартинку и зададим ему тип Строка.СсылкаНаКартинку.Когда в реквизит СсылкаНаКартинку будет установлен адрес из временного хранилища, элемент "Поле картинки" автоматически загрузит и отобразит изображение, доступное по этому адресу.
Важно понимать, как работает временное хранилище:
УникальныйИдентификатор формы), они автоматически удаляются после закрытия этой формы.Хотя описанный выше метод является стандартным для отображения одиночных изображений, для более сложной работы с файлами (например, множественный экспорт/импорт, программный доступ к файловой системе клиента) в веб-клиенте может потребоваться установка "расширения работы с файлами".
Давайте проанализируем, почему могут возникать проблемы при отображении JPG в веб-клиенте, основываясь на опыте коллег и дополнительной информации:
Как показал опыт коллеги в сообщении 21, иногда проблема заключается не в коде 1С, а в самих файлах изображений. Если JPG-файлы генерируются скриптами из других форматов (например, PDF, PS), убедитесь, что:
145.JPG и 145.jpg могут восприниматься как разные файлы. Всегда старайтесь придерживаться единого регистра для расширений файлов.Что делать: Проверьте файл на сервере обычным графическим просмотрщиком. Убедитесь, что он открывается и отображается корректно. Возможно, потребуется перенастроить скрипты генерации.
ИмяФайла (в нашем примере) содержит абсолютно корректный и полный путь к файлу на сервере. Опечатки, неверные разделители каталогов (\ вместо / или наоборот, в зависимости от ОС сервера) могут быть причиной.ДвоичныеДанные.Что делать: Используйте отладчик, чтобы проверить значение переменной ИмяФайла непосредственно перед вызовом Новый ДвоичныеДанные(ИмяФайла). Попробуйте скопировать этот путь и вставить его в проводник (для Windows) или терминал (для Linux) на сервере, чтобы убедиться в доступности файла.
Иногда изображение не отображается сразу после загрузки в веб-клиенте, но появляется после перезапуска программы или повторного открытия формы. Это может указывать на проблемы с:
СсылкаНаКартинку происходит обновление элементов формы, если это необходимо. Иногда явный вызов ОбновитьЭлементы() может помочь, хотя для связанных реквизитов это чаще всего происходит автоматически.Что делать: Проверьте, что в реквизит СсылкаНаКартинку действительно записывается новый адрес временного хранилища. Если проблема проявляется только после нескольких обновлений, попробуйте очистить кэш браузера или использовать режим инкогнито для тестирования.
Если речь идет о большом количестве изображений или очень крупных файлах, рассмотрим следующие моменты:
ХранилищеЗначения в справочнике, а на форме — ссылку на него. В нашем случае мы читаем с файловой системы, что обычно достаточно быстро.Что делать: Оптимизируйте размер изображений. Если изображения большие, рассмотрите возможность создания превью (миниатюр) и отображения их по умолчанию, а полную версию показывать по запросу.
Современные форматы изображений, такие как WebP, не всегда поддерживаются стандартными конфигурациями 1С или старыми версиями браузеров, используемых в веб-клиенте. Убедитесь, что используете широко поддерживаемые форматы, такие как JPG, PNG, GIF.
Что делать: Придерживайтесь JPG для фотографий (сжатие с потерями) и PNG для графики с прозрачностью или четкими линиями (сжатие без потерь).
Итак, мы выяснили, что стандартный подход к отображению JPG-файлов из файловой системы сервера в веб-клиенте 1С заключается в следующем:
ДвоичныеДанные.ВременноеХранилище, получая адрес.ПолеКартинки, связанный с этим строковым реквизитом.Если с этим методом возникают проблемы, в первую очередь следует проверить:
Следуя этим рекомендациям и тщательно проверяя каждый шаг, вы сможете успешно реализовать отображение изображений в веб-клиенте 1С.