Как программно изменить масштаб и шрифт в печатной форме 1С, если она не помещается на страницу?

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

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

Определение количества выведенных строк через ВысотаТаблицы

Для решения задачи, поставленной автором темы, самым простым и эффективным способом является использование метода ВысотаТаблицы(). Этот метод объекта ТабличныйДокумент возвращает количество строк, которые фактически заполнены в документе на текущий момент. Проанализируем пример кода, который позволяет проверить размер документа перед его окончательным выводом или отправкой на печать:


// Сформируем документ
ТабДок = Новый ТабличныйДокумент;
// ... здесь идет код заполнения документа областями из макета ...

// Проверяем количество строк
Если ТабДок.ВысотаТаблицы() > 50 Тогда
    // Если строк больше 50, уменьшаем шрифт во всем документе
    ВсегоСтрок = ТабДок.ВысотаТаблицы();
    ВсегоКолонок = ТабДок.ШиринаТаблицы();
    
    // Обращаемся ко всей области документа
    ОбластьВесьДокумент = ТабДок.Область(1, 1, ВсегоСтрок, ВсегоКолонок);
    ОбластьВесьДокумент.Шрифт = Новый Шрифт(ОбластьВесьДокумент.Шрифт, , 7); // Устанавливаем размер 7
КонецЕсли;

Использование метода Область() позволяет нам не перебирать каждую ячейку в цикле, что значительно экономит ресурсы сервера и ускоряет формирование отчета. Мы просто указываем координаты от первой ячейки (1,1) до последней (высота и ширина таблицы) и меняем свойство Шрифт один раз для всего диапазона.

Использование механизма АвтоМасштаб

Если задача заключается не в строгом ограничении количества строк, а в том, чтобы документ просто красиво помещался по ширине страницы, разберем свойство АвтоМасштаб. Установив это свойство в значение Истина, мы поручаем платформе самостоятельно рассчитать коэффициент сжатия документа.

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

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

Профессиональный подход: методы ПроверитьВывод и КоличествоСтраниц

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

Разберем ситуацию, когда нам нужно гарантировать, что документ занимает ровно одну страницу. В этом нам поможет метод КоличествоСтраниц(). Посмотрим на алгоритм:

  1. Формируем документ в памяти.
  2. Вызываем метод КоличествоСтраниц().
  3. Если результат больше 1, программно уменьшаем свойство МасштабПечати.

// Проверяем количество страниц после формирования
Если ТабДок.КоличествоСтраниц() > 1 Тогда
    // Пробуем установить масштаб 90% вместо 100%
    ТабДок.МасштабПечати = 90;
    
    // Если все еще не влезает, можно уменьшить еще сильнее
    Если ТабДок.КоличествоСтраниц() > 1 Тогда
        ТабДок.МасштабПечати = 80;
    КонецЕсли;
КонецЕсли;

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

Дополнительные инструменты оптимизации пространства

Помимо манипуляций со шрифтом и масштабом, мы можем использовать следующие свойства объекта ТабличныйДокумент:

  1. Управление полями: Иногда уменьшение полей на 2-3 миллиметра позволяет уместить недостающие строки. Используйте свойства ПолеСверху, ПолеСнизу, ПолеСлева и ПолеСправа.
  2. Ориентация страницы: Если данных много по горизонтали, можно программно переключить документ: ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;.
  3. Автовысота строки: При уменьшении шрифта не забудьте убедиться, что для строк макета включено свойство АвтоВысотаСтроки. Если высота строк задана жестко, визуально документ не станет компактнее, даже если текст станет мелким.

Рассмотрим пример комплексной оптимизации, когда мы сначала пытаемся уменьшить поля, а затем переходим к масштабированию:


// Оптимизация полей для экономии места
ТабДок.ПолеСверху = 5; // 5 мм
ТабДок.ПолеСнизу = 5;
ТабДок.ПолеСлева = 10;
ТабДок.ПолеСправа = 5;

// Если все равно не влезает, применяем масштаб
Если Не ТабДок.ПроверитьВывод(МассивВыводимыхОбластей) Тогда
    ТабДок.АвтоМасштаб = Истина;
КонецЕсли;

Таким образом, комбинируя методы ВысотаТаблицы() для контроля объема данных и свойства МасштабПечати или Шрифт для визуальной корректировки, мы можем добиться идеального отображения печатной формы в любых условиях.

← На главную