Как исправить проблему отображения картинок в печатных формах при работе в веб-клиенте 1С

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

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

Анализируем проблему: почему тонкий клиент и веб-клиент работают по-разному

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

В веб-клиенте ситуация иная. Весь интерфейс и печатные формы преобразуются платформой в HTML-код и CSS-стили, которые затем интерпретируются браузером (Chrome, Firefox, Safari и др.). Браузер не может просто «взять» объект из памяти сервера 1С. Ему нужен конкретный URL-адрес ресурса или закодированный поток данных. Если механизм автоматической генерации ссылок на картинки в платформе дает сбой, мы получаем пустую область в табличном документе.

Выясним причину на примере типичного некорректного кода, который часто встречается в модулях менеджеров или объектов:


// Пример кода, который может давать сбои в веб-клиенте
НайденыеФайлы = Новый Массив;
РаботаСФайлами.ЗаполнитьПрисоединенныеФайлыКОбъекту(ВыборкаНоменклатура.Номенклатура, НайденыеФайлы);

Если НайденыеФайлы.Количество() > 0 Тогда
    // Прямое создание картинки из двоичных данных
    Картинка = Новый Картинка(РаботаСФайлами.ДвоичныеДанныеФайла(НайденыеФайлы[0]), Истина); 
    ОбластьСтрокаИзделие.Рисунки.ЭскизФото.Картинка = Картинка;
КонецЕсли;

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

Разберем решение: использование временного хранилища

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

Рассмотрим по шагам правильный алгоритм вывода изображения:

  1. Получаем данные файла (структуру, содержащую ссылку на двоичные данные).
  2. Явно извлекаем ДвоичныеДанные из временного хранилища по навигационной ссылке.
  3. Создаем объект Картинка, используя полученные двоичные данные.
  4. Присваиваем объект свойству Рисунки.ИмяРисунка.Картинка вашего макета.

Посмотрим на пример программной реализации этого метода:


// Корректный вывод картинки для веб-клиента
ДанныеКартинки = РаботаСФайлами.ДанныеФайла(НайденыеФайлы[0]);

// Важный этап: извлечение данных из хранилища
ДвоичныеДанныеКартинки = ПолучитьИзВременногоХранилища(ДанныеКартинки.СсылкаНаДвоичныеДанныеФайла);

// Создаем картинку на основе «чистых» двоичных данных
ОбластьСтрокаИзделие.Рисунки.ЭскизФото.Картинка = Новый Картинка(ДвоичныеДанныеКартинки);

Почему это работает? Используя ПолучитьИзВременногоХранилища, мы заставляем серверную часть платформы подготовить конкретный блок данных, который будет связан с жизненным циклом формирования печатной формы. Это исключает ошибки типизации при передаче объекта Картинка.

Дополнительные рекомендации для веб-клиента

Помимо способа передачи данных, существует еще несколько критически важных факторов, которые могут влиять на отображение картинок в браузере. Разберем их, чтобы ваша печатная форма работала безупречно.

1. Форматы графических файлов

Тонкий клиент 1С работает под управлением ОС Windows и поддерживает практически любые форматы, включая TIFF или BMP с глубоким сжатием. Веб-клиент ограничен возможностями браузера. Для максимальной совместимости мы рекомендуем использовать форматы PNG (если важна прозрачность) или JPEG (для фотографий). Если в вашей базе хранятся файлы других форматов, попробуйте программно сконвертировать их перед выводом в макет.

2. Использование навигационных ссылок напрямую

В некоторых случаях (особенно в последних версиях платформы 8.3) можно попробовать присвоить свойству Картинка не объект типа Картинка, а навигационную ссылку на файл. Рассмотрим этот вариант:


// Альтернативный вариант через навигационную ссылку
СсылкаНаФайл = ПолучитьНавигационнуюСсылку(НайденыеФайлы[0], "ДанныеФайла");
ОбластьСтрокаИзделие.Рисунки.ЭскизФото.Картинка = Новый Картинка(СсылкаНаФайл);

Этот способ часто работает быстрее, так как платформа оптимизирует кэширование изображений на стороне веб-сервера.

3. Размер изображений

Помните, что веб-клиент передает данные по протоколу HTTP. Если в печатную форму выводится 50 фотографий товаров, каждая из которых весит по 5 Мб, формирование отчета в браузере может занять чрезвычайно много времени или вызвать ошибку тайм-аута. Проанализируем необходимость предварительного сжатия: для печатной формы в 99% случаев достаточно разрешения 800x600 пикселей.

Резюме

Подводя итог, можно сказать, что стабильность работы печатных форм в веб-клиенте 1С зависит от того, насколько явно мы управляем данными. Использование метода ПолучитьИзВременногоХранилища для получения ДвоичныхДанных — это «золотой стандарт», позволяющий избежать пустых полей в браузере. Мы рекомендуем всегда проверять свои разработки в веб-клиенте, даже если основным рабочим местом пользователей является тонкий клиент, так как это гарантирует чистоту кода и отсутствие скрытых проблем с контекстом исполнения.

← На главную