В процессе разработки печатных форм (ВПФ) в 1С часто возникает ситуация, когда документ почти помещается на одну страницу, но из-за пары строк или небольшого «хвоста» системы выводит второй лист. Это не только неудобно для пользователя, но и неэкономно с точки зрения расхода бумаги. Разберем детально, как программно заставить 1С уместить всё содержимое в рамки одного листа, используя возможности встроенного языка.
Прежде чем прибегать к сложным алгоритмам, проанализируем стандартные возможности объекта ТабличныйДокумент. В платформе 1С предусмотрены встроенные механизмы, которые позволяют системе самостоятельно рассчитать необходимый коэффициент сжатия. Это наиболее «чистый» способ решения задачи, так как он задействует оптимизированные внутренние алгоритмы платформы.
Рассмотрим ключевые свойства, которые необходимо установить перед выводом документа на печать или отображением пользователю:
Истина заставляет систему автоматически подбирать масштаб так, чтобы документ поместился по ширине страницы. Однако для управления высотой этого может быть недостаточно.Применим эти настройки в коде:
ТабДок.АвтоМасштаб = Истина;
ТабДок.КоличествоСтраницПоШирине = 1;
ТабДок.КоличествоСтраницПоВысоте = 1;
Установив КоличествоСтраницПоВысоте = 1, мы даем платформе команду: «Сжимай текст до тех пор, пока он не влезет на один лист по вертикали». Это работает гораздо надежнее, чем простое включение АвтоМасштаб.
Иногда стандартные свойства КоличествоСтраницПоВысоте ведут себя непредсказуемо, особенно в старых релизах платформы или при очень сложном форматировании. В таких случаях мы можем реализовать собственный алгоритм «подгонки» масштаба. Выясним причину, почему это может понадобиться: например, если нам нужно контролировать минимальный порог читаемости текста (чтобы масштаб не упал ниже 40%).
Логика проста: мы проверяем количество страниц в документе и, если их больше одной, плавно уменьшаем свойство МасштабПечати. Посмотрим на пример реализации такого цикла:
// Устанавливаем начальный масштаб
ТабДок.МасштабПечати = 100;
// Цикл уменьшения масштаба до тех пор, пока страниц > 1
Для Ш = 1 По 25 Цикл // Ограничиваем количество итераций, чтобы избежать зависания
Если ТабДок.КоличествоСтраниц() > 1 Тогда
ТабДок.МасштабПечати = ТабДок.МасштабПечати - 2; // Уменьшаем на 2% за шаг
Иначе
Прервать; // Документ влез на одну страницу
КонецЕсли;
КонецЦикла;
Этот метод хорош тем, что вы визуально контролируете шаг уменьшения. Однако помните, что метод КоличествоСтраниц() является ресурсоемким, так как заставляет платформу выполнять фоновую верстку документа для расчета разбиения на листы.
Часто «лишние» три строчки на втором листе появляются не из-за масштаба, а из-за того, что вокруг данных зарезервировано слишком много пустого пространства. Проанализируем настройки полей. По умолчанию 1С оставляет довольно широкие отступы. Уменьшение полей может дать те самые критические 2-3 сантиметра пространства.
Разберем, как обнулить поля и размеры колонтитулов программно:
// Установка минимальных полей (в миллиметрах)
ТабДок.ПолеСлева = 5;
ТабДок.ПолеСправа = 5;
ТабДок.ПолеСверху = 5;
ТабДок.ПолеСнизу = 5;
// Убираем место под колонтитулы, если они не используются
ТабДок.РазмерКолонтитулаСверху = 0;
ТабДок.РазмерКолонтитулаСнизу = 0;
Важный момент: не рекомендуется устанавливать поля в 0, так как большинство принтеров имеют «мертвую зону» печати по краям листа, и часть информации может просто не пропечататься физически.
Если печатная форма формируется динамически (в цикле выводятся строки), мы можем контролировать заполнение страницы прямо в процессе формирования. Для этого используется метод ПроверитьВывод(). Это позволяет заранее понять, поместится ли следующая порция данных на лист.
Рассмотрим пример логики: если очередная область (например, «Подвал» документа) не влезает, мы можем принудительно уменьшить масштаб всего документа перед выводом этой последней области.
СписокОбластей = Новый Массив;
СписокОбластей.Добавить(ОбластьСтрока);
Если НЕ ТабДок.ПроверитьВывод(СписокОбластей) Тогда
// Область не влезает на текущую страницу
// Здесь можно либо уменьшить шрифт, либо включить АвтоМасштаб
ТабДок.АвтоМасштаб = Истина;
КонецЕсли;
ТабДок.Вывести(ОбластьСтрока);
Иногда проблема кроется в самом макете или невидимых символах. Проанализируем ситуацию, когда визуально данных мало, а страниц всё равно две. Проверьте следующие моменты:
ВывестиГоризонтальныйРазделительСтраниц(). Проверьте, не вызывается ли он случайно перед завершением формирования.Для достижения наилучшего результата мы рекомендуем комбинированный подход:
ТабДок.КоличествоСтраницПоВысоте = 1 и ТабДок.КоличествоСтраницПоШирине = 1.ТабДок.МасштабПечати < 60, возможно, стоит перевести страницу в ландшафтную ориентацию: ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;.Следуя этим шагам, вы обеспечите корректное и компактное размещение данных, что сделает работу пользователей с печатными формами гораздо более комфортной.