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