Как программно добавить изображения и PDF-файлы в печатную форму 1С?

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

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

В этой статье мы подробно разберем, как правильно реализовать программное добавление картинок, почему возникают ошибки при работе с PDF и как их избежать.

Основные причины «пустых» картинок в табличном документе

Рассмотрим стандартную ситуацию: программист создает объект РисунокТабличногоДокумента, присваивает ему Картинка, но при выводе ТабличныйДокумент остается пустым. Выясним причину этого поведения. Ошибка кроется в том, что системе недостаточно просто создать объект рисунка; его необходимо жестко привязать к конкретной области ячеек в документе.

Проанализируем пример кода, который исправляет эту ошибку с помощью метода Расположить():


// Получаем область макета, где будут располагаться картинки
ОбластьСертификаты = Макет.ПолучитьОбласть("Сертификаты");

// Добавляем рисунок в коллекцию рисунков области макета
Рис = ОбластьСертификаты.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);

// Устанавливаем параметры отображения
Рис.РазмерКартинки = РазмерКартинки.Пропорционально; // Важно для сохранения геометрии

// Получаем двоичные данные из хранилища и создаем объект Картинка
ДвоичныеДанные = Выборка.ФайлХранилище.Получить();
Если ДвоичныеДанные <> Неопределено Тогда
    КартинкаОбъект = Новый Картинка(ДвоичныеДанные);
    Рис.Картинка = КартинкаОбъект;
    
    // Ключевой момент: указываем, в каких именно ячейках области расположить рисунок
    // Например, от первой строки до четвертой, от первой колонки до четвертой
    Рис.Расположить(ОбластьСертификаты.Область("R1C1:R4C4"));
КонецЕсли;

ТабДок.Вывести(ОбластьСертификаты);

Важно: Если вы добавляете рисунки динамически в цикле, следите за тем, чтобы имена рисунков не дублировались, либо используйте метод Индекс(), как было предложено в обсуждении, для точного обращения к только что добавленному объекту.

Получение данных в конфигурациях на базе БСП

Посмотрим на ситуацию шире. В конфигурациях КА 2, ERP 2.5 и БП 3.0 файлы могут храниться не только в информационной базе (в реквизите ФайлХранилище), но и во внешних томах на диске. Прямое обращение к реквизиту через запрос в этом случае вернет пустую ссылку.

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

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

Проблема PDF: почему вместо документа выводится «крест»?

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

Чтобы вывести PDF в печатную форму, его необходимо предварительно конвертировать в растровый формат (PNG или JPG). Рассмотрим основные способы решения этой задачи:

  1. Использование внешних утилит: Один из самых надежных способов — использование консольных программ, таких как mutool (часть проекта MuPDF). С помощью команды ЗапуститьПриложение сервер 1С может вызвать конвертер, передав ему PDF, и получить на выходе временный файл изображения.
  2. Внешние компоненты: Существуют специализированные компоненты (библиотеки .dll), которые позволяют рендерить страницы PDF напрямую в память 1С.
  3. Windows API: На серверах под управлением Windows 10/11 и Windows Server 2016+ доступна встроенная библиотека Windows.Data.Pdf, к которой можно обратиться через COM-объекты или специализированные обертки для преобразования страниц PDF в Bitmap.

Оптимизация вывода и управление размерами

При программном формировании документов с большим количеством изображений важно следить за производительностью и «весом» итогового файла. Разберем несколько практических советов:

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

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

Кэширование: Если одна и та же картинка (например, логотип производителя) встречается в печатной форме многократно, не нужно создавать объект Картинка на каждой итерации цикла. Проанализируйте возможность создания Соответствия, где ключом будет ссылка на файл, а значением — уже созданный объект Картинка.


// Пример кэширования картинок в памяти
КэшКартинок = Новый Соответствие;

Пока Выборка.Следующий() Цикл
    СсылкаНаФайл = Выборка.ПрисоединенныйФайл;
    КартинкаОбъект = КэшКартинок.Получить(СсылкаНаФайл);
    
    Если КартинкаОбъект = Неопределено Тогда
        Данные = РаботаСФайлами.ДвоичныеДанныеФайла(СсылкаНаФайл);
        КартинкаОбъект = Новый Картинка(Данные);
        КэшКартинок.Вставить(СсылкаНаФайл, КартинкаОбъект);
    КонецЕсли;
    
    // Далее выводим КартинкаОбъект в табличный документ...
КонецЦикла;

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

← На главную