При формировании прайс-листов, каталогов продукции или карточек товаров в платформе 1С 7.7 разработчики часто сталкиваются с задачей: необходимо вывести изображение товара слева, а справа расположить несколько строк с описанием и характеристиками (набором товарных позиций). При попытке объединить ячейки через объект ОбластьТаблицы и программно поместить туда графический объект возникает вопрос, какими методами платформы это реализуется.
Разберем архитектурные особенности табличного документа 1С 7.7, выясним причину ограничений и рассмотрим рабочие способы решения задачи.
Проанализируем базовый код, с которого обычно начинаются попытки решить задачу:
Процедура Сформировать()
Тб = СоздатьОбъект("Таблица");
Тб.ИсходнаяТаблица("Таблица");
Для к = 1 По 5 Цикл
Тб.ВывестиСекцию("Строка");
КонецЦикла;
ОблТаб = Тб.Область(1, 2, 5, 2);
ОблТаб.Объединить();
ОблТаб.ВертикальноеПоложение(3);
ОблТаб.ГоризонтальноеПоложение(3);
ОблТаб.РамкаОбвести(3, 3, 3, 3);
// Попытка вставить изображение в ОблТаб
Тб.ТолькоПросмотр(1);
Тб.Показать("Прайс", "");
КонецПроцедуры
В объектной модели 1С 7.7 объект ОбластьТаблицы, возвращаемый методом Тб.Область(...), управляет исключительно текстовыми свойствами, форматом отображения данных, рамками и геометрией ячеек. В платформе 1С 7.7 невозможно создать графический объект «с нуля» исключительно программным кодом без предварительного размещения в макете.
Графический объект типа Рисунок жестко привязывается к координатам ячеек той секции макета, в которой он был создан в режиме конфигуратора. Если секция не выводится целиком или перекрывается другими областями некорректно, объект может отображаться с искажениями либо не выводиться вовсе.
Рассмотрим стандартный штатный подход, позволяющий динамически подставлять нужное изображение в печатную форму:
Рисунок) и задаем ему желаемый размер.гфЗаполнитьКартинку(Тб.ТекущийОбъект, ПутьКФайлу).Посмотрим на реализацию функции обработки графического объекта в модуле:
Функция гфЗаполнитьКартинку(ОбъектРисунок, ПутьКФайлу)
Если ФС.СуществуетФайл(ПутьКФайлу) = 1 Тогда
ОбъектРисунок.Загрузить(ПутьКФайлу);
// Устанавливаем режим отображения:
// 1 - реальный размер, 2 - масштабирование с сохранением пропорций, 3 - растянуть
ОбъектРисунок.РежимРисования(2);
КонецЕсли;
Возврат "";
КонецФункции
При выводе секции методом Тб.ВывестиСекцию("СекцияСКартинкой") платформа вычисляет формулу, загружает файл по указанному пути и выполняет пропорциональное масштабирование в границах заранее размещенного рисунка.
Если количество строк справа от изображения переменно (например, в одной группе 3 товара, а в другой 10), жестко зафиксировать высоту секции в макете не удастся. Рассмотрим практический вариант обхода этого ограничения:
ВывестиСекцию().ОбластьТаблицы.Разберем пример реализации алгоритма:
Процедура СформироватьПрайс()
Тб = СоздатьОбъект("Таблица");
Тб.ИсходнаяТаблица("Таблица");
// Выводим секцию с изображением для группы товаров
Тб.ВывестиСекцию("ШапкаГруппы|КолонкаКартинки");
// Выводим строки состава группы
КоличествоСтрокВГруппе = 10;
Для к = 1 По КоличествоСтрокВГруппе Цикл
ОблТаб = Тб.Область(к, 2, к, 2);
ОблТаб.ВертикальноеПоложение(3);
ОблТаб.ГоризонтальноеПоложение(3);
ОблТаб.РамкаОбвести(3, 3, 3, 3);
ОблТаб.Текст = "Товарная позиция № " + Строка(к);
ОблТаб.ВысотаСтроки(15);
КонецЦикла;
Тб.ТолькоПросмотр(1);
Тб.Показать("Прайс", "");
КонецПроцедуры
При таком подходе можно программно управлять координатами рисунка с помощью метода ОбъектРисунок.Расположение(Лево, Верх, Право, Низ), корректируя нижнюю границу объекта в соответствии с суммарной высотой добавленных строк.
Если требуется формировать сложные многоколоночные каталоги с динамическим объединением произвольных диапазонов строк и гибким размещением графики, штатных возможностей объекта Таблица может быть недостаточно. В таких ситуациях применяются альтернативные подходы:
<table>, <tr>, <td>. Для объединения вертикальных ячеек под картинку используется стандартный атрибут rowspan, а само изображение вставляется тегом <img>. Это полностью исключает искажение пропорций и снимает ограничения на структуру документа.