Как избежать разрыва картинки между страницами в макете 1С?

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

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

Способ 1: Проверка вывода документа перед вставкой области

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

Рассмотрим правильный алгоритм решения проблемы с использованием метода ПроверитьВывод(). Этот метод позволяет платформе виртуально «прикинуть», поместится ли переданный массив областей на остаток текущей страницы.

  1. Получите область макета с картинкой из макета.
  2. Создайте объект Массив и добавьте в него полученную область.
  3. Вызовите метод ПроверитьВывод() для вашего табличного документа, передав ему этот массив.
  4. Если метод возвращает Ложь (то есть область не влезает), программно выведите горизонтальный разделитель страниц.
  5. После этого выведите саму область в табличный документ.

Посмотрим на пример реализации данного алгоритма в коде:


МассивОбластей = Новый Массив;
МассивОбластей.Добавить(ОбластьСКартинкой);

// Проверяем, поместится ли область на текущей странице
Если Не ТабДок.ПроверитьВывод(МассивОбластей) Тогда
    // Если не помещается, принудительно начинаем новую страницу
    ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;

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

Важный нюанс: выясним особенность работы метода ПроверитьВывод(). Важно понимать, что этот метод работает на основе метрик текущего принтера, установленного в операционной системе по умолчанию. Если ваш код выполняется на стороне сервера, где не установлено ни одного принтера (даже виртуального), метод может вести себя непредсказуемо — возвращать всегда Истина, всегда Ложь или даже вызывать ошибку. Обязательно учитывайте этот момент при настройке серверного окружения.

Способ 2: Использование свойства "Вместе со следующим"

Если вы не хотите усложнять программный код проверками, можно попытаться решить проблему на уровне визуальной настройки макета. Для областей-строк существует свойство ВместеСоСледующим.

Рассмотрим подробнее, как его применять. Если ваша картинка занимает, например, 5 объединенных по вертикали строк, вам нужно выделить первые 4 строки этой области и в свойствах установить флаг ВместеСоСледующим = Истина. Обратите внимание: на самую нижнюю (пятую) строку этот признак ставить не нужно, иначе она попытается "приклеиться" к следующему блоку данных в отчете, что может нарушить логику вывода.

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

Способ 3: Альтернативная верстка (строка фиксированной высоты)

Проанализируем ситуацию, когда предыдущие методы не подходят или работают нестабильно из-за сложной структуры макета. Самым надежным и "железобетонным" решением в 1С является отказ от объединения множества строк по вертикали в пользу одной отдельной строки фиксированной высоты.

Сделайте следующее:

  1. Выделите под картинку всего одну строку в макете.
  2. Растяните эту строку по высоте так, чтобы картинка полностью в нее помещалась.
  3. Отключите для этой строки свойство автовысоты.

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

Способ 4: Настройки масштабирования страницы

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

Перед тем как показать готовый документ пользователю, задайте параметры автомасштабирования. Используйте свойство АвтоМасштаб:

ТабДок.АвтоМасштаб = Истина;

Либо вы можете принудительно немного уменьшить масштаб вывода документа, задав свойству Масштаб значение меньше 100 (например, 90 или 95):

ТабДок.Масштаб = 95;

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

← На главную