При программном формировании печатных форм в 1С разработчики часто сталкиваются с необходимостью вывода изображений товаров, логотипов или схем в ячейки таблицы. Возникает распространенная проблема: картинка добавляется в табличный документ, но высота строки не увеличивается автоматически. Если попытаться жестко задать свойство ВысотаСтроки перед выводом области макета, результат часто остается нулевым — строка остается узкой, а изображение в ней становится нечитаемым.
Рассмотрим подробнее, почему возникает эта ситуация, проанализируем частые ошибки при работе с областями табличного документа и разберем по шагам рабочие методы решения этой задачи.
Посмотрим на типичный код начинающего (или даже опытного) разработчика, который пытается вывести изображение в макет:
Рисунок = ОбластьКартинка.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = Новый Картинка(ВыборкаПоФайлу.ДвоичныеДанныеФайла.Получить());
ОбластьИзображения = ОбластьКартинка.ТекущаяОбласть;
Рисунок.Расположить(ОбластьИзображения);
ОбластьИзображения.АвтоВысотаСтроки = Ложь;
ОбластьИзображения.ВысотаСтроки = 200;
Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально;
// Отключение границ...
В чем здесь кроется ошибка? Выясним причину. Проблема заключается в том, что разработчик пытается растянуть строку в самом макете (исходной области) до того, как эта область будет присоединена (или выведена) в итоговый табличный документ. Команда вида Параметры.ТабДокумент.Присоединить(ОбластьКартинка) берет область, но настройки высоты строки могут сброситься или не перенестись должным образом на новую строку результирующего документа. Растягивать нужно саму строку готовой таблицы, а не область картинки из макета.
Проанализируем самый надежный и правильный подход программного управления высотой. Нам необходимо сначала вывести сформированную область в наш итоговый табличный документ, а затем обратиться к добавленной строке и задать ей нужные размеры.
В 1С есть удобные свойства ВысотаТаблицы и ШиринаТаблицы, которые позволяют точно позиционироваться на последней выведенной строке документа. Разберем по шагам готовый код решения:
// Сначала выводим область с картинкой в наш итоговый табличный документ
ТабДок.Вывести(ОбластьКартинка);
// Проверяем, есть ли вообще картинка для вывода, чтобы не растягивать пустые строки
Если ЕстьКартинка Тогда
// Обращаемся к последней выведенной строке результирующего документа
ТекущаяСтрока = ТабДок.Область("R" + ТабДок.ВысотаТаблицы);
// Обязательно отключаем автоматический расчет высоты
ТекущаяСтрока.АвтоВысотаСтроки = Ложь;
// Устанавливаем требуемую высоту в пунктах
ТекущаяСтрока.ВысотаСтроки = 50;
КонецЕсли;
Важное замечание: Рисунки в 1С добавляются поверх ячеек или привязываются к ним, но по умолчанию они не влияют на расчет высоты строки! Если свойство АвтоВысотаСтроки установлено в Истина, система попытается рассчитать высоту исключительно исходя из текстового содержимого ячейки. Если текста нет — строка сожмется. Именно поэтому установка свойства АвтоВысотаСтроки = Ложь является критически важной.
Рассмотрим альтернативный вариант, который требует меньше программного кода. Если мы заранее знаем, что у нас будут выводиться строки с картинками стандартного, заранее определенного размера, мы можем подготовить макет.
СтрокаСКартинкой.СтрокаСКартинкой, если картинки нет — выводим стандартную (узкую) область СтрокаБезКартинки.Этот метод хорош тем, что избавляет нас от поиска "магических чисел" высоты в коде, и визуально в макете сразу понятно, как будет выглядеть печатная форма.
Чтобы изображение корректно вписалось в принудительно растянутую строку, посмотрим на свойства системного перечисления РазмерКартинки. Для объекта РисунокТабличногоДокумента необходимо задать правильный режим отображения:
Рисунок.РазмерКартинки = РазмерКартинки.Пропорционально;
Разберем доступные варианты, которые могут помочь в разных ситуациях:
РазмерКартинки.Пропорционально — картинка будет вписана в отведенную ячейку с сохранением пропорций сторон. Идеально для каталогов товаров, где изображения имеют разный формат.РазмерКартинки.АвтоРазмер — изображение будет выводиться в своем реальном размере (если ячейка больше), либо пропорционально сожмется (если ячейка меньше).РазмерКартинки.РеальныйРазмер — картинка выведется пиксель в пиксель. Если ячейка окажется меньше, излишняя часть просто обрежется. Редко подходит для динамических таблиц.Применяя описанные методы, вы сможете гибко управлять высотой строк в табличных документах 1С и выводить качественные печатные формы без искажения графических элементов. При разработке таких решений пригодится шаблон внешней печатной формы для БСП 3.1.10.