Почему не отображаются картинки в форматированном документе в веб-клиенте 1С и как это исправить

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

При разработке на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда ФорматированныйДокумент прекрасно отображает вложенные изображения в тонком и толстом клиентах, но при открытии той же формы через браузер (веб-клиент) вместо картинок отображаются пустые квадраты или «битые» ссылки. Рассмотрим эту проблему подробно, выясним причины такого поведения системы и разберем по шагам рабочие методы исправления ситуации.

Выясним причину проблемы: почему веб-клиент «не видит» файлы

Проанализируем ситуацию с точки зрения безопасности современных браузеров. Основная причина кроется в так называемой «песочнице» (sandbox). Когда вы запускаете 1С через веб-клиент, код выполняется в контексте браузера, который имеет жесткие ограничения на доступ к локальной файловой системе и прямым сетевым путям (UNC-путям вида \\server\share). Если в тонком клиенте метод Новый Картинка(ПутьКФайлу) может успешно прочитать данные с диска, то в веб-клиенте браузер блокирует подобные попытки из соображений безопасности.

Кроме того, механизм работы объекта ФорматированныйДокумент в веб-клиенте существенно отличается. Для отображения HTML-контента платформа должна преобразовать внутренние ссылки на вложения во временные URL-адреса, которые веб-сервер (IIS или Apache) сможет отдать браузеру. Если этот механизм нарушен на любом этапе — от прав доступа до настроек MIME-типов — картинка не будет отображена.

Метод 1. Инициализация документа на стороне сервера

Рассмотрим правильный подход к заполнению документа. Проблема часто возникает, когда мы пытаемся манипулировать вложениями на стороне клиента. Разберем, как правильно инициализировать данные, используя серверные процедуры формы. Для этого задействуем обработчик ПриЧтенииНаСервере или создадим собственную серверную процедуру.

Проанализируем пример кода, который гарантирует корректную передачу данных:


&НаСервере
Процедура ИнициализироватьДокументНаСервере()
    
    // Получаем данные из хранилища или файла
    ДвоичныеДанныеКартинки = Новый ДвоичныеДанные(ПутьКФайлуНаСервере);
    ТекущаяКартинка = Новый Картинка(ДвоичныеДанныеКартинки);
    
    // Работаем с объектом ФорматированныйДокумент
    // ОбъектРеквизит - это наш реквизит формы с типом ФорматированныйДокумент
    Поток = Новый ПотокВПамяти();
    ОбъектРеквизит.Записать(Поток);
    
    // Вставляем картинку во вложения
    ИмяВложения = "image_" + СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
    ОбъектРеквизит.Вложения.Вставить(ИмяВложения, ТекущаяКартинка);
    
    // Обновляем текст документа, чтобы он ссылался на новое вложение
    // В HTML это будет выглядеть как <img src="ИмяВложения">
КонецПроцедуры

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

Метод 2. Настройка прав доступа и веб-сервера

Если код написан верно, но картинки все равно не отображаются, проанализируем настройки окружения. В веб-клиенте запрос за картинкой идет от имени пользователя, под которым запущен процесс веб-сервера (например, IUSR в IIS или www-data в Apache).

Посмотрим, на что нужно обратить внимание в настройках:

  1. Права на временные папки: Учетная запись веб-сервера должна иметь полные права на чтение и запись в папку временных файлов 1С на сервере. Именно туда платформа складывает кэшированные изображения для веб-клиента.
  2. Сетевые шары: Если ваши картинки лежат в сетевом каталоге, убедитесь, что компьютер, на котором развернут веб-сервер, имеет доступ к этому ресурсу под своей системной учетной записью.
  3. MIME-типы: В настройках IIS или Apache должны быть разрешены типы image/jpeg, image/png и image/gif.
  4. Протокол HTTPS: Если ваша база опубликована по SSL (HTTPS), а ресурсы (картинки) запрашиваются по HTTP, браузер заблокирует их из-за политики Mixed Content. Всегда используйте единый протокол доступа.

Метод 3. Использование навигационных ссылок и временного хранилища

Разберем наиболее надежный способ работы с вложениями, который обходит ограничения прямого обращения к файлам. Мы поместим картинку во временное хранилище 1С и передадим её в документ через навигационную ссылку.

Рассмотрим последовательность действий:


&НаСервере
Процедура ЗагрузитьКартинкуВДокумент(ПутьКФайлу)
    
    // 1. Помещаем файл во временное хранилище
    ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
    АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор);
    
    // 2. Создаем объект Картинка на основании адреса
    НоваяКартинка = Новый Картинка(АдресХранилища);
    
    // 3. Добавляем во вложения форматированного документа
    ИмяФайла = "picture_1";
    ОбъектРеквизит.Вложения.Вставить(ИмяФайла, НоваяКартинка);
    
    // 4. Формируем HTML-текст с использованием внутреннего идентификатора вложения
    ТекстHTML = "<html><body><img src=""" + ИмяФайла + """></body></html>";
    ОбъектРеквизит.УстановитьHTML(ТекстHTML, ОбъектРеквизит.Вложения);
    
КонецПроцедуры

Этот метод считается универсальным, так как платформа сама заботится о том, как «пробросить» данные из временного хранилища в HTTP-поток для веб-клиента.

Метод 4. Использование HTTP-сервисов (продвинутый уровень)

В некоторых сложных конфигурациях или при использовании специфических браузеров (например, Safari на iOS), стандартные механизмы вложений могут работать нестабильно. В таком случае проанализируем вариант с использованием собственного HTTP-сервиса для отдачи изображений.

Суть метода заключается в том, что в тексте ФорматированныйДокумент мы прописываем не относительное имя вложения, а прямой URL к нашему HTTP-сервису, развернутому в этой же базе 1С.

Разберем пример реализации:

1. Создадим HTTP-сервис с шаблоном /getImage/{ID}.

2. В методе GET напишем следующий код:


Функция getImageGet(Запрос)
    ID = Запрос.ПараметрыURL.Получить("ID");
    // Здесь логика получения двоичных данных картинки по ID из базы или файла
    ДвоичныеДанные = ПолучитьКартинкуИзХранилища(ID); 
    
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанные);
    Ответ.Заголовки.Вставить("Content-Type", "image/jpeg");
    Возврат Ответ;
КонецФункции

3. В форматированном документе установим текст:


ТекстHTML = "<img src=""https://myserver.com/base/hs/getImage/12345"">";
ОбъектРеквизит.УстановитьHTML(ТекстHTML, Новый Структура);

Этот способ полностью снимает проблему «битых» ссылок в веб-клиенте, так как браузер воспринимает такую картинку как обычный внешний ресурс, загружаемый по стандартному протоколу HTTP/HTTPS.

Резюме и рекомендации

Проанализировав все способы, можно сделать вывод: для стабильной работы картинок в веб-клиенте необходимо придерживаться следующих правил:

Используя эти методики, мы обеспечим идентичное отображение форматированных документов во всех типах клиентских приложений 1С.

← На главную