Как реализовать разное масштабирование страниц в одном ТабличномДокументе при двусторонней печати?

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

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

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

Метод 1: Программная имитация масштабирования через формат строк

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

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

  1. Проанализируем содержимое страницы, которую нужно «уменьшить».
  2. Для всех строк в этой области установим меньшую высоту через свойство ВысотаСтроки.
  3. Для всех ячеек в этой области программно уменьшим размер шрифта через объект Шрифт.
  4. Чтобы сохранить пропорции по горизонтали (ширину колонок), мы столкнемся со сложностью: ширина колонок в 1С задается для всего документа. Решением здесь является использование механизма Объединить(). Мы создаем сетку из множества узких колонок, и для «широких» страниц объединяем большее их количество, а для «узких» — меньшее.

Посмотрим на пример логики изменения шрифта:


// Пример уменьшения шрифта для области
Область = ТабДок.Область("R10C1:R20C10");
ТекШрифт = Область.Шрифт;
Область.Шрифт = Новый Шрифт(ТекШрифт.Имя, ТекШрифт.Размер * 0.8, ТекШрифт.Жирный);

Этот метод является трудоемким («костыльным»), так как требует ручного пересчета координат и размеров, но он позволяет сохранить документ как единое целое.

Метод 2: Экспорт в PDF и внешняя обработка печати

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

Разберем этот процесс по шагам:

  1. Создадим два отдельных объекта ТабличныйДокумент — для первой и для второй страницы.
  2. Для каждого документа установим индивидуальный МасштабПечати или АвтоМасштаб.
  3. Сохраним каждый документ во временный файл PDF, используя метод Записать() с типом файла ТипФайлаТабличногоДокумента.PDF.
  4. Используем внешнюю утилиту (например, PDFTK, Ghostscript или ImageMagick) для склейки двух PDF-файлов в один многостраничный документ.
  5. Отправим итоговый PDF-файл на печать системными средствами.

Выясним причину, почему это работает лучше: при печати готового PDF-файла драйвер принтера получает уже сформированные графические страницы нужного размера. Ему не нужно знать о масштабах 1С — он просто печатает «страницу 1» и «страницу 2» на двух сторонах листа, так как они находятся в одном файле (одном задании).

Метод 3: Работа с ПакетомОтображаемыхДокументов

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

Проанализируем нюансы использования:


Пакет = Новый ПакетОтображаемыхДокументов;
Пакет.ПечатьДвусторонняя = ИспользованиеДвустороннейПечати.ПереворотВлево;

// Добавляем первую страницу с одним масштабом
ТабДок1 = СформироватьЛицевуюСторону();
ТабДок1.МасштабПечати = 100;
Пакет.Состав.Добавить(ТабДок1);

// Добавляем вторую страницу с другим масштабом
ТабДок2 = СформироватьОборотнуюСторону();
ТабДок2.МасштабПечати = 85;
Пакет.Состав.Добавить(ТабДок2);

Пакет.Напечатать();

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

Метод 4: Использование разделителей страниц и контроль контента

Рассмотрим ситуацию, когда мы пытаемся уместить всё в один ТабличныйДокумент, используя ВывестиГоризонтальныйРазделительСтраниц(). Это стандартный путь, но он имеет критическую особенность: если вы установите АвтоМасштаб = Истина, 1С найдет самую «широкую» или самую «длинную» страницу во всем документе и применит этот масштаб ко всем остальным страницам.

Чтобы избежать нежелательного уменьшения шрифта на одной странице из-за избытка данных на другой, необходимо:

Подведение итогов

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

  1. Для гарантированного результата: Экспорт в PDF, склейка страниц внешними средствами и печать единого файла.
  2. Для простых случаев: Манипуляция высотой строк и размером шрифта (Шрифт) непосредственно в макете перед выводом.
  3. Для современного оборудования: Использование ПакетОтображаемыхДокументов, если драйвер принтера корректно обрабатывает смену параметров внутри одного пакета.

Выбор метода зависит от сложности макета и готовности использовать сторонние компоненты в инфраструктуре 1С.

← На главную