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

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Разберем архитектурные особенности табличного документа 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. Вставляем в эту область графический элемент (объект Рисунок) и задаем ему желаемый размер.
  4. В свойствах рисунка в поле формулы прописываем вызов функции модуля отчета или обработки, передавая ссылку на текущий объект и путь к файлу: гфЗаполнитьКартинку(Тб.ТекущийОбъект, ПутьКФайлу).

Посмотрим на реализацию функции обработки графического объекта в модуле:


Функция гфЗаполнитьКартинку(ОбъектРисунок, ПутьКФайлу)
    Если ФС.СуществуетФайл(ПутьКФайлу) = 1 Тогда
        ОбъектРисунок.Загрузить(ПутьКФайлу);
        // Устанавливаем режим отображения:
        // 1 - реальный размер, 2 - масштабирование с сохранением пропорций, 3 - растянуть
        ОбъектРисунок.РежимРисования(2);
    КонецЕсли;
    Возврат "";
КонецФункции

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

Способ 2. Комбинированный вывод секций и программное форматирование высоты

Если количество строк справа от изображения переменно (например, в одной группе 3 товара, а в другой 10), жестко зафиксировать высоту секции в макете не удастся. Рассмотрим практический вариант обхода этого ограничения:

  1. В макете создается базовая секция с изображением минимальной высоты.
  2. Выводится секция-заголовок или блок с изображением через ВывестиСекцию().
  3. Далее в цикле выводятся строки товарных позиций.
  4. Для результирующей области программно настраиваются параметры ячеек и высота строк через методы объекта ОбластьТаблицы.

Разберем пример реализации алгоритма:


Процедура СформироватьПрайс()
    Тб = СоздатьОбъект("Таблица");
    Тб.ИсходнаяТаблица("Таблица");
    
    // Выводим секцию с изображением для группы товаров
    Тб.ВывестиСекцию("ШапкаГруппы|КолонкаКартинки");
    
    // Выводим строки состава группы
    КоличествоСтрокВГруппе = 10;
    Для к = 1 По КоличествоСтрокВГруппе Цикл
        ОблТаб = Тб.Область(к, 2, к, 2);
        ОблТаб.ВертикальноеПоложение(3);
        ОблТаб.ГоризонтальноеПоложение(3);
        ОблТаб.РамкаОбвести(3, 3, 3, 3);
        ОблТаб.Текст = "Товарная позиция № " + Строка(к);
        ОблТаб.ВысотаСтроки(15);
    КонецЦикла;
    
    Тб.ТолькоПросмотр(1);
    Тб.Показать("Прайс", "");
КонецПроцедуры

При таком подходе можно программно управлять координатами рисунка с помощью метода ОбъектРисунок.Расположение(Лево, Верх, Право, Низ), корректируя нижнюю границу объекта в соответствии с суммарной высотой добавленных строк.

Способ 3. Использование альтернативных механизмов вывода

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

  1. Генерация документа в формате HTML. Формируется текстовый файл с разметкой HTML, где таблицы строятся с помощью тегов <table>, <tr>, <td>. Для объединения вертикальных ячеек под картинку используется стандартный атрибут rowspan, а само изображение вставляется тегом <img>. Это полностью исключает искажение пропорций и снимает ограничения на структуру документа.
  2. Внешние компоненты и объектные расширения. Использование специализированных библиотек для работы с табличными документами в 1С 7.7 позволяет программно вставлять и удалять строки в готовом документе с автоматическим пересчетом и растяжением привязанных графических объектов.
← На главную