Как растянуть табличный документ на всю ширину страницы в 1С?

Программист IT и автоматизация бизнеса
← На главную

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

Проблема заключается в том, что штатный АвтоМасштаб работает только в сторону уменьшения. Он не умеет увеличивать масштаб более 100%. Давайте подробно разберем по шагам несколько эффективных способов решения этой задачи, от самых простых "хаков" до точных математических расчетов.

Способ 1: Искусственное расширение колонок и использование Автомасштаба

Рассмотрим самый простой и популярный на практике метод. Если платформа умеет отлично сжимать таблицы, давайте заставим ее это сделать! Суть подхода заключается в том, чтобы программно сделать таблицу заведомо шире любого печатного листа, а затем применить к ней штатный механизм масштабирования.

Проанализируем алгоритм действий:

  1. Сформируйте ваш ТабличныйДокумент как обычно.
  2. Пройдите циклом по всем колонкам выведенной таблицы или динамической области.
  3. Умножьте свойство ШиринаКолонки каждой колонки на большой коэффициент (например, в 2 или 3 раза). Таблица станет огромной и выйдет за границы листа.
  4. Установите свойство ТабДокумент.АвтоМасштаб = Истина.

Посмотрим на пример того, как это можно реализовать в коде:


// Предположим, мы выводим динамические колонки
Для Каждого ТекКолонка Из МассивКолонок Цикл
    ОбластьКолонки = Макет.ПолучитьОбласть("Строка|Колонка");
    
    // Искусственно увеличиваем ширину в 3 раза
    ОбластьКолонки.ШиринаКолонки = ОбластьКолонки.ШиринаКолонки * 3;
    
    ТабДокумент.Присоединить(ОбластьКолонки);
КонецЦикла;

// Включаем штатный механизм сжатия
ТабДокумент.АвтоМасштаб = Истина;

В результате платформа сама аккуратно сожмет документ ровно до границ печатного листа. Этот подход избавляет от необходимости писать сложные алгоритмы расчета пикселей, миллиметров и масштабов.

Способ 2: Точный математический расчет ширины

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

Для начала рассчитаем ширину доступной печатной области. Стандартный лист А4 имеет физическую ширину 210 мм. Вычитая из этого значения свойства табличного документа ПолеСлева и ПолеСправа (по умолчанию они обычно равны 10 мм каждое), мы получаем ширину полезной печатной области, равную 190 мм.

Далее выясним текущую ширину таблицы. Свойство ШиринаКолонки в 1С измеряется не в миллиметрах, а в усредненных символах текущего шрифта. Зная коэффициент перевода ширины символов в миллиметры, мы можем получить фактическую ширину нашей узкой таблицы.

Определив разницу между 190 мм и текущей шириной, мы можем поступить двумя путями:

  1. Пропорционально раскидать эту разницу по всем колонкам, увеличив их свойство ШиринаКолонки.
  2. Добавить всю недостающую ширину в одну, самую важную колонку (например, текстовое поле "Номенклатура" или "Наименование"), оставив числовые колонки без изменений.

Важный нюанс: если ваш табличный документ состоит из сложной шапки с одним набором объединенных ячеек и динамической таблицы с другим набором колонок, изменение ширины может "покорежить" шапку. В таких ситуациях обязательно используйте метод СоздатьФорматСтрок(). Он позволяет задавать индивидуальную ширину колонок только для выделенной области строк, не затрагивая форматирование остальной части документа.

Способ 3: Прямое управление свойством МасштабПечати

Вместо изменения физической ширины колонок, мы можем напрямую управлять масштабом при выводе на принтер. Как мы уже выяснили, автомасштаб не делает масштаб больше 100%. Но мы можем задать его вручную!

Рассмотрим по шагам этот подход:

  1. Отключите автоматическое масштабирование, установив ТабДокумент.АвтоМасштаб = Ложь.
  2. Используя расчеты из Способа 2, определите отношение идеальной ширины листа (например, 190 мм) к фактической ширине вашей таблицы.
  3. Переведите это отношение в проценты. Например, если таблица занимает только половину листа, необходимый масштаб будет 200%.
  4. Установите рассчитанное значение: ТабДокумент.МасштабПечати = 200.

Этот метод решает задачу без вмешательства в структуру колонок макета и документа. Для применения подобных настроек к готовым документам конфигурации можно использовать решение для постобработки печатных форм на базе БСП.

Способ 4: Интерактивный подбор масштаба (с учетом производительности)

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

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

Если вы всё же решили использовать программный подбор с проверкой вывода, категорически откажитесь от линейного перебора. Примените алгоритм бинарного поиска (деления пополам):

  1. Задайте границы: минимальный масштаб 100, максимальный, например, 300.
  2. Возьмите середину (200), установите МасштабПечати = 200.
  3. Вызовите ПроверитьВывод() или проверьте количество страниц.
  4. Если таблица вылезла за границы листа (появились дополнительные страницы по ширине), значит 200 — это много. Новой верхней границей становится 200.
  5. Если таблица поместилась, значит можно попробовать сделать еще крупнее. Новой нижней границей становится 200.
  6. Повторяйте деление отрезка пополам, пока разница между верхней и нижней границей не станет минимальной (например, 1-2%).

Такой подход позволит найти идеальный масштаб всего за 5–8 шагов вместо 100, что кардинально ускорит формирование печатной формы, хотя математические расчеты в памяти (Способы 1-3) всегда остаются более предпочтительными с точки зрения оптимизации.

← На главную