К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как вывести картинку в табличный документ в 1С

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

Вывод изображений в табличный документ — типовая задача при разработке печатных форм в 1С: логотипы организации, подписи руководителей, фотографии товаров в прайс-листах, штрихкоды и QR-коды. Табличный документ поддерживает работу с картинками через специальную коллекцию рисунков, и у разработчика есть несколько способов вставить изображение: программно в готовую область, через макет с заранее подготовленным рисунком или через картинку, хранящуюся в базе данных.

Ключевой объект здесь — коллекция Рисунки табличного документа. Каждый элемент коллекции имеет тип РисунокТабличногоДокумента и содержит свойства: Картинка, Лево, Верх, Ширина, Высота, РазмерКартинки. Важно понимать: картинка в табличном документе не привязана жёстко к ячейке — она позиционируется координатами в миллиметрах и может перекрывать несколько ячеек.

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

Базовый способ: программный вывод картинки из файла

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

ТабДок = Новый ТабличныйДокумент;

// Выводим текстовую часть

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

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

// Добавляем картинку

Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);

Рисунок.Картинка = Новый Картинка("C:\Images\logo.png");

Рисунок.Лево = 5; // мм от левого края

Рисунок.Верх = 3; // мм от верхнего края

Рисунок.Ширина = 40; // мм

Рисунок.Высота = 15; // мм

Координаты задаются в миллиметрах относительно листа, а не конкретной ячейки. Если нужно привязать картинку к определённой области, сначала вычислите положение области: у объекта области есть свойства Верх, Низ, Лево, Право в единицах табличного документа, но проще ориентироваться на строки — высоту каждой выведенной области можно получить через ВысотаТаблицы и высоту строк.

Порядок действий
  1. 1
    Создайте объект ТабличныйДокумент и выведите текстовые области макета
  2. 2
    Добавьте рисунок: ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка)
  3. 3
    Присвойте свойству Картинка объект Картинка из файла или двоичных данных
  4. 4
    Задайте координаты Лево, Верх и размеры Ширина, Высота в миллиметрах
  5. 5
    Проверьте результат в предпросмотре и при печати на принтере

Вывод картинки из базы данных (хранилища значений)

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

ДвоичныеДанные = Товар.ФайлКартинки.Получить(); // из хранилища значений

Если ДвоичныеДанные <> Неопределено Тогда

Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);

Рисунок.Картинка = Новый Картинка(ДвоичныеДанные);

Рисунок.Лево = 10;

Рисунок.Верх = 20;

Рисунок.Ширина = 30;

Рисунок.Высота = 30;

КонецЕсли;

Обязательно проверяйте, что хранилище не пустое: вызов Получить() у пустого хранилища вернёт Неопределено, и конструктор Новый Картинка(Неопределено) вызовет ошибку или создаст пустую картинку в зависимости от контекста. Если изображений много (например, прайс на 500 позиций с фото), учитывайте нагрузку: каждое обращение к хранилищу — это чтение данных, а сам табличный документ с сотнями картинок заметно разрастается в памяти.

Для конфигураций на БСП фото обычно лежат в справочнике присоединённых файлов. Двоичные данные получают через функцию РаботаСФайлами.ДвоичныеДанныеФайла(ПрисоединенныйФайл) — это правильнее, чем читать служебные реквизиты напрямую, так как файл может храниться в томах на диске.

Вывод картинки через макет табличного документа

Второй подход — вставить рисунок непосредственно в макет в конфигураторе. Откройте макет типа «Табличный документ», выделите нужную область и через меню «Таблица → Рисунки → Вставить рисунок» добавьте картинку. Затем в свойствах рисунка задайте имя, например «Логотип».

При выводе области рисунок попадёт в табличный документ автоматически вместе с ячейками. Это удобно для статичных изображений: логотипа компании, образца подписи, печати. Не нужно рассчитывать координаты в коде — позиция задана визуально в макете.

Если картинку в макете нужно подменять программно (например, разные логотипы для разных организаций), обратитесь к рисунку по имени после вывода области:

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

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

// Рисунок из макета доступен по имени

РисунокЛого = ТабДок.Рисунки.Найти("Логотип");

Если РисунокЛого <> Неопределено Тогда

РисунокЛого.Картинка = Новый Картинка(ДвоичныеДанныеЛоготипа);

КонецЕсли;

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

Сравнение вариантов

Программное добавление рисунка

Гибкое позиционирование и подмена картинки на лету; подходит для динамических изображений из базы. Требует ручного расчёта координат.

Рисунок в макете

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

Картинка в свойстве ячейки (фон)

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

Масштабирование и размеры изображения

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

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

