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

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

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

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

Разберем суть проблемы

Посмотрим на типичный код начинающего (или даже опытного) разработчика, который пытается вывести изображение в макет:


Рисунок = ОбластьКартинка.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);            
Рисунок.Картинка = Новый Картинка(ВыборкаПоФайлу.ДвоичныеДанныеФайла.Получить());
ОбластьИзображения = ОбластьКартинка.ТекущаяОбласть;
Рисунок.Расположить(ОбластьИзображения);
                
ОбластьИзображения.АвтоВысотаСтроки = Ложь;
ОбластьИзображения.ВысотаСтроки = 200;
Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально;
// Отключение границ...

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

Решение 1: Изменение высоты строки после вывода в результирующий документ

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

В 1С есть удобные свойства ВысотаТаблицы и ШиринаТаблицы, которые позволяют точно позиционироваться на последней выведенной строке документа. Разберем по шагам готовый код решения:


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

// Проверяем, есть ли вообще картинка для вывода, чтобы не растягивать пустые строки
Если ЕстьКартинка Тогда
    // Обращаемся к последней выведенной строке результирующего документа
    ТекущаяСтрока = ТабДок.Область("R" + ТабДок.ВысотаТаблицы);    
    
    // Обязательно отключаем автоматический расчет высоты
    ТекущаяСтрока.АвтоВысотаСтроки = Ложь;
    
    // Устанавливаем требуемую высоту в пунктах
    ТекущаяСтрока.ВысотаСтроки = 50;
КонецЕсли;

Важное замечание: Рисунки в 1С добавляются поверх ячеек или привязываются к ним, но по умолчанию они не влияют на расчет высоты строки! Если свойство АвтоВысотаСтроки установлено в Истина, система попытается рассчитать высоту исключительно исходя из текстового содержимого ячейки. Если текста нет — строка сожмется. Именно поэтому установка свойства АвтоВысотаСтроки = Ложь является критически важной.

Решение 2: Использование отдельной области в макете

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

  1. Откроем макет печатной формы в конфигураторе.
  2. Создадим копию области строки таблицы. Назовем ее, например, СтрокаСКартинкой.
  3. Вручную растянем высоту этой строки в макете до нужных визуальных размеров.
  4. В коде добавим условие: если у товара есть картинка — получаем и выводим область СтрокаСКартинкой, если картинки нет — выводим стандартную (узкую) область СтрокаБезКартинки.

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

Правильная настройка свойств самой картинки

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

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

Разберем доступные варианты, которые могут помочь в разных ситуациях:

  1. РазмерКартинки.Пропорционально — картинка будет вписана в отведенную ячейку с сохранением пропорций сторон. Идеально для каталогов товаров, где изображения имеют разный формат.
  2. РазмерКартинки.АвтоРазмер — изображение будет выводиться в своем реальном размере (если ячейка больше), либо пропорционально сожмется (если ячейка меньше).
  3. РазмерКартинки.РеальныйРазмер — картинка выведется пиксель в пиксель. Если ячейка окажется меньше, излишняя часть просто обрежется. Редко подходит для динамических таблиц.

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

← На главную