Как отобразить JPG файлы, хранящиеся на сервере, в веб-клиенте 1С?

Программист 1С v8.3 (Управляемые формы)
← На главную

Коллеги, сегодня мы разберем важную и часто встречающуюся задачу: как отобразить файлы JPG, хранящиеся вне базы данных (например, когда была выполнена выгрузка картинок номенклатуры в каталог), в веб-клиенте 1С. Эта ситуация часто возникает, когда пользователям необходимо показать изображения, пути к которым известны.

Мы проанализируем основные подходы, включая такую задачу как выгрузка прикрепленных файлов, и рассмотрим примеры кода для веб-клиента.

Особенности работы с файлами в веб-клиенте 1С

Прежде чем перейти к решению, нам важно понять, почему прямая работа с файлами на сервере и отображение их в веб-клиенте имеет свои нюансы. Веб-клиент, по своей сути, является браузерным приложением, и на него распространяются стандартные ограничения безопасности веб-браузеров. Это означает, что веб-клиент:

  1. Не имеет прямого доступа к файловой системе сервера. Браузер не может просто так "забрать" файл с указанного на сервере пути и отобразить его. Это было бы серьезным нарушением безопасности.
  2. Не имеет прямого доступа к локальной файловой системе пользователя. Аналогично, из веб-клиента нельзя напрямую читать или записывать файлы на клиентский компьютер без явного взаимодействия с пользователем или использования специальных расширений.

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

Пошаговое решение: Отображение JPG через временное хранилище

Рассмотрим стандартный и наиболее эффективный способ отображения JPG-файлов из файловой системы сервера в веб-клиенте 1С. Этот подход включает в себя несколько этапов:

  1. Получение пути к файлу на сервере.
  2. Чтение файла в двоичные данные на сервере.
  3. Помещение двоичных данных во временное хранилище.
  4. Передача адреса временного хранилища на клиент.
  5. Отображение изображения на форме с помощью элемента "Поле картинки".

Шаг 1: Получение пути и чтение файла на сервере

Все операции, связанные с доступом к файловой системе сервера, должны выполняться на сервере. Для этого мы создаем серверную процедуру. Предположим, у нас есть путь к папке (это могут быть и скриншоты, созданные в 1С), и мы хотим отобразить фотографию, имя которой формируется из идентификатора с расширением .jpg.


&НаСервере
Процедура ПоказатьКартинкуНаСервере()
    // 1. Получаем базовый путь к папке с изображениями.
    // Предполагается, что Константы.ПутьФото хранит путь вида "C:\Photos\" или "/var/www/photos/"
    Перем ПутьКПапке;
    ПутьКПапке = Константы.ПутьФото.Получить();

    // 2. Формируем полное имя файла изображения.
    // Объект.Код - это, например, код элемента справочника, к которому привязана картинка.
    Перем ИмяФайла;
    ИмяФайла = ПутьКПапке + Объект.Код + ".jpg";

    // 3. Читаем файл в двоичные данные.
    // Если файл не найден или недоступен, может возникнуть ошибка.
    Перем ДвоичныеДанныеФайла;
    Попытка
        ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИмяФайла);
    Исключение
        // Обработка ошибки, если файл не существует или недоступен.
        // Можно установить пустую картинку или вывести сообщение пользователю.
        ДвоичныеДанныеФайла = Неопределено;
        Возврат;
    КонецПопытки;

    // 4. Помещаем двоичные данные во временное хранилище.
    // УникальныйИдентификатор используется, чтобы данные хранились уникально и не пересекались.
    // Адрес - это строка, которую мы передадим на клиент для отображения.
    Перем АдресВХранилище;
    АдресВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайла, УникальныйИдентификатор);

    // 5. Передаем адрес временного хранилища в реквизит формы,
    // который будет использоваться для отображения на клиенте.
    // Предполагается, что на форме есть реквизит с именем СсылкаНаКартинку.
    СсылкаНаКартинку = АдресВХранилище;
КонецПроцедуры

В этом примере мы используем объект ДвоичныеДанные, который позволяет работать с содержимым файла. Также может быть полезно сжатие строк внутренними методами 1С. Метод ПоместитьВоВременноеХранилище() возвращает строковый адрес на данные.

