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

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

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

Разбор типичной ошибки: разница между методами Область и ПолучитьОбласть

Рассмотрим код, который часто приводит разработчиков в тупик:


// Ошибочный подход для уже сформированного документа:
ТабДок.ПолучитьОбласть(1, 1, 1, 1).ТекущаяОбласть.Картинка = БиблиотекаКартинок.ПометитьНаУдаление;

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

Для прямого обращения к ячейкам уже сформированного или редактируемого документа необходимо использовать метод Область(), возвращающий объект ОбластьЯчеекТабличногоДокумента, связанный напрямую с текущим документом:


// Корректная установка картинки напрямую в ячейку:
ТабДок.Область(1, 1, 1, 1).Картинка = БиблиотекаКартинок.ПометитьНаУдаление;

Обратите внимание: чтобы данный функционал работал штатно, режим совместимости конфигурации должен быть установлен не ниже версии 8.3.5.

Способ 1. Установка картинки напрямую через метод Область

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

  1. Определяем координаты целевой ячейки (номер первой строки, первой колонки, последней строки, последней колонки).
  2. Получаем область ячеек через метод Область().
  3. Присваиваем свойству Картинка объект нужного типа.

Посмотрим на практический пример кода:


// Установка картинки из стандартной библиотеки конфигурации
Ячейка = ТабличныйДокумент.Область("R2C3");
Ячейка.Картинка = БиблиотекаКартинок.ПометитьНаУдаление;

// Установка картинки, полученной из двоичных данных (например, из реквизита или базы данных)
ДвоичныеДанныеФото = КартинкаНоменклатуры.ПолучитьДвоичныеДанные();
Если ЗначениеЗаполнено(ДвоичныеДанныеФото) Тогда
    ТабличныйДокумент.Область(5, 2, 5, 2).Картинка = Новый Картинка(ДвоичныеДанныеФото);
КонецЕсли;

Если требуется очистить ячейку от изображения, присвоим свойству значение Неопределено:

ТабличныйДокумент.Область(1, 1, 1, 1).Картинка = Неопределено;

Способ 2. Вывод через параметры макета (Параметр картинки)

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

  1. Откроем макет печатной формы в конфигураторе и выделим требуемую ячейку.
  2. В палитре свойств найдем свойство Параметр картинки (не путать с обычным параметром для текста).
  3. Зададим имя параметра, например, ОсновноеИзображение.
  4. В коде формирования отчета передадим значение в параметры полученной секции перед выводом в результирующий документ.

Посмотрим, как выглядит программный код заполнения параметров секции:


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

// Заполняем текстовые параметры
ОбластьСтрока.Параметры.Номенклатура = ТекущаяСтрока.Номенклатура;

// Заполняем параметр картинки объектом типа Картинка
ОбластьСтрока.Параметры.ОсновноеИзображение = Новый Картинка(ТекущаяСтрока.ХранилищеКартинки.Получить());

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

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

Настройка отображения и позиционирования картинки в ячейке

Нередко изображение после программного вывода отображается некорректно: сильно обрезается, искажается или перекрывает текстовое содержимое. Рассмотрим сопутствующие свойства объекта ОбластьЯчеекТабличногоДокумента, которые позволяют управлять внешним видом ячейки:

  1. РазмерКартинки — управляет масштабированием изображения внутри границ ячейки. Принимает системные значения: Авто, РеальныйРазмер, Растянуть, Масштабировать, АвтоРазмерБезУчетаМасштаба, РеальныйРазмерБезУчетаМасштаба. Для сохранения пропорций рекомендуется использовать Масштабировать.
  2. ГоризонтальноеПоложениеКартинки и ВертикальноеПоложениеКартинки — определяют выравнивание (Слева, ПоЦентру, Справа и Сверху, ПоЦентру, Снизу соответственно).
  3. ПоложениеТекстаОтносительноКартинки — задает размещение надписи (Вверху, Внизу, Слева, Справа), что позволяет одновременно выводить в одну ячейку и пиктограмму, и поясняющий текст без взаимного наложения.

Проанализируем комплексный пример форматирования ячейки:


ОбластьЯчейки = ТабличныйДокумент.Область("R5C2");
ОбластьЯчейки.Картинка = БиблиотекаКартинок.Успешно;
ОбластьЯчейки.РазмерКартинки = РазмерКартинки.Масштабировать;
ОбластьЯчейки.ГоризонтальноеПоложениеКартинки = ГоризонтальноеПоложениеКартинки.Слева;
ОбластьЯчейки.ПоложениеТекстаОтносительноКартинки = ПоложениеТекстаОтносительноКартинки.Справа;
ОбластьЯчейки.Текст = "Операция выполнена успешно";

Способ 3. Использование коллекции Рисунки (классический альтернативный вариант)

В конфигурациях с устаревшим режимом совместимости (ниже 8.3.5) или при необходимости свободного позиционирования поверх сетки ячеек применяется коллекция Рисунки табличного документа с привязкой к границам области методом Расположить():


ФигураМакета = БиблиотекаКартинок.СтатусГотов;

Рис = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рис.Картинка = ФигураМакета;
Рис.РазмерКартинки = РазмерКартинки.РеальныйРазмер;
Рис.Расположить(ТабДок.Область("R3C2"));

Однако если платформа и режим совместимости позволяют использовать свойство Картинка напрямую в объекте ОбластьЯчеекТабличногоДокумента, следует отдавать предпочтение именно ему: это существенно упрощает структуру документа и ускоряет его отрисовку в интерфейсе пользователя.

← На главную