При формировании печатных форм или отчетов в системе 1С:Предприятие 8 разработчики часто сталкиваются с задачей корректного отображения данных на листе — для этого подойдёт инструмент визуального редактирования и настройки макетов печатных форм. Одной из самых востребованных функций является автоматическая подгонка документа по ширине страницы, чтобы пользователю не приходилось вручную настраивать масштаб в диалоге печати. В этой статье мы подробно разберем, как реализовать эту задачу программно, и проанализируем нюансы, которые могут помешать работе стандартных механизмов.
Самый простой и правильный способ заставить табличный документ самостоятельно рассчитывать коэффициент сжатия для заполнения ширины листа — это использование свойства Автомасштаб. Данное свойство является аналогом настройки «По ширине страницы» в параметрах печати.
Рассмотрим пример кода, где мы создаем табличный документ и задаем ему необходимые параметры ориентации и масштабирования:
ТабДок = Новый ТабличныйДокумент;
// Устанавливаем ландшафтную ориентацию
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
// Включаем автоматическое масштабирование
ТабДок.Автомасштаб = Истина;
// Выводим данные в документ
// ТабДок.Вывести(ОбластьМакета);
Когда свойство Автомасштаб установлено в значение Истина, платформа 1С при выводе на печать или в режиме предварительного просмотра автоматически уменьшит масштаб документа так, чтобы все заполненные колонки уместились по ширине одной страницы. Важно помнить, что это свойство работает только на уменьшение. Если документ и так узкий, он не будет растягиваться на всю страницу, если это не предусмотрено другими настройками.
Иногда программисты жалуются, что установка Автомасштаб = Истина не дает видимого результата. Выясним причину этой ситуации. Чаще всего это связано с использованием свойства ИмяПараметровПечати.
Проанализируем ситуацию: если вы задаете уникальное имя для сохранения параметров печати, 1С запоминает настройки, которые пользователь выбрал в последний раз. Если пользователь один раз вручную установил масштаб 100% или «Свой масштаб», то эти настройки будут приоритетнее тех, что вы прописали в коде. Чтобы гарантированно применить программные настройки, мы можем либо очистить имя параметров печати, либо задать масштаб непосредственно перед выводом.
Посмотрим на пример правильной инициализации:
ТабДок.ИмяПараметровПечати = "УНИКАЛЬНОЕ_ИМЯ_ОТЧЕТА_001";
ТабДок.Автомасштаб = Истина;
// Установка полей
ТабДок.ПолеСлева = 5;
ТабДок.ПолеСправа = 5;
Если вы хотите, чтобы программная настройка всегда «побеждала» пользовательские предпочтения, можно временно очищать ИмяПараметровПечати перед установкой масштаба или использовать различные идентификаторы для разных режимов формирования отчета.
В некоторых случаях автоматика может сработать слишком агрессивно, сделав шрифт нечитаемым. Если мы хотим иметь больше контроля, стоит рассмотреть использование свойства МасштабПечати. Это числовое значение в процентах от оригинала.
Рассмотрим вариант, когда мы заранее знаем, что 85% — это минимально допустимый предел для чтения текста:
ТабДок.Автомасштаб = Ложь; // Отключаем автомат
ТабДок.МасштабПечати = 85; // Устанавливаем жестко 85%
Такой подход полезен, когда дизайн отчета строго регламентирован и «плавающий» масштаб может испортить внешний вид документа.
Разберем продвинутый метод управления шириной. Если нам нужно точно знать, умещается ли документ на лист, мы можем использовать метод ПроверитьВывод(). Хотя чаще он используется для контроля высоты (чтобы переносить строки на новый лист), его можно адаптировать и для анализа ширины, если проверять вывод горизонтальных секций.
Однако более практичным советом здесь будет работа с Областью Печати. Если в вашем табличном документе есть «лишние» колонки справа, которые остались пустыми, но были затронуты форматированием, Автомасштаб будет учитывать и их, сжимая документ до микроскопических размеров. Чтобы этого избежать, всегда четко определяйте рабочую область:
// Указываем область, которая реально должна уйти на печать (строки с 1 по 100, колонки с 1 по 10)
ТабДок.ОбластьПечати = ТабДок.Область(1, 1, 100, 10);
ТабДок.Автомасштаб = Истина;
Многие разработчики используют табличный документ для формирования PDF-файлов. Важно понимать, что при выполнении метода Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF) платформа 1С использует текущие настройки печати документа. Для корректной работы Автомасштаб при сохранении в PDF в системе обязательно должен быть установлен хотя бы один принтер (лучше — принтер по умолчанию), так как 1С обращается к драйверу принтера для получения параметров страницы и разрешения.
Если на сервере, где выполняется код, нет установленных принтеров, настройки Автомасштаб и ОриентацияСтраницы могут игнорироваться, и PDF получится «обрезанным» или некорректно смасштабированным.
Чтобы данные лучше умещались по ширине, мы можем программно отключить отображение вспомогательных элементов, которые могут забирать полезное пространство (особенно при предпросмотре):
ТабДок.ОтображатьСетку = Ложь; — это убирает лишние линии, которые иногда мешают визуальному восприятию границ.ТабДок.ОтображатьЗаголовки = Ложь; — убирает системные наименования строк (1, 2, 3...) и колонок (A, B, C...).Эти параметры не всегда влияют на саму печать, но критичны для формирования корректного образа страницы в памяти платформы перед расчетом масштаба.
Для реализации задачи «по ширине страницы» необходимо придерживаться следующего алгоритма:
ТабДок.Автомасштаб = Истина;.ТабДок.ОриентацияСтраницы.ИмяПараметровПечати не перекрывает ваши настройки старыми данными пользователя.ОбластьПечати, чтобы исключить пустые фантомные колонки.Соблюдение этих правил позволит вашим отчетам всегда выглядеть профессионально и аккуратно на любом бумажном или электронном носителе.