Шаг 2: Настройка формы для отображения изображения

Для того чтобы изображение отобразилось в веб-клиенте, нам потребуется выполнить несколько настроек на форме:

  1. Создать реквизит формы: На форме должен быть реквизит, который будет хранить адрес изображения из временного хранилища. Мы назовем его СсылкаНаКартинку и зададим ему тип Строка.
  2. Добавить элемент "Поле картинки": На саму форму нужно добавить элемент управления типа "Поле картинки". В свойствах этого элемента укажите, что он связан с созданным реквизитом СсылкаНаКартинку.

Когда в реквизит СсылкаНаКартинку будет установлен адрес из временного хранилища, элемент "Поле картинки" автоматически загрузит и отобразит изображение, доступное по этому адресу.

Жизненный цикл временного хранилища

Важно понимать, как работает временное хранилище:

Расширенные возможности: Расширение работы с файлами

Хотя описанный выше метод является стандартным для отображения одиночных изображений, для более сложной работы с файлами (например, множественный экспорт/импорт, программный доступ к файловой системе клиента) в веб-клиенте может потребоваться установка "расширения работы с файлами".

Анализ возможных проблем и их устранение

Давайте проанализируем, почему могут возникать проблемы при отображении JPG в веб-клиенте, основываясь на опыте коллег и дополнительной информации:

1. Проблемы с исходными файлами JPG

Как показал опыт коллеги в сообщении 21, иногда проблема заключается не в коде 1С, а в самих файлах изображений. Если JPG-файлы генерируются скриптами из других форматов (например, PDF, PS), убедитесь, что:

Что делать: Проверьте файл на сервере обычным графическим просмотрщиком. Убедитесь, что он открывается и отображается корректно. Возможно, потребуется перенастроить скрипты генерации.

2. Проблемы с путями и правами доступа

Что делать: Используйте отладчик, чтобы проверить значение переменной ИмяФайла непосредственно перед вызовом Новый ДвоичныеДанные(ИмяФайла). Попробуйте скопировать этот путь и вставить его в проводник (для Windows) или терминал (для Linux) на сервере, чтобы убедиться в доступности файла.

3. Проблемы с обновлением формы или кэшированием

Иногда изображение не отображается сразу после загрузки в веб-клиенте, но появляется после перезапуска программы или повторного открытия формы. Это может указывать на проблемы с:

Что делать: Проверьте, что в реквизит СсылкаНаКартинку действительно записывается новый адрес временного хранилища. Если проблема проявляется только после нескольких обновлений, попробуйте очистить кэш браузера или использовать режим инкогнито для тестирования.

4. Эффективность хранения и загрузки

Если речь идет о большом количестве изображений или очень крупных файлах, рассмотрим следующие моменты:

Что делать: Оптимизируйте размер изображений. Если изображения большие, рассмотрите возможность создания превью (миниатюр) и отображения их по умолчанию, а полную версию показывать по запросу.

5. Неподдерживаемые форматы изображений

Современные форматы изображений, такие как WebP, не всегда поддерживаются стандартными конфигурациями 1С или старыми версиями браузеров, используемых в веб-клиенте. Убедитесь, что используете широко поддерживаемые форматы, такие как JPG, PNG, GIF.

Что делать: Придерживайтесь JPG для фотографий (сжатие с потерями) и PNG для графики с прозрачностью или четкими линиями (сжатие без потерь).

Резюме и заключение

Итак, мы выяснили, что стандартный подход к отображению JPG-файлов из файловой системы сервера в веб-клиенте 1С заключается в следующем:

  1. На сервере читаем файл в ДвоичныеДанные.
  2. Помещаем эти данные во ВременноеХранилище, получая адрес.
  3. Передаем этот адрес строковому реквизиту формы.
  4. На форме используем элемент ПолеКартинки, связанный с этим строковым реквизитом.

Если с этим методом возникают проблемы, в первую очередь следует проверить:

Следуя этим рекомендациям и тщательно проверяя каждый шаг, вы сможете успешно реализовать отображение изображений в веб-клиенте 1С.

← На главную