Как вывести изображение в макет печатной формы в 1С:Предприятие?

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

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

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

Способ №1. Динамическое добавление рисунка через код (с указанием координат)

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

Рассмотрим подробный пример реализации этого механизма:


// 1. Получаем необходимую область макета печатной формы
ОбластьСтроки = Макет.ПолучитьОбласть("СтрокаТаблицы");

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

// 3. Задаем точные геометрические размеры и координаты (в миллиметрах)
Рисунок.Верх   = 5;   // Отступ сверху от границы области
Рисунок.Лево   = 150; // Отступ слева
Рисунок.Ширина = 45;  // Ширина картинки
Рисунок.Высота = 30;  // Высота картинки

// 4. Безопасно получаем двоичные данные файла и создаем объект Картинка
Попытка
    ДанныеФайла = ДокументОбъект.Изделие.Картинка.Файл.Получить();
    Если ДанныеФайла <> Неопределено Тогда
        Рисунок.Картинка = Новый Картинка(ДанныеФайла);
    КонецЕсли;
Исключение
    // В случае ошибки (например, файл поврежден) инициализируем пустую картинку
    Рисунок.Картинка = Новый Картинка;
КонецПопытки;

// 5. Настраиваем режим масштабирования изображения в рамке
Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально;

Давайте проанализируем ключевые свойства объекта Рисунок, которые мы использовали:

  1. Верх, Лево, Ширина, Высота — определяют физическое положение картинки в печатной форме. Измеряются в миллиметрах.
  2. РазмерКартинки — системное перечисление, управляющее поведением масштабирования изображения. Наиболее популярные варианты:
    • РазмерКартинки.Пропорционально — изображение сжимается или растягивается так, чтобы полностью поместиться в рамку без искажения пропорций (рекомендуемый вариант).
    • РазмерКартинки.АвтоРазмер — размеры рамки автоматически подстраиваются под реальный размер загруженной картинки.
    • РазмерКартинки.Растянуть — картинка заполняет всю рамку, пренебрегая исходными пропорциями сторон.

Способ №2. Использование предопределенного рисунка в макете

Минус первого способа — необходимость жестко прописывать координаты размещения картинки прямо в программном коде. Если дизайн печатной формы изменится и ячейки сдвинутся, программисту придется заново рассчитывать координаты Верх и Лево.

Чтобы избежать этого, мы можем разместить "картинку-заглушку" в самом макете через интерактивный редактор конфигуратора:

  1. Откройте макет печатной формы в конфигураторе.
  2. В главном меню выберите Таблица — Рисунки — Картинка...
  3. Нажмите "ОК", не выбирая конкретный файл с диска. На макете появится пустая рамка.
  4. Расположите её в нужном месте макета и настройте размеры визуально.
  5. Откройте свойства созданного рисунка (клавиша Alt + Enter) и задайте свойство Имя (например, ЛоготипОрганизации). Там же можно отключить границы рисунка, установив свойство Линия в значение Нет линии.

После этого программный код вывода печатной формы значительно упростится. Нам больше не нужно высчитывать координаты, мы просто обращаемся к рисунку по его имени:


// Получаем область макета, в которой визуально размещен наш рисунок-шаблон
ОбластьШапки = Макет.ПолучитьОбласть("Шапка");

// Получаем двоичные данные изображения (например, из константы или реквизита организации)
ДвоичныеДанныеЛоготипа = ПолучитьЛоготипОрганизации();

Если ДвоичныеДанныеЛоготипа <> Неопределено Тогда
    // Заменяем пустую картинку в шаблоне на реальное изображение
    ОбластьШапки.Рисунки.ЛоготипОрганизации.Картинка = Новый Картинка(ДвоичныеДанныеЛоготипа);
КонецЕсли;

ТабличныйДокумент.Вывести(ОбластьШапки);

Способ №3. Использование параметра картинки ячейки (Наиболее современный подход)

Если вам нужно вывести картинку прямо внутрь конкретной ячейки таблицы (например, фото товара в строке спецификации), платформа 1С предоставляет крайне удобное свойство ячейки — Параметр картинки.

Разберем по шагам, как настроить макет и написать под него лаконичный код:

  1. В макете выделите нужную ячейку, в которой должна отображаться фотография товара.
  2. Откройте панель свойств этой ячейки.
  3. В группе свойств Макет найдите поле Параметр картинки и введите туда понятное имя параметра, например, ФотоТовара.
  4. При желании сделайте цвет текста в этой ячейке белым или совпадающим с фоном ячейки. Это необходимо для того, чтобы техническая надпись "Картинка", которая по умолчанию отображается на макете, не накладывалась поверх реального изображения при печати.

Программный код заполнения такой области выглядит максимально просто и избавляет от необходимости работать с коллекцией Рисунки:


ОбластьСтроки = Макет.ПолучитьОбласть("Строка");

// Получаем картинку товара (например, из присоединенных файлов БСП)
ДвоичныеДанныеФото = ПолучитьФотографиюТовара(ТекущаяСтрока.Товар);

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

ТабличныйДокумент.Вывести(ОбластьСтроки);

Важные правила работы с изображениями в 1С

Для того чтобы ваши печатные формы работали быстро, стабильно и выглядели профессионально на любых экранах и принтерах, рекомендуем придерживаться следующих правил:

1. Защита от аварийного завершения работы программы.
Всегда проверяйте получаемые двоичные данные картинок на значение Неопределено или пустые значения. Конструктор Новый Картинка(Неопределено) вызовет критическую ошибку выполнения кода, из-за чего пользователь вообще не сможет сформировать и распечатать документ. Оборачивайте блоки получения файлов из базы данных в конструкции Попытка ... Исключение.

2. Программное отключение рамок у динамических рисунков.
При программном создании рисунков через метод Рисунки.Добавить() платформа по умолчанию рисует тонкую черную рамку вокруг изображения. Если вам нужно убрать её, используйте объект Линия:


// Отключаем отображение границы рамки рисунка
Рисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);

3. Интеграция с механизмами БСП (Библиотеки стандартных подсистем).
В современных конфигурациях файлы редко хранятся непосредственно в реквизитах справочников. Как правило, используется стандартный механизм хранения присоединенных файлов. Чтобы безопасно извлечь картинку без привязки к СУБД (так как файлы могут физически лежать в томах хранения на сервере), используйте методы БСП:


// Получаем ссылку на присоединенный файл картинки номенклатуры
СсылкаНаФайл = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущийТовар, "ФайлКартинки");

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

4. Использование векторной графики (SVG).
Начиная с современных версий платформы 1С:Предприятие 8.3, полностью поддерживается обработка векторного графического формата SVG. Настоятельно рекомендуем использовать именно этот формат для вывода логотипов, факсимиле подписей и оттисков печатей. Векторная графика, в отличие от растровых форматов (PNG, JPG, BMP), идеально масштабируется без потери качества (без пикселизации) как на экранах с высоким разрешением (4K, Retina), так и при распечатке на высокопроизводительных офисных принтерах.

← На главную