При разработке печатных форм в системе 1С:Предприятие часто возникает ситуация, когда сформированный документ лишь немного не умещается на одну страницу или выходит за рамки допустимого количества строк. В таких случаях программисту необходимо динамически управлять параметрами вывода: уменьшать шрифт, изменять масштаб или корректировать поля. Рассмотрим подробнее, как реализовать этот функционал, используя встроенные инструменты платформы.
Для решения задачи, поставленной автором темы, самым простым и эффективным способом является использование метода ВысотаТаблицы(). Этот метод объекта ТабличныйДокумент возвращает количество строк, которые фактически заполнены в документе на текущий момент. Проанализируем пример кода, который позволяет проверить размер документа перед его окончательным выводом или отправкой на печать:
// Сформируем документ
ТабДок = Новый ТабличныйДокумент;
// ... здесь идет код заполнения документа областями из макета ...
// Проверяем количество строк
Если ТабДок.ВысотаТаблицы() > 50 Тогда
// Если строк больше 50, уменьшаем шрифт во всем документе
ВсегоСтрок = ТабДок.ВысотаТаблицы();
ВсегоКолонок = ТабДок.ШиринаТаблицы();
// Обращаемся ко всей области документа
ОбластьВесьДокумент = ТабДок.Область(1, 1, ВсегоСтрок, ВсегоКолонок);
ОбластьВесьДокумент.Шрифт = Новый Шрифт(ОбластьВесьДокумент.Шрифт, , 7); // Устанавливаем размер 7
КонецЕсли;
Использование метода Область() позволяет нам не перебирать каждую ячейку в цикле, что значительно экономит ресурсы сервера и ускоряет формирование отчета. Мы просто указываем координаты от первой ячейки (1,1) до последней (высота и ширина таблицы) и меняем свойство Шрифт один раз для всего диапазона.
Если задача заключается не в строгом ограничении количества строк, а в том, чтобы документ просто красиво помещался по ширине страницы, разберем свойство АвтоМасштаб. Установив это свойство в значение Истина, мы поручаем платформе самостоятельно рассчитать коэффициент сжатия документа.
Важно понимать: АвтоМасштаб ориентируется в первую очередь на ширину страницы. Если ваш документ слишком длинный, он может быть разбит на несколько листов, но по ширине он всегда будет вписан в границы одного листа.
ТабДок.АвтоМасштаб = Истина;
Для более тонкой настройки вывода, когда нужно понять, уместится ли конкретная секция макета на текущую страницу, мы используем метод ПроверитьВывод(). Это позволяет реализовать сложную логику: например, если следующая строка не влезает на лист, мы можем заранее уменьшить масштаб или перенести вывод на новую страницу с повтором заголовка.
Разберем ситуацию, когда нам нужно гарантировать, что документ занимает ровно одну страницу. В этом нам поможет метод КоличествоСтраниц(). Посмотрим на алгоритм:
КоличествоСтраниц().МасштабПечати.
// Проверяем количество страниц после формирования
Если ТабДок.КоличествоСтраниц() > 1 Тогда
// Пробуем установить масштаб 90% вместо 100%
ТабДок.МасштабПечати = 90;
// Если все еще не влезает, можно уменьшить еще сильнее
Если ТабДок.КоличествоСтраниц() > 1 Тогда
ТабДок.МасштабПечати = 80;
КонецЕсли;
КонецЕсли;
Выясним причину, почему методы ПроверитьВывод и КоличествоСтраниц иногда могут работать некорректно. Эти функции напрямую зависят от настроек принтера, установленного в системе по умолчанию. Если на сервере 1С не установлен принтер или его параметры (размер бумаги, поля) отличаются от тех, что будут у пользователя, результат расчета может быть неточным. Проанализируйте настройки печати перед использованием этих методов в промышленном коде.
Помимо манипуляций со шрифтом и масштабом, мы можем использовать следующие свойства объекта ТабличныйДокумент:
ПолеСверху, ПолеСнизу, ПолеСлева и ПолеСправа.ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;.АвтоВысотаСтроки. Если высота строк задана жестко, визуально документ не станет компактнее, даже если текст станет мелким.Рассмотрим пример комплексной оптимизации, когда мы сначала пытаемся уменьшить поля, а затем переходим к масштабированию:
// Оптимизация полей для экономии места
ТабДок.ПолеСверху = 5; // 5 мм
ТабДок.ПолеСнизу = 5;
ТабДок.ПолеСлева = 10;
ТабДок.ПолеСправа = 5;
// Если все равно не влезает, применяем масштаб
Если Не ТабДок.ПроверитьВывод(МассивВыводимыхОбластей) Тогда
ТабДок.АвтоМасштаб = Истина;
КонецЕсли;
Таким образом, комбинируя методы ВысотаТаблицы() для контроля объема данных и свойства МасштабПечати или Шрифт для визуальной корректировки, мы можем добиться идеального отображения печатной формы в любых условиях.