При разработке печатных форм в системе 1С:Предприятие программисты часто сталкиваются с ситуацией, когда функционал, идеально работающий в тонком клиенте, начинает вести себя непредсказуемо в веб-клиенте. Одной из наиболее распространенных проблем является «исчезновение» картинок: в макете вместо ожидаемого логотипа или фотографии товара отображаются пустые поля, хотя программный код выполняется без ошибок. Рассмотрим подробнее, почему это происходит и как обеспечить стабильный вывод графики во всех режимах работы.
Для начала проанализируем ситуацию. В тонком клиенте платформа имеет прямой доступ к ресурсам операционной системы и оперативной памяти клиентского компьютера. Когда мы создаем объект Картинка из двоичных данных непосредственно в коде формирования макета, платформа 1С отрисовывает этот объект средствами локального графического движка.
В веб-клиенте ситуация иная. Весь интерфейс и печатные формы преобразуются платформой в HTML-код и CSS-стили, которые затем интерпретируются браузером (Chrome, Firefox, Safari и др.). Браузер не может просто «взять» объект из памяти сервера 1С. Ему нужен конкретный URL-адрес ресурса или закодированный поток данных. Если механизм автоматической генерации ссылок на картинки в платформе дает сбой, мы получаем пустую область в табличном документе.
Выясним причину на примере типичного некорректного кода, который часто встречается в модулях менеджеров или объектов:
// Пример кода, который может давать сбои в веб-клиенте
НайденыеФайлы = Новый Массив;
РаботаСФайлами.ЗаполнитьПрисоединенныеФайлыКОбъекту(ВыборкаНоменклатура.Номенклатура, НайденыеФайлы);
Если НайденыеФайлы.Количество() > 0 Тогда
// Прямое создание картинки из двоичных данных
Картинка = Новый Картинка(РаботаСФайлами.ДвоичныеДанныеФайла(НайденыеФайлы[0]), Истина);
ОбластьСтрокаИзделие.Рисунки.ЭскизФото.Картинка = Картинка;
КонецЕсли;
В данном случае проблема заключается в том, что при передаче сформированного табличного документа с сервера на веб-клиент, бинарные данные картинки, упакованные внутри объекта Картинка, не всегда корректно сериализуются для передачи в браузер.
Как показывает практика и опыт разработчиков, самым надежным способом «протолкнуть» изображение в веб-клиент является явное использование временного хранилища. Это гарантирует, что данные будут материализованы на сервере и платформа сможет сформировать корректную внутреннюю ссылку для HTTP-запроса браузера.
Рассмотрим по шагам правильный алгоритм вывода изображения:
ДвоичныеДанные из временного хранилища по навигационной ссылке.Картинка, используя полученные двоичные данные.Рисунки.ИмяРисунка.Картинка вашего макета.Посмотрим на пример программной реализации этого метода:
// Корректный вывод картинки для веб-клиента
ДанныеКартинки = РаботаСФайлами.ДанныеФайла(НайденыеФайлы[0]);
// Важный этап: извлечение данных из хранилища
ДвоичныеДанныеКартинки = ПолучитьИзВременногоХранилища(ДанныеКартинки.СсылкаНаДвоичныеДанныеФайла);
// Создаем картинку на основе «чистых» двоичных данных
ОбластьСтрокаИзделие.Рисунки.ЭскизФото.Картинка = Новый Картинка(ДвоичныеДанныеКартинки);
Почему это работает? Используя ПолучитьИзВременногоХранилища, мы заставляем серверную часть платформы подготовить конкретный блок данных, который будет связан с жизненным циклом формирования печатной формы. Это исключает ошибки типизации при передаче объекта Картинка.
Помимо способа передачи данных, существует еще несколько критически важных факторов, которые могут влиять на отображение картинок в браузере. Разберем их, чтобы ваша печатная форма работала безупречно.
1. Форматы графических файлов
Тонкий клиент 1С работает под управлением ОС Windows и поддерживает практически любые форматы, включая TIFF или BMP с глубоким сжатием. Веб-клиент ограничен возможностями браузера. Для максимальной совместимости мы рекомендуем использовать форматы PNG (если важна прозрачность) или JPEG (для фотографий). Если в вашей базе хранятся файлы других форматов, попробуйте программно сконвертировать их перед выводом в макет.
2. Использование навигационных ссылок напрямую
В некоторых случаях (особенно в последних версиях платформы 8.3) можно попробовать присвоить свойству Картинка не объект типа Картинка, а навигационную ссылку на файл. Рассмотрим этот вариант:
// Альтернативный вариант через навигационную ссылку
СсылкаНаФайл = ПолучитьНавигационнуюСсылку(НайденыеФайлы[0], "ДанныеФайла");
ОбластьСтрокаИзделие.Рисунки.ЭскизФото.Картинка = Новый Картинка(СсылкаНаФайл);
Этот способ часто работает быстрее, так как платформа оптимизирует кэширование изображений на стороне веб-сервера.
3. Размер изображений
Помните, что веб-клиент передает данные по протоколу HTTP. Если в печатную форму выводится 50 фотографий товаров, каждая из которых весит по 5 Мб, формирование отчета в браузере может занять чрезвычайно много времени или вызвать ошибку тайм-аута. Проанализируем необходимость предварительного сжатия: для печатной формы в 99% случаев достаточно разрешения 800x600 пикселей.
Подводя итог, можно сказать, что стабильность работы печатных форм в веб-клиенте 1С зависит от того, насколько явно мы управляем данными. Использование метода ПолучитьИзВременногоХранилища для получения ДвоичныхДанных — это «золотой стандарт», позволяющий избежать пустых полей в браузере. Мы рекомендуем всегда проверять свои разработки в веб-клиенте, даже если основным рабочим местом пользователей является тонкий клиент, так как это гарантирует чистоту кода и отсутствие скрытых проблем с контекстом исполнения.