При разработке печатных форм в 1С программисты часто сталкиваются с неприятной особенностью: когда в строке табличного документа включена автовысота (например, из-за длинного текста), помещенная в эту же строку картинка отказывается растягиваться вслед за ячейками. Она сохраняет свой исходный размер, заданный в конфигураторе, что портит визуальный вид документа. В этой статье мы подробно разберем, почему так происходит, и рассмотрим все доступные способы решения этой задачи — от настройки свойств до программного управления.
Прежде всего, проанализируем поведение платформы. Объект Рисунок в табличном документе 1С является графическим объектом, который «лежит» поверх сетки ячеек. Несмотря на то что мы можем визуально поместить его внутрь ячейки, он живет по своим правилам. Основная проблема заключается во взаимодействии свойства АвтовысотаСтроки и параметров масштабирования рисунка. Если для рисунка установлено свойство «Пропорционально», платформа пытается сохранить соотношение сторон, игнорируя динамическое расширение строки, вызванное соседними текстовыми ячейками.
Рассмотрим ситуацию, когда картинка просто исчезает или обрезается. Это происходит, если границы рисунка выходят за пределы выводимой области (секции). Выясним причину: при методе Вывести() 1С жестко ограничивает отрисовку графики координатами текущей секции. Если ваш рисунок хотя бы на один пиксель пересекает нижнюю границу области, он может быть полностью исключен из вывода или отображен некорректно.
Первым делом проверим настройки самого объекта Рисунок в макете. Разберем по шагам, какие параметры влияют на поведение картинки при изменении размеров сетки:
ТипРазмещения в значение ПеремещатьИИзменятьРазмесВместеСЯчейками. Это критически важный момент: если установлено «Не перемещать», картинка останется статичной.РазмерКартинки выберем вариант Растянуть. В отличие от варианта Пропорционально, этот режим заставит картинку заполнять всё отведенное ей пространство, даже если это приведет к искажению пропорций.Однако стоит учитывать, что даже эти настройки не всегда заставляют рисунок «подтягиваться» под автовысоту строки, так как автовысота рассчитывается в момент рендеринга текста, а размер рисунка часто фиксируется раньше.
Если нам нужно, чтобы картинка строго следовала за границами ячейки, проанализируем альтернативный подход — использование свойства ячейки, а не отдельного объекта. Это наиболее стабильный «безкодовый» метод.
Рассмотрим алгоритм действий:
Картинка и выберем нужный файл.РазмерКартинки (или PictureSize) установим значение Растянуть (Stretch).В этом случае картинка становится фоном ячейки. Поскольку фон неразрывно связан с границами ячейки, при срабатывании АвтовысотаСтроки из-за текста в этой или соседних ячейках, фон будет автоматически масштабироваться вместе с расширением строки. Это избавляет от необходимости писать сложный код для расчета координат. Для освоения базовых способов настройки макетов без доработки конфигурации можно использовать руководство по редактированию печатных форм в 1С.
Если использование фоновой картинки невозможно (например, нужно выводить разные картинки динамически или сохранять сложную структуру наложения), придется прибегнуть к программному методу. Основная сложность здесь в том, что метод ВысотаСтроки для строки с автовысотой часто возвращает 0 до тех пор, пока документ не отображен пользователю.
Рассмотрим, как можно обойти это ограничение. Мы можем использовать метод ПроверитьВывод() или предварительный расчет. Посмотрим на пример кода, который устанавливает размер картинки исходя из реальных данных:
// Получаем область из макета
ОбластьСекция = Макет.ПолучитьОбласть("СтрокаСКартинкой");
// Заполняем параметры области (текст, который растянет строку)
ОбластьСекция.Параметры.ТекстОписания = "Очень длинный текст, который должен увеличить высоту строки";
// Если мы знаем примерную высоту в пунктах на одну строку текста
КоличествоСтрок = СтрЧислоСтрок(ОбластьСекция.Параметры.ТекстОписания);
РасчетнаяВысота = Макс(40, КоличествоСтрок * 12); // 40 - минимальная высота
// Обращаемся к рисунку в области по имени
РисунокКартинка = ОбластьСекция.Рисунки.Логотип;
РисунокКартинка.Высота = РасчетнаяВысота;
// Теперь выводим подготовленную область
ТабДок.Вывести(ОбластьСекция);
Разберем, что здесь происходит. Мы заранее подготавливаем объект Рисунок внутри области до того, как она попадет в итоговый табличный документ. Мы явно задаем Рисунок.Высота, основываясь на объеме данных. Если данные динамические, можно использовать вспомогательный (невидимый) ТабличныйДокумент, вывести секцию туда, программно замерить высоту и применить её к основному документу.
Проанализируем ситуацию с качеством изображения. При растягивании растровых картинок (PNG, JPG) под большую высоту строки неизбежно появление пикселизации. Для современных версий платформы 1С (начиная с 8.3.10) лучшим решением будет использование формата SVG.
Преимущества SVG в данном контексте:
ВысотаСтроки.Посмотрим, как это работает на практике: вы загружаете SVG-логотип в макет и устанавливаете размер Растянуть. Независимо от того, насколько сильно раздуется строка из-за комментариев или номенклатуры, логотип останется идеально четким и заполнит всю высоту.
Выясним, на что еще стоит обратить внимание, чтобы избежать «пропадания» картинок:
Границы и отступы: Никогда не прижимайте границы рисунка вплотную к границам секции макета. Рекомендуется оставлять зазор в 1-2 пикселя. Если нижняя граница рисунка совпадает с границей секции, при выводе может возникнуть ошибка округления координат, и 1С решит, что рисунок не помещается в область.
Свойство «Выводить на печать»: Убедитесь, что в свойствах рисунка стоит галочка ВыводитьНаПечать. Иногда при программном копировании областей это свойство может сбрасываться.
Метод «Рисунки.Добавить()»: Если вы добавляете картинку программно через ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка), обязательно привязывайте её к конкретному адресу ячеек через метод УстановитьПривязку(). Это позволит рисунку понимать, за какими ячейками ему «следовать» при изменении их размеров. Для изучения практической реализации вывода графических объектов в табличные документы можно использовать пример внешней печатной формы с печатью и подписями на БСП.
Подводя итог, можно сказать, что автоматического и идеального решения «в один клик» для объекта Рисунок и Автовысоты не существует со времен версии 7.7. Однако сочетание правильных свойств размещения, использование фоновых картинок ячеек или аккуратный программный расчет позволяют добиться желаемого результата в любых отчетах и печатных формах.