При разработке отчетов в 1С:Предприятие 8 (особенно в конфигурациях на обычных формах, таких как УТ 10.3) часто возникает задача визуализировать товар. Обычное присваивание картинки параметру ячейки в макете не дает нужного результата: вместо фотографии в отчете отображается текстовое строковое представление типа — слово «Картинка». Это происходит потому, что ячейка табличного документа предназначена для текста или чисел, а для отображения графики используется специальный слой объектов-рисунков.
В этой статье мы подробно разберем, как правильно выводить изображения в отчет, проанализируем типичные ошибки позиционирования и рассмотрим несколько способов реализации этой задачи.
Разберем ситуацию: когда мы пишем Секция.Параметры.КартинкаПоз = Выборка.ОсновноеИзображение.Хранилище.Получить();, система пытается преобразовать двоичные данные картинки в строку. Поскольку у объекта Картинка нет текстового представления, кроме его названия типа, мы и видим надпись в ячейке. Чтобы вывести именно изображение, нам нужно создать графический объект внутри области табличного документа.
Этот метод считается наиболее гибким, так как позволяет динамически управлять размерами и свойствами картинки. Рассмотрим алгоритм действий по шагам.
Во-первых, нам необходимо получить нужную область макета, куда будет вставлено изображение. Во-вторых, нужно создать новый рисунок в коллекции Рисунки этой области. Проанализируем пример кода, который решает эту задачу:
// 1. Получаем область из макета
Секция = Макет.ПолучитьОбласть("Строка|КолонкаИзображения");
// 2. Добавляем новый рисунок в коллекцию рисунков этой секции
// Используем тип ТипРисункаТабличногоДокумента.Картинка
КартинкаТовара = Секция.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
// 3. Извлекаем данные картинки из хранилища
Если ЗначениеЗаполнено(Выборка.Номенклатура.ОсновноеИзображение) Тогда
ДанныеКартинки = Выборка.Номенклатура.ОсновноеИзображение.Хранилище.Получить();
КартинкаТовара.Картинка = ДанныеКартинки;
КонецЕсли;
// 4. Настраиваем размеры и положение рисунка внутри ячейки
КартинкаТовара.Высота = 35; // Высота в миллиметрах
КартинкаТовара.Ширина = 45; // Ширина в миллиметрах
КартинкаТовара.Верх = 1; // Отступ сверху
КартинкаТовара.Лево = 1; // Отступ слева
// 5. Устанавливаем режим масштабирования
КартинкаТовара.РазмерКартинки = РазмерКартинки.Пропорционально;
// 6. Выводим секцию в итоговый документ
ТабДок.Вывести(Секция);
В данном примере крайне важно обратить внимание на свойство РазмерКартинки. Использование значения РазмерКартинки.Пропорционально гарантирует, что фотография не будет растянута или сплюснута, она впишется в заданные границы Высота и Ширина с сохранением своих пропорций.
Частая проблема, с которой сталкиваются разработчики: картинка «улетает» в нижнюю часть отчета или смещается при изменении ширины колонок. Чтобы этого избежать, рекомендуется использовать метод Расположить(). Этот метод жестко привязывает графический объект к сетке ячеек.
Выясним, как это реализовать на практике:
Расположить для помещения рисунка точно в границы этой области.
// Выводим секцию
ТабДок.Вывести(Секция);
// Определяем область, где должна быть картинка (последняя выведенная строка)
НомерСтроки = ТабДок.ВысотаТаблицы;
ОбластьДляКартинки = ТабДок.Область(НомерСтроки, 2, НомерСтроки, 2); // Строка, Колонка
// Создаем рисунок непосредственно в итоговом документе (или в секции до вывода)
НовыйРисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
НовыйРисунок.Картинка = ДанныеКартинки;
// Привязываем рисунок к ячейкам
НовыйРисунок.Расположить(ОбластьДляКартинки);
НовыйРисунок.РазмерКартинки = РазмерКартинки.Пропорционально;
Преимущество этого метода в том, что нам не нужно вручную высчитывать Высота и Ширина в миллиметрах. Рисунок автоматически примет размер ячейки, которую мы указали в методе Область().
Работа с графикой в отчетах требует внимательного отношения к ресурсам системы. Если в базе данных тысячи товаров, и у каждого есть фото высокого разрешения, отчет может формироваться очень долго или привести к нехватке памяти.
Рассмотрим основные правила оптимизации:
Получить(). Лишние обращения к базе данных замедляют цикл формирования. Используйте ЗначениеЗаполнено(Выборка.ОсновноеИзображение).Картинка в цикле, 1С обычно эффективно управляет памятью, но при очень больших объемах данных стоит следить за тем, чтобы не создавать лишних копий объектов.Чтобы картинки выглядели аккуратно, проанализируем настройки самого макета в конфигураторе:
Во-первых, установите фиксированную высоту строки в макете. Если высота строки будет стоять в значении «Авто», а рисунок будет программно добавлен с большой высотой, это может привести к непредсказуемому отображению. Лучше заранее задать высоту строки, соответствующую желаемому размеру превью товара.
Во-вторых, обратите внимание на границы. При программном добавлении рисунка через Рисунки.Добавить(), у него по умолчанию могут быть включены линии границ. Если они вам не нужны, их следует отключить программно:
КартинкаТовара.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);
Мы рассмотрели основной механизм вывода изображений в отчеты 1С. Ключевой момент — использование объекта РисунокТабличногоДокумента вместо простых параметров ячеек. Помните, что для точного позиционирования лучше всего подходит метод Расположить(), а для сохранения внешнего вида без искажений — свойство РазмерКартинки.Пропорционально. Используя эти подходы, вы сможете создавать наглядные и качественные отчеты с визуализацией данных.