При разработке печатных форм в современных конфигурациях, таких как 1С:Комплексная автоматизация 2 или ERP, часто возникает задача вывода дополнительных материалов: логотипов товаров, фотографий или сертификатов соответствия. Эти файлы обычно хранятся в справочниках типа НоменклатураПрисоединенныеФайлы. Однако простое получение двоичных данных и их передача в рисунок табличного документа часто приводит к тому, что на печати отображается либо пустая область, либо некорректный символ (крест) вместо содержимого файла.
В этой статье мы подробно разберем, как правильно реализовать программное добавление картинок, почему возникают ошибки при работе с PDF и как их избежать.
Рассмотрим стандартную ситуацию: программист создает объект РисунокТабличногоДокумента, присваивает ему Картинка, но при выводе ТабличныйДокумент остается пустым. Выясним причину этого поведения. Ошибка кроется в том, что системе недостаточно просто создать объект рисунка; его необходимо жестко привязать к конкретной области ячеек в документе.
Проанализируем пример кода, который исправляет эту ошибку с помощью метода Расположить():
// Получаем область макета, где будут располагаться картинки
ОбластьСертификаты = Макет.ПолучитьОбласть("Сертификаты");
// Добавляем рисунок в коллекцию рисунков области макета
Рис = ОбластьСертификаты.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
// Устанавливаем параметры отображения
Рис.РазмерКартинки = РазмерКартинки.Пропорционально; // Важно для сохранения геометрии
// Получаем двоичные данные из хранилища и создаем объект Картинка
ДвоичныеДанные = Выборка.ФайлХранилище.Получить();
Если ДвоичныеДанные <> Неопределено Тогда
КартинкаОбъект = Новый Картинка(ДвоичныеДанные);
Рис.Картинка = КартинкаОбъект;
// Ключевой момент: указываем, в каких именно ячейках области расположить рисунок
// Например, от первой строки до четвертой, от первой колонки до четвертой
Рис.Расположить(ОбластьСертификаты.Область("R1C1:R4C4"));
КонецЕсли;
ТабДок.Вывести(ОбластьСертификаты);
Важно: Если вы добавляете рисунки динамически в цикле, следите за тем, чтобы имена рисунков не дублировались, либо используйте метод Индекс(), как было предложено в обсуждении, для точного обращения к только что добавленному объекту.
Посмотрим на ситуацию шире. В конфигурациях КА 2, ERP 2.5 и БП 3.0 файлы могут храниться не только в информационной базе (в реквизите ФайлХранилище), но и во внешних томах на диске. Прямое обращение к реквизиту через запрос в этом случае вернет пустую ссылку.
Правильным подходом будет использование функций Библиотеки стандартных подсистем (БСП). Разберем по шагам, как получить данные файла безопасно:
РаботаСФайлами.ДвоичныеДанныеФайла(СсылкаНаФайл). Он автоматически определит место хранения и вернет готовый объект ДвоичныеДанные.Новый Картинка(Данные).Ситуация значительно усложняется, если часть прикрепленных файлов (например, сертификаты) загружена в формате PDF. Платформа 1С:Предприятие воспринимает PDF не как растровое изображение, а как бинарный документ-контейнер. Попытка напрямую поместить такой файл в ТипРисункаТабличногоДокумента.Картинка приведет к появлению перечеркнутого квадрата.
Чтобы вывести PDF в печатную форму, его необходимо предварительно конвертировать в растровый формат (PNG или JPG). Рассмотрим основные способы решения этой задачи:
mutool (часть проекта MuPDF). С помощью команды ЗапуститьПриложение сервер 1С может вызвать конвертер, передав ему PDF, и получить на выходе временный файл изображения..dll), которые позволяют рендерить страницы PDF напрямую в память 1С.Windows.Data.Pdf, к которой можно обратиться через COM-объекты или специализированные обертки для преобразования страниц PDF в Bitmap.При программном формировании документов с большим количеством изображений важно следить за производительностью и «весом» итогового файла. Разберем несколько практических советов:
Управление привязками: Чтобы картинки не сдвигались при изменении высоты строк или ширины колонок, используйте метод УстановитьПривязку(). Это позволит зафиксировать углы изображения относительно ячеек таблицы, что особенно важно для бланков строгой отчетности.
Масштабирование: Использование свойства РазмерКартинки.РеальныйРазмер может привести к тому, что изображение выйдет за границы листа, если исходный файл имеет высокое разрешение. Рекомендуем использовать РазмерКартинки.Пропорционально — это обеспечит вписывание картинки в заданную область Расположить() без искажения пропорций (растягивания).
Кэширование: Если одна и та же картинка (например, логотип производителя) встречается в печатной форме многократно, не нужно создавать объект Картинка на каждой итерации цикла. Проанализируйте возможность создания Соответствия, где ключом будет ссылка на файл, а значением — уже созданный объект Картинка.
// Пример кэширования картинок в памяти
КэшКартинок = Новый Соответствие;
Пока Выборка.Следующий() Цикл
СсылкаНаФайл = Выборка.ПрисоединенныйФайл;
КартинкаОбъект = КэшКартинок.Получить(СсылкаНаФайл);
Если КартинкаОбъект = Неопределено Тогда
Данные = РаботаСФайлами.ДвоичныеДанныеФайла(СсылкаНаФайл);
КартинкаОбъект = Новый Картинка(Данные);
КэшКартинок.Вставить(СсылкаНаФайл, КартинкаОбъект);
КонецЕсли;
// Далее выводим КартинкаОбъект в табличный документ...
КонецЦикла;
Подводя итог, отметим, что для успешного вывода изображений в 1С:Комплексная автоматизация необходимо сочетать методы корректного позиционирования объектов в ТабличныйДокумент и механизмы работы с файлами через БСП. В случае с PDF-документами единственным стабильным решением остается их предварительная конвертация в растр на стороне сервера. Для доработки готовых табличных документов без вмешательства в типовой код подойдёт инструмент для постобработки печатных форм на базе БСП.