Разработка и Конфигурация · 12 мин
Как вывести картинку в табличный документ в 1С
Как вывести картинку в табличный документ 1С: методы Рисунок, НачатьПомещениеКартинки, работа с макетами, областями и типичные ошибки при вставке изображений.
Вывод изображений в табличный документ — типовая задача при разработке печатных форм в 1С: логотипы организации, подписи руководителей, фотографии товаров в прайс-листах, штрихкоды и QR-коды. Табличный документ поддерживает работу с картинками через специальную коллекцию рисунков, и у разработчика есть несколько способов вставить изображение: программно в готовую область, через макет с заранее подготовленным рисунком или через картинку, хранящуюся в базе данных.
Ключевой объект здесь — коллекция Рисунки табличного документа. Каждый элемент коллекции имеет тип РисунокТабличногоДокумента и содержит свойства: Картинка, Лево, Верх, Ширина, Высота, РазмерКартинки. Важно понимать: картинка в табличном документе не привязана жёстко к ячейке — она позиционируется координатами в миллиметрах и может перекрывать несколько ячеек.
Ниже разобраны рабочие способы вывода изображений: из файла на диске, из двоичных данных в базе, через макет, а также нюансы масштабирования, типичные ошибки и проверка результата перед печатью.
Базовый способ: программный вывод картинки из файла
Самый прямой вариант — создать объект Картинка из файла и добавить его в коллекцию рисунков табличного документа. Это подходит для логотипов и статичных изображений, которые лежат в известном месте на диске сервера или клиента.
ТабДок = Новый ТабличныйДокумент;
// Выводим текстовую часть
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);
// Добавляем картинку
Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = Новый Картинка("C:\Images\logo.png");
Рисунок.Лево = 5; // мм от левого края
Рисунок.Верх = 3; // мм от верхнего края
Рисунок.Ширина = 40; // мм
Рисунок.Высота = 15; // мм
Координаты задаются в миллиметрах относительно листа, а не конкретной ячейки. Если нужно привязать картинку к определённой области, сначала вычислите положение области: у объекта области есть свойства Верх, Низ, Лево, Право в единицах табличного документа, но проще ориентироваться на строки — высоту каждой выведенной области можно получить через ВысотаТаблицы и высоту строк.
- 1Создайте объект ТабличныйДокумент и выведите текстовые области макета
- 2Добавьте рисунок: ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка)
- 3Присвойте свойству Картинка объект Картинка из файла или двоичных данных
- 4Задайте координаты Лево, Верх и размеры Ширина, Высота в миллиметрах
- 5Проверьте результат в предпросмотре и при печати на принтере
Вывод картинки из базы данных (хранилища значений)
В реальных конфигурациях изображения обычно хранятся в базе — например, фото товара в реквизите типа ХранилищеЗначения или в присоединённых файлах БСП. В этом случае картинку получают из двоичных данных.
ДвоичныеДанные = Товар.ФайлКартинки.Получить(); // из хранилища значений
Если ДвоичныеДанные <> Неопределено Тогда
Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = Новый Картинка(ДвоичныеДанные);
Рисунок.Лево = 10;
Рисунок.Верх = 20;
Рисунок.Ширина = 30;
Рисунок.Высота = 30;
КонецЕсли;
Обязательно проверяйте, что хранилище не пустое: вызов Получить() у пустого хранилища вернёт Неопределено, и конструктор Новый Картинка(Неопределено) вызовет ошибку или создаст пустую картинку в зависимости от контекста. Если изображений много (например, прайс на 500 позиций с фото), учитывайте нагрузку: каждое обращение к хранилищу — это чтение данных, а сам табличный документ с сотнями картинок заметно разрастается в памяти.
Для конфигураций на БСП фото обычно лежат в справочнике присоединённых файлов. Двоичные данные получают через функцию РаботаСФайлами.ДвоичныеДанныеФайла(ПрисоединенныйФайл) — это правильнее, чем читать служебные реквизиты напрямую, так как файл может храниться в томах на диске.
Вывод картинки через макет табличного документа
Второй подход — вставить рисунок непосредственно в макет в конфигураторе. Откройте макет типа «Табличный документ», выделите нужную область и через меню «Таблица → Рисунки → Вставить рисунок» добавьте картинку. Затем в свойствах рисунка задайте имя, например «Логотип».
При выводе области рисунок попадёт в табличный документ автоматически вместе с ячейками. Это удобно для статичных изображений: логотипа компании, образца подписи, печати. Не нужно рассчитывать координаты в коде — позиция задана визуально в макете.
Если картинку в макете нужно подменять программно (например, разные логотипы для разных организаций), обратитесь к рисунку по имени после вывода области:
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(ОбластьШапка);
// Рисунок из макета доступен по имени
РисунокЛого = ТабДок.Рисунки.Найти("Логотип");
Если РисунокЛого <> Неопределено Тогда
РисунокЛого.Картинка = Новый Картинка(ДвоичныеДанныеЛоготипа);
КонецЕсли;
У этого способа есть ограничение: при многократном выводе одной и той же области (например, строки товаров с фото) имена рисунков в табличном документе должны быть уникальными. Платформа автоматически добавляет суффиксы к именам дублирующихся рисунков, поэтому поиск по исходному имени найдёт только первый экземпляр. Для повторяющихся строк надёжнее работать с коллекцией рисунков по индексу или добавлять рисунки полностью программно.
Сравнение вариантов
Гибкое позиционирование и подмена картинки на лету; подходит для динамических изображений из базы. Требует ручного расчёта координат.
Визуальная настройка позиции без кода; идеален для статичных логотипов и подписей. Сложнее при повторяющихся областях.
Через оформление ячейки можно задать фоновое изображение; применяется редко, подходит для водяных знаков и подложек.
Масштабирование и размеры изображения
Свойство РазмерКартинки управляет тем, как изображение вписывается в заданные габариты рисунка. Доступны значения: АвтоРазмер (рисунок принимает реальный размер картинки), Пропорционально (картинка масштабируется с сохранением пропорций), РеальныйРазмер и растягивание на всю область рисунка.
Для фотографий товаров почти всегда выбирайте Пропорционально — иначе лица и упаковка исказятся. Для штрихкодов и QR-кодов, наоборот, важно точное соответствие размеров: искажение пропорций может сделать код нечитаемым для сканера.
Учитывайте разрешение исходного файла. Фото 4000×3000 пикселей, вставленное в область 30×30 мм, не уменьшит размер итогового документа — картинка хранится внутри табличного документа в исходном виде. Для больших прайсов заранее ужимайте изображения до разумного разрешения, иначе файл печатной формы будет весить десятки мегабайт, а формирование — занимать минуты.
Перед вставкой в табличный документ фото товаров удобно хранить в базе уже уменьшенную превью-версию (например, 300×300 пикселей) рядом с оригиналом. Печатная форма использует превью, а полноразмерный файл остаётся для карточек и сайта — это резко ускоряет формирование прайсов.
Частые ошибки и их устранение
Первая типичная проблема — картинка не отображается вовсе. Причины: пустое хранилище значений, неподдерживаемый формат файла, неверный путь к файлу на сервере (код выполняется на сервере, а файл лежит на клиентской машине), либо рисунок добавлен, но координаты указывают за пределы видимой области. Проверяйте каждое звено по очереди: сначала факт получения двоичных данных, потом создание объекта Картинка, затем координаты.
Вторая проблема — картинка «уезжает» при печати или в PDF. Это следствие позиционирования в миллиметрах от края листа при нестандартных полях страницы или масштабе печати. Задавайте параметры страницы табличного документа (поля, ориентацию) явно перед выводом и тестируйте на реальном принтере, а не только в предпросмотре.
Третья ошибка — попытка использовать метод Вывести с областью, содержащей рисунок, в цикле и обращаться к рисункам по имени. Как описано выше, имена дублируются с суффиксами. Для строк табличной части добавляйте рисунки программно после вывода каждой строки, вычисляя координату Верх по высоте уже выведенных областей.
Проверка результата перед печатью
После формирования табличного документа проверьте результат в трёх режимах: на экране в предпросмотре, при экспорте в PDF или MXL и на реальной печати. Расхождения между экраном и бумагой — нормальное явление из-за различий в пересчёте миллиметров и DPI.
Программно убедиться, что рисунок добавлен, можно через коллекцию: ТабДок.Рисунки.Количество() должно соответствовать ожидаемому числу изображений, а у каждого рисунка свойство Картинка не должно быть пустым (проверяется через ВидКартинки или сравнение с пустой картинкой).
Как проверить результат
ТабДок.Рисунки.Количество() равно числу ожидаемых изображений
Рисунков меньше — часть картинок не добавилась (пустые хранилища или ошибки данных)
Картинка видна, пропорции сохранены, не перекрывает текст
Рисунок сдвинут, обрезан или искажён — неверны координаты или режим размера
Изображение на бумаге совпадает с предпросмотром по позиции
Картинка смещена — проверьте поля страницы и масштаб печати
Ограничения и альтернативы
Табличный документ — не единственный способ вывести изображение в печатную форму. Если требуется сложная вёрстка с точным позиционированием графики, рассмотрите альтернативы: макет в формате HTML с последующим выводом в PDF, офисные макеты (DOCX через COM или OpenXML), внешние компоненты формирования отчётов. Каждый вариант имеет свою цену внедрения и поддержки.
Помните про ограничения самого табличного документа: нет поддержки прозрачности с альфа-каналом в некоторых режимах вывода, нет обтекания текстом, рисунок всегда лежит поверх ячеек. Если картинка должна быть фоном под текстом, используйте свойство фона ячейки или выводите текст поверх рисунка с учётом координат.
Что важно запомнить
Картинки выводятся через ТабДок.Рисунки.Добавить() с объектом Картинка из файла или двоичных данных, либо вставляются заранее в макет. Координаты задаются в миллиметрах, размер контролируется свойством РазмерКартинки. Проверяйте непустые данные, формат файла и результат на реальной печати.
Частые вопросы
Как вывести картинку в конкретную ячейку табличного документа?
Жёсткой привязки рисунка к ячейке нет — позиционирование идёт в миллиметрах. Практический приём: выведите область, запомните значение ТабДок.ВысотаТаблицы до и после вывода, затем рассчитайте координату Верх рисунка из высоты строк. Для простых случаев проще вставить рисунок в макет внутри нужной области.
Почему картинка видна на экране, но не печатается?
Чаще всего дело в настройках печати табличного документа: проверьте, что рисунок не попадает в область колонтитула или за пределы печатной области страницы. Также убедитесь, что у рисунка не установлено свойство, исключающее его из печати, и что поля страницы заданы корректно.
Какие форматы изображений поддерживает табличный документ 1С?
Объект Картинка работает с PNG, JPEG, GIF, BMP, TIFF и метафайлами WMF/EMF. Форматы SVG и WebP напрямую не поддерживаются — их нужно предварительно конвертировать, например в PNG, внешними средствами или при загрузке файла в базу.
Как вывести фото товара в каждой строке прайс-листа?
В цикле по товарам выводите область строки, затем программно добавляйте рисунок: получайте двоичные данные из хранилища, создавайте Картинку, вычисляйте координату Верх по текущей высоте табличного документа. Не полагайтесь на поиск рисунков по имени — при повторном выводе области имена дублируются.
Документ с картинками формируется очень долго. Что делать?
Основные причины — большое разрешение исходных фото и чтение данных из хранилища в цикле. Храните в базе уменьшенные превью для печатных форм, получайте двоичные данные пакетно там, где это возможно, и ограничивайте число изображений на странице. Для очень больших каталогов рассмотрите формирование в фоновом задании.
Можно ли вывести QR-код в табличный документ?
Да. QR-код генерируется внешними средствами (компонентой, веб-сервисом или готовой функцией) в виде файла PNG, после чего вставляется обычным способом через коллекцию Рисунки. Важно сохранять пропорции и не растягивать код, иначе сканеры его не распознают.