При разработке печатных форм в 1С программисты часто сталкиваются с системным ограничением платформы: свойства АвтоМасштаб и МасштабПечати объекта ТабличныйДокумент применяются ко всему документу целиком. Это создает серьезную проблему, когда необходимо вывести документ, состоящий из двух разных страниц (например, лицевой и оборотной стороны), где каждая страница требует своего коэффициента масштабирования, но при этом они должны быть напечатаны на одном листе в режиме дуплекса (двусторонней печати).
Если мы попытаемся печатать страницы по отдельности, задавая каждой свой масштаб, драйвер принтера воспримет это как разные задания на печать, и двустороннее объединение станет невозможным. Рассмотрим детально способы решения этой задачи, проанализируем доступные инструменты и выберем оптимальные стратегии обхода ограничений платформы 1С.
Разберем ситуацию, когда нам необходимо строго остаться в рамках одного объекта ТабличныйДокумент, чтобы гарантированно сохранить очередь печати для дуплекса. Поскольку мы не можем задать разный МасштабПечати для разных областей, мы можем изменить визуальный размер контента на конкретной странице.
Для этого используется механизм управления форматом строк. В 1С ТабличныйДокумент позволяет устанавливать индивидуальные настройки для каждой строки и ячейки. Рассмотрим алгоритм действий:
ВысотаСтроки.Шрифт.Объединить(). Мы создаем сетку из множества узких колонок, и для «широких» страниц объединяем большее их количество, а для «узких» — меньшее.Посмотрим на пример логики изменения шрифта:
// Пример уменьшения шрифта для области
Область = ТабДок.Область("R10C1:R20C10");
ТекШрифт = Область.Шрифт;
Область.Шрифт = Новый Шрифт(ТекШрифт.Имя, ТекШрифт.Размер * 0.8, ТекШрифт.Жирный);
Этот метод является трудоемким («костыльным»), так как требует ручного пересчета координат и размеров, но он позволяет сохранить документ как единое целое.
Проанализируем более надежный и современный подход, который часто применяется в сложных корпоративных системах. Суть заключается в том, что 1С отлично справляется с сохранением документов в формате PDF, а современные PDF-процессоры позволяют гибко управлять страницами.
Разберем этот процесс по шагам:
ТабличныйДокумент — для первой и для второй страницы.МасштабПечати или АвтоМасштаб.Записать() с типом файла ТипФайлаТабличногоДокумента.PDF.Выясним причину, почему это работает лучше: при печати готового PDF-файла драйвер принтера получает уже сформированные графические страницы нужного размера. Ему не нужно знать о масштабах 1С — он просто печатает «страницу 1» и «страницу 2» на двух сторонах листа, так как они находятся в одном файле (одном задании).
В платформе существует специальный объект ПакетОтображаемыхДокументов. Посмотрим, как он может помочь в решении нашей задачи. Данный объект позволяет объединить несколько ТабличныйДокумент в один список для вывода на печать.
Проанализируем нюансы использования:
Пакет = Новый ПакетОтображаемыхДокументов;
Пакет.ПечатьДвусторонняя = ИспользованиеДвустороннейПечати.ПереворотВлево;
// Добавляем первую страницу с одним масштабом
ТабДок1 = СформироватьЛицевуюСторону();
ТабДок1.МасштабПечати = 100;
Пакет.Состав.Добавить(ТабДок1);
// Добавляем вторую страницу с другим масштабом
ТабДок2 = СформироватьОборотнуюСторону();
ТабДок2.МасштабПечати = 85;
Пакет.Состав.Добавить(ТабДок2);
Пакет.Напечатать();
Важное предостережение: Несмотря на то, что это штатный механизм, успех его работы сильно зависит от драйвера конкретного принтера. Многие драйверы при обнаружении смены параметров страницы (даже если это только масштаб) принудительно завершают текущий лист и начинают новый, что ломает двустороннюю печать. Перед внедрением этого метода обязательно протестируйте его на целевом оборудовании.
Рассмотрим ситуацию, когда мы пытаемся уместить всё в один ТабличныйДокумент, используя ВывестиГоризонтальныйРазделительСтраниц(). Это стандартный путь, но он имеет критическую особенность: если вы установите АвтоМасштаб = Истина, 1С найдет самую «широкую» или самую «длинную» страницу во всем документе и применит этот масштаб ко всем остальным страницам.
Чтобы избежать нежелательного уменьшения шрифта на одной странице из-за избытка данных на другой, необходимо:
ПроверитьВывод() перед добавлением новых областей.Мы выяснили, что прямой возможности задать МасштабПечати для разных страниц одного ТабличногоДокумента не существует. Для решения задачи двусторонней печати с разным масштабом рекомендуются следующие подходы:
Шрифт) непосредственно в макете перед выводом.ПакетОтображаемыхДокументов, если драйвер принтера корректно обрабатывает смену параметров внутри одного пакета.Выбор метода зависит от сложности макета и готовности использовать сторонние компоненты в инфраструктуре 1С.