При формировании печатных форм и отчетов разработчики часто сталкиваются с ситуацией, когда документ почти помещается на одну страницу А4, но буквально две-три завершающие строки переносятся на второй лист. Включение стандартной опции АвтоМасштаб = Истина в таких случаях не помогает: документ действительно сжимается по ширине листа, однако по высоте платформа продолжает делить его на несколько страниц. Разберем причины такого поведения платформы и подробно рассмотрим надежные способы принудительно уместить формируемый табличный документ ровно на одну страницу.
Проанализируем механику работы платформы 1С:Предприятие при подготовке табличного документа к выводу на печать. Свойство АвтоМасштаб объекта ТабличныйДокумент отвечает исключительно за пропорциональное сжатие документа по ширине печатной области листа. Если таблица не влезает в страницу вертикально, платформа автоматически рассчитывает высоту строк и переносит излишек на следующую страницу. Принудительно уменьшать высоту содержимого под размер листа АвтоМасштаб не умеет.
Кроме того, свойства АвтоМасштаб и МасштабПечати являются взаимоисключающими: пока у документа установлено значение ТабДок.АвтоМасштаб = Истина;, любое ручное задание процента масштабирования через свойство МасштабПечати платформой полностью игнорируется.
Первое и наиболее простое действие, позволяющее высвободить дополнительное вертикальное пространство на листе без потери читаемости шрифта, — корректировка служебных областей страницы. По умолчанию у табличного документа заданы отступы по краям листа, а также зарезервировано место под верхний и нижний колонтитулы (даже если сами колонтитулы пусты).
Разберем по шагам, как программно освободить место в формируемом объекте ТабличныйДокумент:
ПолеСверху и ПолеСнизу.Посмотрим на пример кода, который применяется непосредственно перед формированием или перед выводом документа пользователю:
// Уменьшаем поля страницы (значения задаются в миллиметрах)
ТабДок.ПолеСверху = 5;
ТабДок.ПолеСнизу = 5;
ТабДок.ПолеСлева = 10;
ТабДок.ПолеСправа = 5;
// Отключаем резервирование пространства под колонтитулы
ТабДок.ВерхнийКолонтитул.Выводить = Ложь;
ТабДок.НижнийКолонтитул.Выводить = Ложь;
ТабДок.РазмерКолонтитулаСверху = 0;
ТабДок.РазмерКолонтитулаСнизу = 0;
Если уменьшения полей оказалось недостаточно и табличная часть содержит много строк (например, от 50 до 60), эффективным решением является программный расчет масштаба. Мы отключаем автоподбор по ширине и плавно снижаем общий процент печати документа до тех пор, пока количество страниц не станет равным единице.
Выясним логику реализации данного алгоритма:
ТабДок.АвтоМасштаб = Ложь;.МасштабПечати = 100;.ТабДок.КоличествоСтраниц(). Если документ занимает больше одной страницы, уменьшаем масштаб на шаг в несколько процентов.Посмотрим на практический пример программного цикла:
// Отключаем автомасштаб, чтобы включить ручное управление
ТабДок.АвтоМасштаб = Ложь;
ТабДок.МасштабПечати = 100;
// Уменьшаем масштаб с шагом 2%, пока документ не уместится на 1 лист
Пока ТабДок.КоличествоСтраниц() > 1 И ТабДок.МасштабПечати > 65 Цикл
ТабДок.МасштабПечати = ТабДок.МасштабПечати - 2;
КонецЦикла;
Важное платформенное ограничение: Метод КоличествоСтраниц() для расчета разбивки документа обращается к драйверу принтера, назначенного в операционной системе по умолчанию. Если данный код выполняется в серверном контексте под управлением Linux без настроенного виртуального или локального принтера, вызов метода может вызвать ошибку или работать с существенными задержками. В таком случае подбор масштаба рекомендуется выполнять на клиенте перед непосредственным открытием формы или предварительно фиксировать проверенный масштаб (например, 85-90%) без использования динамического цикла.
Помимо общего масштабирования страницы, существенный резерв высоты скрыт в оформлении самого макета печатной формы:
Переносить, длинные наименования могут увеличивать высоту отдельной строки в два-три раза. Проанализируем содержимое: если перенос строк не является строгим требованием, измените свойство на Обрезать или Авто, чтобы исключить паразитное раздувание таблицы по вертикали.КонецСтраницы, а также убедитесь, что в алгоритме формирования не вызывается метод ВывестиГоризонтальныйРазделительСтраниц().Часто возникает ситуация: разработчик внес изменения в поля или масштаб, но у конкретного пользователя печатная форма продолжает разбиваться на две страницы. Причина заключается в свойствах ИмяПараметровПечати или КлючПараметровПечати табличного документа.
Если это свойство заполнено, платформа сохраняет индивидуальные настройки печати пользователя (поля, ориентацию, масштаб), примененные им в диалоге предварительного просмотра. При повторном формировании сохраненные пользовательские настройки переопределяют программные инструкции. Чтобы принудительно обновить настройки, измените строковый идентификатор в свойстве ИмяПараметровПечати или очистите его перед выводом документа.