Начиная с версии платформы 1С:Предприятие 8.3.5, разработчикам стала доступна возможность внедрять графические элементы непосредственно в ячейку табличного документа через специализированные свойства, минуя создание отдельных объектов типа РисунокТабличногоДокумента. Однако при попытке программной установки изображения часто возникает ситуация, когда код отрабатывает без ошибок, но сама ячейка остается пустой. Проанализируем, почему это происходит и какими способами можно корректно вывести картинку.
Рассмотрим код, который часто приводит разработчиков в тупик:
// Ошибочный подход для уже сформированного документа:
ТабДок.ПолучитьОбласть(1, 1, 1, 1).ТекущаяОбласть.Картинка = БиблиотекаКартинок.ПометитьНаУдаление;
Выясним причину, по которой данный код не изменяет итоговый табличный документ. Метод ПолучитьОбласть() создает и возвращает совершенно новый независимый экземпляр табличного документа, содержащий лишь копию указанного диапазона ячеек. Присваивая картинку свойству ТекущаяОбласть.Картинка, мы меняем ячейку во временном объекте памяти, который нигде не отображается и сразу же уничтожается сборщиком мусора. Исходный табличный документ при этом остается нетронутым.
Для прямого обращения к ячейкам уже сформированного или редактируемого документа необходимо использовать метод Область(), возвращающий объект ОбластьЯчеекТабличногоДокумента, связанный напрямую с текущим документом:
// Корректная установка картинки напрямую в ячейку:
ТабДок.Область(1, 1, 1, 1).Картинка = БиблиотекаКартинок.ПометитьНаУдаление;
Обратите внимание: чтобы данный функционал работал штатно, режим совместимости конфигурации должен быть установлен не ниже версии 8.3.5.
Разберем по шагам, как адресно обратиться к нужной ячейке по номерам строк и колонок либо по ее имени и задать графическое изображение из библиотеки картинок или из двоичных данных.
Область().Картинка объект нужного типа.Посмотрим на практический пример кода:
// Установка картинки из стандартной библиотеки конфигурации
Ячейка = ТабличныйДокумент.Область("R2C3");
Ячейка.Картинка = БиблиотекаКартинок.ПометитьНаУдаление;
// Установка картинки, полученной из двоичных данных (например, из реквизита или базы данных)
ДвоичныеДанныеФото = КартинкаНоменклатуры.ПолучитьДвоичныеДанные();
Если ЗначениеЗаполнено(ДвоичныеДанныеФото) Тогда
ТабличныйДокумент.Область(5, 2, 5, 2).Картинка = Новый Картинка(ДвоичныеДанныеФото);
КонецЕсли;
Если требуется очистить ячейку от изображения, присвоим свойству значение Неопределено:
ТабличныйДокумент.Область(1, 1, 1, 1).Картинка = Неопределено;
Если табличный документ формируется классическим способом — построчным выводом секций из исходного макета, более удобным и наглядным решением будет использование штатного механизма Параметр картинки.
ОсновноеИзображение.Посмотрим, как выглядит программный код заполнения параметров секции:
Макет = ПолучитьМакет("Печать");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
// Заполняем текстовые параметры
ОбластьСтрока.Параметры.Номенклатура = ТекущаяСтрока.Номенклатура;
// Заполняем параметр картинки объектом типа Картинка
ОбластьСтрока.Параметры.ОсновноеИзображение = Новый Картинка(ТекущаяСтрока.ХранилищеКартинки.Получить());
// Выводим готовую секцию в итоговый табличный документ
ТабДок.Вывести(ОбластьСтрока);
Такой подход избавляет от необходимости жестко прописывать числовые координаты строк и колонок в программном модуле.
Нередко изображение после программного вывода отображается некорректно: сильно обрезается, искажается или перекрывает текстовое содержимое. Рассмотрим сопутствующие свойства объекта ОбластьЯчеекТабличногоДокумента, которые позволяют управлять внешним видом ячейки:
Авто, РеальныйРазмер, Растянуть, Масштабировать, АвтоРазмерБезУчетаМасштаба, РеальныйРазмерБезУчетаМасштаба. Для сохранения пропорций рекомендуется использовать Масштабировать.Слева, ПоЦентру, Справа и Сверху, ПоЦентру, Снизу соответственно).Вверху, Внизу, Слева, Справа), что позволяет одновременно выводить в одну ячейку и пиктограмму, и поясняющий текст без взаимного наложения.Проанализируем комплексный пример форматирования ячейки:
ОбластьЯчейки = ТабличныйДокумент.Область("R5C2");
ОбластьЯчейки.Картинка = БиблиотекаКартинок.Успешно;
ОбластьЯчейки.РазмерКартинки = РазмерКартинки.Масштабировать;
ОбластьЯчейки.ГоризонтальноеПоложениеКартинки = ГоризонтальноеПоложениеКартинки.Слева;
ОбластьЯчейки.ПоложениеТекстаОтносительноКартинки = ПоложениеТекстаОтносительноКартинки.Справа;
ОбластьЯчейки.Текст = "Операция выполнена успешно";
В конфигурациях с устаревшим режимом совместимости (ниже 8.3.5) или при необходимости свободного позиционирования поверх сетки ячеек применяется коллекция Рисунки табличного документа с привязкой к границам области методом Расположить():
ФигураМакета = БиблиотекаКартинок.СтатусГотов;
Рис = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рис.Картинка = ФигураМакета;
Рис.РазмерКартинки = РазмерКартинки.РеальныйРазмер;
Рис.Расположить(ТабДок.Область("R3C2"));
Однако если платформа и режим совместимости позволяют использовать свойство Картинка напрямую в объекте ОбластьЯчеекТабличногоДокумента, следует отдавать предпочтение именно ему: это существенно упрощает структуру документа и ускоряет его отрисовку в интерфейсе пользователя.