Как вывести картинку из Хранилища Значений в макет печатной формы 1С

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

При разработке печатных форм в 1С часто возникает задача вывода различных графических объектов: логотипов компаний, фотографий номенклатуры, изображений штрихкодов или факсимиле. Обычно эти изображения хранятся в базе данных в реквизитах с типом ХранилищеЗначений. Процесс их вывода на печать имеет ряд нюансов, связанных с позиционированием, масштабированием и безопасным извлечением данных.

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

Подготовка: Безопасное получение данных из Хранилища Значений

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

Рассмотрим безопасный шаблон извлечения двоичных данных и инициализации объекта Картинка. Проанализируем следующий код:


// Получаем данные из реквизита ХранилищеЗначений
ДанныеХранилища = ДокументОбъект.Изделие.Картинка.Файл.Получить();

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

Использование такой проверки гарантирует, что конструктор Новый Картинка() не вызовет ошибку несоответствия типов, если в базе данных отсутствует изображение.

Способ 1. Программное добавление рисунка в область макета

Этот способ во многом повторяет решение, к которому пришел автор темы на форуме. Он заключается в том, что на лету создается графический контейнер внутри области табличного документа, заполняется картинкой и позиционируется по координатам.

Давайте разберем по шагам, как это реализовать в коде:


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

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

// 3. Задаем координаты и геометрические размеры контейнера (в миллиметрах)
Рисунок.Верх = 5; 
Рисунок.Высота = 70; 
Рисунок.Ширина = 70; 
Рисунок.Лево = 5; 

// 4. Помещаем картинку в созданный контейнер
Рисунок.Картинка = КартинкаДляПечати;

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

// 6. Выводим область в итоговый табличный документ
ТабличныйДокумент.Вывести(ОбластьМакета);

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

Недостатки: Координаты (Верх, Лево, Высота, Ширина) приходится прописывать вручную. При любом изменении дизайна печатной формы разработчику придется пересчитывать эти показатели в коде.

Способ 2. Предварительное размещение картинки в макете (Рекомендуемый)

Чтобы избежать ручного прописывания координат в коде, мы можем визуально разместить контейнер для картинки прямо в конфигураторе при редактировании макета.

Рассмотрим пошаговый алгоритм настройки макета:

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

Теперь программный код для заполнения этого рисунка будет выглядеть максимально просто и лаконично:


ОбластьМакета = Макет.ПолучитьОбласть("ТехническиеХарактеристикиШапкаТч");

// Нам больше не нужно создавать рисунок и задавать координаты!
// Достаточно обратиться к нему по имени, заданному в макете:
Если ЗначениеЗаполнено(КартинкаДляПечати) Тогда
    ОбластьМакета.Рисунки.ИзображениеТовара.Картинка = КартинкаДляПечати;
Иначе
    // Если картинки нет, скрываем рамку, чтобы она не печаталась пустой
    ОбластьМакета.Рисунки.ИзображениеТовара.Видимость = Ложь;
EndIf;

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

Способ 3. Вывод картинки через свойство ячейки «Параметр картинки»

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

Разберем, как это настроить:

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

Заполнение такого параметра в коде происходит аналогично работе с обычным текстом:


ОбластьМакета = Макет.ПолучитьОбласть("ТехническиеХарактеристикиШапкаТч");

// Присваиваем объект Картинка непосредственно в параметр ячейки
ОбластьМакета.Параметры.ФотоТовара = КартинкаДляПечати;

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

При таком подходе картинка жестко привязана к границам ячеек, масштабируется вместе с ними при изменении ширины колонок и ведет себя стабильно при конвертации печатной формы в форматы PDF или Excel.

Анализ режимов масштабирования (РазмерКартинки)

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

Полезный совет: Как скрыть рамку рисунка

По умолчанию у добавленных рисунков на печати может отображаться тонкая черная рамка. Чтобы изображение выглядело аккуратно, эту границу рекомендуется отключать программно:


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

Или, если вы используете заранее добавленный рисунок в макете, просто настройте свойство Линия в свойствах рисунка в конфигураторе, установив тип линии Нет линии.

Особенности работы при использовании БСП

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


// Получаем двоичные данные файла через БСП
ДвоичныеДанныеФайла = РаботаСФайлами.ДвоичныеДанныеФайла(СсылкаНаПрисоединенныйФайл);

Если ТипЗнч(ДвоичныеДанныеФайла) = Тип("ДвоичныеДанные") Тогда
    КартинкаДляПечати = Новый Картинка(ДвоичныеДанныеФайла);
КонецЕсли;

Использование методов БСП делает код более устойчивым к обновлениям конфигурации и гарантирует высокую производительность системы.

← На главную