Как вывести картинку в печатную форму 1С при хранении файлов в базе или в томах на диске?

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

При разработке печатных форм в современных конфигурациях 1С, таких как Управление торговлей 11, ERP или Комплексная автоматизация, программисты часто сталкиваются с задачей вывода изображений номенклатуры или других присоединенных файлов. Сложность заключается в том, что система может хранить файлы двумя способами: непосредственно в информационной базе или в томах на диске. Рассмотрим, как написать универсальный код, который будет корректно работать в обоих случаях.

Проблема ручного определения пути к файлу

Начинающие разработчики часто пытаются самостоятельно анализировать тип хранения файла через перечисление ТипыХраненияФайлов. Проанализируем ситуацию: если файл хранится в информационной базе, мы можем получить его двоичные данные из реквизита. Если же файл хранится в томах на диске, нам нужно знать полный сетевой путь. Попытка прописать логику вручную, как в примере ниже, часто ведет к ошибкам доступа или некорректной работе в веб-клиенте:


Если Выборка.ФайлКартинки.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда 
    // Попытка получить картинку напрямую по пути может не сработать из-за прав доступа
    ОбластьСтрока.Параметры.ПараметрКартинка = Новый Картинка(Выборка.ФайлКартинки.ПутьКФайлу); 
КонецЕсли;

Такой подход считается плохой практикой, так как он не учитывает права доступа RLS, особенности работы сервера приложений и необходимость очистки временных ресурсов.

Универсальное решение через механизмы БСП

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

Для конфигураций на базе БСП (версии 2.x и 3.x) основным инструментом является модуль ПрисоединенныеФайлы. Самый надежный способ получить данные для вывода — использовать метод ПолучитьДанныеФайла.

Рассмотрим пример правильного кода для модуля печати:


// Получаем структуру с данными файла через стандартную функцию БСП
ДанныеФайла = ПрисоединенныеФайлы.ПолучитьДанныеФайла(Выборка.ФайлКартинки);

// Проверяем, удалось ли получить ссылку на двоичные данные
Если ЗначениеЗаполнено(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла) Тогда
    // Создаем объект Картинка, извлекая данные из временного хранилища
    КартинкаОбъект = Новый Картинка(ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла));
    
    // Устанавливаем параметр в области макета
    ОбластьСтрока.Параметры.ПараметрКартинка = КартинкаОбъект;
КонецЕсли;

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

Настройка макета табличного документа

Чтобы картинка отобразилась корректно, мало просто передать объект Картинка в параметр. Проанализируем настройки самого макета:

  1. Откройте макет печатной формы в конфигураторе.
  2. Вставьте объект Рисунок (Меню: Таблица -> Рисунки -> Картинка).
  3. В свойствах рисунка на закладке Основные установите поле Параметр (например, ПараметрКартинка).
  4. В свойстве Размер обязательно выберите значение Пропорционально. Это позволит картинке масштабироваться под размер ячейки, не искажая пропорции (фото не будет выглядеть "сплюснутым").
  5. Убедитесь, что тип заполнения для этого объекта установлен в значение Параметр.

Оптимизация при массовой печати

Если нам необходимо вывести, например, прайс-лист с сотнями фотографий, вызов функции ПолучитьДанныеФайла в цикле может существенно замедлить формирование отчета. Посмотрим на ситуацию глубже: каждое обращение к файлу на диске — это ресурсозатратная операция.

В современных редакциях БСП (3.0 и выше) рекомендуется использовать кэширование или методы пакетного получения данных, если они доступны в вашей версии библиотеки. Также полезно добавить проверку на наличие файла, чтобы избежать пустых рамок в документе:


Если НЕ ЗначениеЗаполнено(Выборка.ФайлКартинки) Тогда
    // Можно вывести картинку-заглушку "Нет фото"
    // ОбластьСтрока.Параметры.ПараметрКартинка = БиблиотекаКартинок.ПустаяКартинка;
    Продолжить;
КонецЕсли;

Обработка ошибок доступа

Иногда даже при правильном коде картинка не выводится. Выясним возможные причины:

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

← На главную