При разработке печатных форм в 1С разработчики часто сталкиваются с неприятной ситуацией: в макете есть картинка, которая по высоте занимает несколько строк. При формировании табличного документа алгоритм просто заполняет лист, и если рисунок попадает на границу страницы, платформа безжалостно разрывает его на две части. Часть изображения остается на текущем листе, а остаток переносится на следующий. Проанализируем эту ситуацию и разберем по шагам несколько эффективных способов, как избежать такого поведения и добиться красивого вывода документа.
В платформе 1С заложена строгая концепция построения табличного документа: мы должны проверять, поместится ли блок информации на страницу, до того, как выведем его. Пытаться удалить уже выведенное (например, через ресурсоемкий метод УдалитьОбласть()) крайне не рекомендуется, так как это сильно замедляет работу и сдвигает координаты всей таблицы.
Рассмотрим правильный алгоритм решения проблемы с использованием метода ПроверитьВывод(). Этот метод позволяет платформе виртуально «прикинуть», поместится ли переданный массив областей на остаток текущей страницы.
Массив и добавьте в него полученную область.ПроверитьВывод() для вашего табличного документа, передав ему этот массив.Ложь (то есть область не влезает), программно выведите горизонтальный разделитель страниц.Посмотрим на пример реализации данного алгоритма в коде:
МассивОбластей = Новый Массив;
МассивОбластей.Добавить(ОбластьСКартинкой);
// Проверяем, поместится ли область на текущей странице
Если Не ТабДок.ПроверитьВывод(МассивОбластей) Тогда
// Если не помещается, принудительно начинаем новую страницу
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
// Выводим область
ТабДок.Вывести(ОбластьСКартинкой);
Важный нюанс: выясним особенность работы метода ПроверитьВывод(). Важно понимать, что этот метод работает на основе метрик текущего принтера, установленного в операционной системе по умолчанию. Если ваш код выполняется на стороне сервера, где не установлено ни одного принтера (даже виртуального), метод может вести себя непредсказуемо — возвращать всегда Истина, всегда Ложь или даже вызывать ошибку. Обязательно учитывайте этот момент при настройке серверного окружения.
Если вы не хотите усложнять программный код проверками, можно попытаться решить проблему на уровне визуальной настройки макета. Для областей-строк существует свойство ВместеСоСледующим.
Рассмотрим подробнее, как его применять. Если ваша картинка занимает, например, 5 объединенных по вертикали строк, вам нужно выделить первые 4 строки этой области и в свойствах установить флаг ВместеСоСледующим = Истина. Обратите внимание: на самую нижнюю (пятую) строку этот признак ставить не нужно, иначе она попытается "приклеиться" к следующему блоку данных в отчете, что может нарушить логику вывода.
Почему этот способ срабатывает не всегда? Разберем причину. Свойство ВместеСоСледующим отлично работает для обычного текста в ячейках. Однако картинка (объект РисунокТабличногоДокумента) технически располагается «поверх» сетки ячеек и привязывается к ним с помощью якорей. Если картинка растянута на несколько строк, а для этих строк в макете включено свойство «Автовысота», платформа при расчете разбиения страниц часто некорректно обрабатывает фактические габариты рисунка. Она игнорирует связку строк и разрывает изображение.
Проанализируем ситуацию, когда предыдущие методы не подходят или работают нестабильно из-за сложной структуры макета. Самым надежным и "железобетонным" решением в 1С является отказ от объединения множества строк по вертикали в пользу одной отдельной строки фиксированной высоты.
Сделайте следующее:
Если картинка будет лежать внутри одной высокой ячейки, алгоритмы 1С никогда ее не разорвут. Платформа воспринимает одну строку как неделимый элемент: если она не помещается на остатке листа, система гарантированно перенесет всю строку на следующий лист целиком.
Иногда разрывы происходят "на грани" — когда на страницу не влезает буквально пара миллиметров рисунка, и из-за этого он переносится или режется. Эту проблему можно решить без изменения макета и сложных проверок в коде, просто настроив параметры страницы табличного документа.
Перед тем как показать готовый документ пользователю, задайте параметры автомасштабирования. Используйте свойство АвтоМасштаб:
ТабДок.АвтоМасштаб = Истина;
Либо вы можете принудительно немного уменьшить масштаб вывода документа, задав свойству Масштаб значение меньше 100 (например, 90 или 95):
ТабДок.Масштаб = 95;
Это пропорционально сожмет весь табличный документ при печати, что часто позволяет уместить спорный блок с картинкой на одной странице и предотвратить нежелательный перенос на новый лист. Комбинируя эти подходы, вы сможете добиться идеального вывода любых печатных форм с изображениями.