При разработке печатных форм в среде 1С:Предприятие программисты часто сталкиваются с необходимостью вывода графической информации. Это может быть логотип компании в шапке счета, факсимильная подпись руководителя и печать организации в подвале документа или миниатюрные изображения (фотографии товаров) непосредственно в строках табличной части.
Существует несколько различных способов решения этой задачи. В этой статье мы подробно разберем каждый из них — от динамического создания рисунков в коде до более элегантных и современных вариантов верстки макета через параметры ячеек и предопределенные элементы.
Этот способ является наиболее очевидным и часто используется начинающими разработчиками. Суть метода заключается в том, что мы программно создаем новый графический объект в области табличного документа, позиционируем его по координатам (задавая отступы сверху и слева, а также высоту и ширину) и загружаем в него двоичные данные картинки.
Рассмотрим подробный пример реализации этого механизма:
// 1. Получаем необходимую область макета печатной формы
ОбластьСтроки = Макет.ПолучитьОбласть("СтрокаТаблицы");
// 2. Добавляем новый рисунок на область с типом "Картинка"
Рисунок = ОбластьСтроки.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
// 3. Задаем точные геометрические размеры и координаты (в миллиметрах)
Рисунок.Верх = 5; // Отступ сверху от границы области
Рисунок.Лево = 150; // Отступ слева
Рисунок.Ширина = 45; // Ширина картинки
Рисунок.Высота = 30; // Высота картинки
// 4. Безопасно получаем двоичные данные файла и создаем объект Картинка
Попытка
ДанныеФайла = ДокументОбъект.Изделие.Картинка.Файл.Получить();
Если ДанныеФайла <> Неопределено Тогда
Рисунок.Картинка = Новый Картинка(ДанныеФайла);
КонецЕсли;
Исключение
// В случае ошибки (например, файл поврежден) инициализируем пустую картинку
Рисунок.Картинка = Новый Картинка;
КонецПопытки;
// 5. Настраиваем режим масштабирования изображения в рамке
Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально;
Давайте проанализируем ключевые свойства объекта Рисунок, которые мы использовали:
Верх, Лево, Ширина, Высота — определяют физическое положение картинки в печатной форме. Измеряются в миллиметрах.РазмерКартинки — системное перечисление, управляющее поведением масштабирования изображения. Наиболее популярные варианты:
РазмерКартинки.Пропорционально — изображение сжимается или растягивается так, чтобы полностью поместиться в рамку без искажения пропорций (рекомендуемый вариант).РазмерКартинки.АвтоРазмер — размеры рамки автоматически подстраиваются под реальный размер загруженной картинки.РазмерКартинки.Растянуть — картинка заполняет всю рамку, пренебрегая исходными пропорциями сторон.Минус первого способа — необходимость жестко прописывать координаты размещения картинки прямо в программном коде. Если дизайн печатной формы изменится и ячейки сдвинутся, программисту придется заново рассчитывать координаты Верх и Лево.
Чтобы избежать этого, мы можем разместить "картинку-заглушку" в самом макете через интерактивный редактор конфигуратора:
ЛоготипОрганизации). Там же можно отключить границы рисунка, установив свойство Линия в значение Нет линии.После этого программный код вывода печатной формы значительно упростится. Нам больше не нужно высчитывать координаты, мы просто обращаемся к рисунку по его имени:
// Получаем область макета, в которой визуально размещен наш рисунок-шаблон
ОбластьШапки = Макет.ПолучитьОбласть("Шапка");
// Получаем двоичные данные изображения (например, из константы или реквизита организации)
ДвоичныеДанныеЛоготипа = ПолучитьЛоготипОрганизации();
Если ДвоичныеДанныеЛоготипа <> Неопределено Тогда
// Заменяем пустую картинку в шаблоне на реальное изображение
ОбластьШапки.Рисунки.ЛоготипОрганизации.Картинка = Новый Картинка(ДвоичныеДанныеЛоготипа);
КонецЕсли;
ТабличныйДокумент.Вывести(ОбластьШапки);
Если вам нужно вывести картинку прямо внутрь конкретной ячейки таблицы (например, фото товара в строке спецификации), платформа 1С предоставляет крайне удобное свойство ячейки — Параметр картинки.
Разберем по шагам, как настроить макет и написать под него лаконичный код:
ФотоТовара.Программный код заполнения такой области выглядит максимально просто и избавляет от необходимости работать с коллекцией Рисунки:
ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
// Получаем картинку товара (например, из присоединенных файлов БСП)
ДвоичныеДанныеФото = ПолучитьФотографиюТовара(ТекущаяСтрока.Товар);
Если ДвоичныеДанныеФото <> Неопределено Тогда
// Напрямую присваиваем объект Картинка параметру области
ОбластьСтроки.Параметры.ФотоТовара = Новый Картинка(ДвоичныеДанныеФото);
КонецЕсли;
ТабличныйДокумент.Вывести(ОбластьСтроки);
Для того чтобы ваши печатные формы работали быстро, стабильно и выглядели профессионально на любых экранах и принтерах, рекомендуем придерживаться следующих правил:
1. Защита от аварийного завершения работы программы.
Всегда проверяйте получаемые двоичные данные картинок на значение Неопределено или пустые значения. Конструктор Новый Картинка(Неопределено) вызовет критическую ошибку выполнения кода, из-за чего пользователь вообще не сможет сформировать и распечатать документ. Оборачивайте блоки получения файлов из базы данных в конструкции Попытка ... Исключение.
2. Программное отключение рамок у динамических рисунков.
При программном создании рисунков через метод Рисунки.Добавить() платформа по умолчанию рисует тонкую черную рамку вокруг изображения. Если вам нужно убрать её, используйте объект Линия:
// Отключаем отображение границы рамки рисунка
Рисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);
3. Интеграция с механизмами БСП (Библиотеки стандартных подсистем).
В современных конфигурациях файлы редко хранятся непосредственно в реквизитах справочников. Как правило, используется стандартный механизм хранения присоединенных файлов. Чтобы безопасно извлечь картинку без привязки к СУБД (так как файлы могут физически лежать в томах хранения на сервере), используйте методы БСП:
// Получаем ссылку на присоединенный файл картинки номенклатуры
СсылкаНаФайл = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущийТовар, "ФайлКартинки");
Если ЗначениеЗаполнено(СсылкаНаФайл) Тогда
// Используем штатный метод БСП для получения двоичных данных
ДанныеФайла = РаботаСФайлами.ДвоичныеДанныеФайла(СсылкаНаФайл);
Если ТипЗнч(ДанныеФайла) = Тип("ДвоичныеДанные") Тогда
КартинкаДляПечати = Новый Картинка(ДанныеФайла);
ОбластьСтроки.Параметры.ФотоТовара = КартинкаДляПечати;
КонецЕсли;
КонецЕсли;
4. Использование векторной графики (SVG).
Начиная с современных версий платформы 1С:Предприятие 8.3, полностью поддерживается обработка векторного графического формата SVG. Настоятельно рекомендуем использовать именно этот формат для вывода логотипов, факсимиле подписей и оттисков печатей. Векторная графика, в отличие от растровых форматов (PNG, JPG, BMP), идеально масштабируется без потери качества (без пикселизации) как на экранах с высоким разрешением (4K, Retina), так и при распечатке на высокопроизводительных офисных принтерах.