Как уместить печатную форму на одном листе А4 в 1С 8.3?

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

При формировании печатных форм и отчетов разработчики часто сталкиваются с ситуацией, когда документ почти помещается на одну страницу А4, но буквально две-три завершающие строки переносятся на второй лист. Включение стандартной опции АвтоМасштаб = Истина в таких случаях не помогает: документ действительно сжимается по ширине листа, однако по высоте платформа продолжает делить его на несколько страниц. Разберем причины такого поведения платформы и подробно рассмотрим надежные способы принудительно уместить формируемый табличный документ ровно на одну страницу.

Почему свойство АвтоМасштаб не решает проблему переноса строк

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

Кроме того, свойства АвтоМасштаб и МасштабПечати являются взаимоисключающими: пока у документа установлено значение ТабДок.АвтоМасштаб = Истина;, любое ручное задание процента масштабирования через свойство МасштабПечати платформой полностью игнорируется.

Способ 1. Уменьшение полей и отключение колонтитулов

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

Разберем по шагам, как программно освободить место в формируемом объекте ТабличныйДокумент:

  1. Уменьшим физические размеры верхнего и нижнего полей документа в миллиметрах через свойства ПолеСверху и ПолеСнизу.
  2. Полностью отключим вывод колонтитулов и сбросим их высоту до нуля, чтобы платформа не бронировала под них строки.

Посмотрим на пример кода, который применяется непосредственно перед формированием или перед выводом документа пользователю:


// Уменьшаем поля страницы (значения задаются в миллиметрах)
ТабДок.ПолеСверху = 5;
ТабДок.ПолеСнизу = 5;
ТабДок.ПолеСлева = 10;
ТабДок.ПолеСправа = 5;

// Отключаем резервирование пространства под колонтитулы
ТабДок.ВерхнийКолонтитул.Выводить = Ложь;
ТабДок.НижнийКолонтитул.Выводить = Ложь;
ТабДок.РазмерКолонтитулаСверху = 0;
ТабДок.РазмерКолонтитулаСнизу = 0;

Способ 2. Программный подбор масштаба печати в цикле

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

Выясним логику реализации данного алгоритма:

  1. Отключаем автоматическое масштабирование: ТабДок.АвтоМасштаб = Ложь;.
  2. Задаем исходный МасштабПечати = 100;.
  3. Запускаем цикл с проверкой метода ТабДок.КоличествоСтраниц(). Если документ занимает больше одной страницы, уменьшаем масштаб на шаг в несколько процентов.
  4. Обязательно задаем нижнюю границу масштабирования (например, не ниже 60-70%), чтобы текст не превратился в нечитаемый микрошрифт, если строк окажется слишком много.

Посмотрим на практический пример программного цикла:


// Отключаем автомасштаб, чтобы включить ручное управление
ТабДок.АвтоМасштаб = Ложь;
ТабДок.МасштабПечати = 100;

// Уменьшаем масштаб с шагом 2%, пока документ не уместится на 1 лист
Пока ТабДок.КоличествоСтраниц() > 1 И ТабДок.МасштабПечати > 65 Цикл
    ТабДок.МасштабПечати = ТабДок.МасштабПечати - 2;
КонецЦикла;

Важное платформенное ограничение: Метод КоличествоСтраниц() для расчета разбивки документа обращается к драйверу принтера, назначенного в операционной системе по умолчанию. Если данный код выполняется в серверном контексте под управлением Linux без настроенного виртуального или локального принтера, вызов метода может вызвать ошибку или работать с существенными задержками. В таком случае подбор масштаба рекомендуется выполнять на клиенте перед непосредственным открытием формы или предварительно фиксировать проверенный масштаб (например, 85-90%) без использования динамического цикла.

Способ 3. Оптимизация параметров строк и ячеек макета

Помимо общего масштабирования страницы, существенный резерв высоты скрыт в оформлении самого макета печатной формы:

  1. Фиксация высоты строк. По умолчанию высота строк в макете рассчитывается автоматически. Если для строк табличной части задать точную высоту в пунктах (например, уменьшить со стандартных 15-18 пунктов до 11-12 пунктов), 50–60 строк таблицы гарантированно поместятся на лист формата А4 без необходимости сильного сжатия масштабом.
  2. Свойство ячеек «Размещение текста». Если для текстовых колонок в макете включено значение Переносить, длинные наименования могут увеличивать высоту отдельной строки в два-три раза. Проанализируем содержимое: если перенос строк не является строгим требованием, измените свойство на Обрезать или Авто, чтобы исключить паразитное раздувание таблицы по вертикали.
  3. Проверка разделителей страниц. Убедимся, что в макете или коде случайно не используется принудительный разрыв страниц. Проверьте строки макета на наличие свойства КонецСтраницы, а также убедитесь, что в алгоритме формирования не вызывается метод ВывестиГоризонтальныйРазделительСтраниц().

Влияние сохраненных настроек пользователя

Часто возникает ситуация: разработчик внес изменения в поля или масштаб, но у конкретного пользователя печатная форма продолжает разбиваться на две страницы. Причина заключается в свойствах ИмяПараметровПечати или КлючПараметровПечати табличного документа.

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

← На главную