Учитывайте разрешение исходного файла. Фото 4000×3000 пикселей, вставленное в область 30×30 мм, не уменьшит размер итогового документа — картинка хранится внутри табличного документа в исходном виде. Для больших прайсов заранее ужимайте изображения до разумного разрешения, иначе файл печатной формы будет весить десятки мегабайт, а формирование — занимать минуты.

Перед вставкой в табличный документ фото товаров удобно хранить в базе уже уменьшенную превью-версию (например, 300×300 пикселей) рядом с оригиналом. Печатная форма использует превью, а полноразмерный файл остаётся для карточек и сайта — это резко ускоряет формирование прайсов.
ПЗ
Практическое замечание

Частые ошибки и их устранение

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

Вторая проблема — картинка «уезжает» при печати или в PDF. Это следствие позиционирования в миллиметрах от края листа при нестандартных полях страницы или масштабе печати. Задавайте параметры страницы табличного документа (поля, ориентацию) явно перед выводом и тестируйте на реальном принтере, а не только в предпросмотре.

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

Типичные ошибки
01
Вызов Новый Картинка(ДвоичныеДанные) без проверки, что данные получены — ошибка или пустой рисунок
02
Путь к файлу на клиенте при серверном выполнении кода — файл не найден
03
Поиск рисунка по имени после многократного вывода области — находится только первый экземпляр
04
Вставка фото в полном разрешении — документ раздувается и формируется медленно
05
Растягивание штрихкода без соблюдения пропорций — сканер не считывает код

Проверка результата перед печатью

После формирования табличного документа проверьте результат в трёх режимах: на экране в предпросмотре, при экспорте в PDF или MXL и на реальной печати. Расхождения между экраном и бумагой — нормальное явление из-за различий в пересчёте миллиметров и DPI.

Программно убедиться, что рисунок добавлен, можно через коллекцию: ТабДок.Рисунки.Количество() должно соответствовать ожидаемому числу изображений, а у каждого рисунка свойство Картинка не должно быть пустым (проверяется через ВидКартинки или сравнение с пустой картинкой).

Контрольные точки

Как проверить результат

Количество рисунков в документе
Норма

ТабДок.Рисунки.Количество() равно числу ожидаемых изображений

Тревожный признак

Рисунков меньше — часть картинок не добавилась (пустые хранилища или ошибки данных)

Отображение в предпросмотре
Норма

Картинка видна, пропорции сохранены, не перекрывает текст

Тревожный признак

Рисунок сдвинут, обрезан или искажён — неверны координаты или режим размера

Печать на принтере
Норма

Изображение на бумаге совпадает с предпросмотром по позиции

Тревожный признак

Картинка смещена — проверьте поля страницы и масштаб печати

Ограничения и альтернативы

Табличный документ — не единственный способ вывести изображение в печатную форму. Если требуется сложная вёрстка с точным позиционированием графики, рассмотрите альтернативы: макет в формате HTML с последующим выводом в PDF, офисные макеты (DOCX через COM или OpenXML), внешние компоненты формирования отчётов. Каждый вариант имеет свою цену внедрения и поддержки.

Помните про ограничения самого табличного документа: нет поддержки прозрачности с альфа-каналом в некоторых режимах вывода, нет обтекания текстом, рисунок всегда лежит поверх ячеек. Если картинка должна быть фоном под текстом, используйте свойство фона ячейки или выводите текст поверх рисунка с учётом координат.

Итог

Что важно запомнить

Картинки выводятся через ТабДок.Рисунки.Добавить() с объектом Картинка из файла или двоичных данных, либо вставляются заранее в макет. Координаты задаются в миллиметрах, размер контролируется свойством РазмерКартинки. Проверяйте непустые данные, формат файла и результат на реальной печати.

Частые вопросы

Как вывести картинку в конкретную ячейку табличного документа?

Жёсткой привязки рисунка к ячейке нет — позиционирование идёт в миллиметрах. Практический приём: выведите область, запомните значение ТабДок.ВысотаТаблицы до и после вывода, затем рассчитайте координату Верх рисунка из высоты строк. Для простых случаев проще вставить рисунок в макет внутри нужной области.

Почему картинка видна на экране, но не печатается?

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

Какие форматы изображений поддерживает табличный документ 1С?

Объект Картинка работает с PNG, JPEG, GIF, BMP, TIFF и метафайлами WMF/EMF. Форматы SVG и WebP напрямую не поддерживаются — их нужно предварительно конвертировать, например в PNG, внешними средствами или при загрузке файла в базу.

Как вывести фото товара в каждой строке прайс-листа?

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

Документ с картинками формируется очень долго. Что делать?

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

Можно ли вывести QR-код в табличный документ?

Да. QR-код генерируется внешними средствами (компонентой, веб-сервисом или готовой функцией) в виде файла PNG, после чего вставляется обычным способом через коллекцию Рисунки. Важно сохранять пропорции и не растягивать код, иначе сканеры его не распознают.