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

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

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

Как программно вставить картинку в табличный документ 1С: область Рисунок, метод Рисунки.Добавить, вывод логотипа в печатную форму, типичные ошибки и примеры кода.

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

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

Ниже разобраны оба способа с рабочими примерами кода, различия между управляемыми и обычными формами, ограничения по форматам и типичные ошибки, из-за которых картинка не отображается или «ломает» вёрстку печатной формы.

Два способа вставки изображения: через макет и программно

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

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

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

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

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

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

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

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

Компромисс: картинка жёстко привязана к ячейке и масштабируется вместе с ней, но содержимое фиксировано в макете.

Вставка картинки через макет печатной формы

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

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

В коде такая область выводится стандартно:

Макет = Документы.РеализацияТоваровУслуг.ПолучитьМакет("СчетНаОплату");

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

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

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

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

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

// ... вывод областей макета ...

Картинка = Новый Картинка("C:\Temp\logo.png"); // из файла

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

Рисунок.Имя = "Логотип";

Рисунок.Картинка = Картинка;

Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально;

// Привязка к области: строки 1-5, колонки 1-3

ОбластьРазмещения = ТабДок.Область(1, 1, 5, 3);

Рисунок.Расположить(ОбластьРазмещения);

Метод Расположить() привязывает рисунок к прямоугольной области табличного документа — изображение растянется или сожмётся в её границах в зависимости от свойства РазмерКартинки. Альтернатива — задать координаты явно через свойства Верх, Лево, Высота, Ширина (в миллиметрах), что удобно для точного позиционирования печати и подписи поверх текста.

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

Откуда получить объект «Картинка»

Из файла на диске

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

Из хранилища значения в базе данных

Типовой сценарий — картинка хранится в реквизите справочника типа «ХранилищеЗначения» (например, логотип организации или фото товара):

Хранилище = Организация.Логотип; // реквизит типа ХранилищеЗначения

ДвоичныеДанные = Хранилище.Получить();

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

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

КонецЕсли;

Из присоединённых файлов (БСП)

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

Форматы, размеры и позиционирование

Платформа 1С поддерживает распространённые растровые форматы: PNG, JPEG, BMP, GIF, а также векторный SVG (с ограничениями, зависящими от версии платформы). Для печатных форм предпочтителен PNG — он даёт чёткие края у логотипов и подписей и поддерживает прозрачность. JPEG подходит для фотографий, но артефакты сжатия заметны на мелком тексте и линиях.

Размер изображения влияет на вёрстку. Если картинка больше отведённой области, а свойство РазмерКартинки установлено в «Реальный размер», рисунок вылезет за границы ячеек и перекроет текст. Безопасные варианты — «Пропорционально» (сохраняет соотношение сторон) или «АвтоРазмер» у ячейки макета. Высоту строк под картинку задавайте явно, иначе при разных настройках масштаба печати вёрстка «поедет».

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

Типичные ошибки
01
Вставка картинки до вывода областей макета — последующий Вывести() может перекрыть или сместить рисунок; добавляйте рисунки после формирования всего документа
02
Отсутствие проверки пустого хранилища — исключение в Новый Картинка() прерывает печать всей партии документов
03
РазмерКартинки = Реальный размер для большого файла — изображение перекрывает соседние ячейки и текст
04
Привязка к области с объединёнными ячейками, которые потом меняются в макете, — рисунок оказывается не на месте; фиксируйте структуру макета
05
Использование клиентского пути к файлу в серверном коде — на сервере файл недоступен, печать падает с ошибкой

Особенности для управляемых форм и веб-клиента

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

Если картинку выбирает пользователь интерактивно, файл сначала помещают во временное хранилище на клиенте (НачатьПомещениеФайла), а на сервере извлекают двоичные данные по адресу хранилища и создают картинку. Прямая конструкция Новый Картинка("C:\...") на тонком или веб-клиенте работать не будет из-за ограничений безопасности файловой системы.

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

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

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

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

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

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

Изображение смещено, растянуто или перекрывает данные

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

Картинка печатается чётко, границы совпадают с предпросмотром

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

Картинка обрезана, размыта или отсутствует на бумаге

Печать нескольких документов подряд
Норма

Все документы сформированы, у каждого своя картинка

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

Ошибка на документе без картинки прерывает всю пачку

Разные клиенты (тонкий, веб)
Норма

Форма выглядит одинаково во всех используемых клиентах

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

В веб-клиенте пропала прозрачность или сместилась вёрстка

Отладка и частые проблемы

Если рисунок добавлен, но не виден, первым делом проверьте, что свойство Картинка действительно заполнено — пустая картинка не вызывает ошибку, просто ничего не отображает. Второй шаг — проверить координаты: рисунок, расположенный за пределами выведенной области или с нулевой высотой/шириной, невидим. Третья причина — рисунок добавлен до вывода областей, и последующий Вывести() или ВставитьОбласть() сдвинул содержимое.

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

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

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

Можно ли вставить картинку в конкретную ячейку, а не поверх области?

Да, двумя способами. В макете — через свойство ячейки «Картинка», тогда изображение живёт внутри ячейки и масштабируется вместе с ней. Программно — через Рисунки.Добавить() с последующим Расположить() на область из одной ячейки: ТабДок.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки).

Как вывести разные картинки для разных строк табличной части?

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

Почему возникает ошибка «Недопустимое значение» при создании картинки?

Чаще всего в конструктор Новый Картинка() переданы данные, которые не являются изображением: пустое хранилище, текстовое значение, повреждённый файл или файл неподдерживаемого формата. Проверьте, что ХранилищеЗначения.Получить() возвращает двоичные данные, и что файл действительно является картинкой поддерживаемого формата.

Как вставить QR-код или штрихкод в печатную форму?

Штрихкод вставляется как рисунок типа ТипРисункаТабличногоДокумента.Штрихкод (или через макет с элементом управления «Штрихкод» в обычных формах). QR-код в конфигурациях на БСП генерируется функцией ГенерацияШтрихкода.ДанныеQRКода(), которая возвращает двоичные данные картинки — дальше она вставляется как обычное изображение.

Сохранится ли картинка при сохранении табличного документа в Excel или PDF?

Да, при сохранении через ТабДок.Записать() в форматы PDF и MXL изображения сохраняются. При выгрузке в Excel (формат XLSX) картинки также переносятся, но точное позиционирование может отличаться из-за особенностей преобразования ячеек — проверяйте результат, если файл предназначен для отправки контрагентам.

Как заменить картинку в уже сформированном табличном документе?

Обратитесь к рисунку по имени: ТабДок.Рисунки["Логотип"].Картинка = НоваяКартинка. Если рисунок не нужен — удалите его методом ТабДок.Рисунки.Удалить(Рисунок). Имена рисункам задавайте осмысленные сразу при добавлении, иначе найти нужный среди безымянных будет затруднительно.

Итог

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

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