Как скрыть колонки отчета при печати, оставив их видимыми на экране

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

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

Рассмотрим подробнее несколько способов решения этой задачи: от программной обработки табличного документа до использования встроенных механизмов Системы компоновки данных (СКД).

Метод 1: Программное управление областью печати

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

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

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


// Предположим, что ТабДок — это наш сформированный отчет
// Мы хотим напечатать только первые 6 колонок из 8
Высота = ТабДок.ВысотаТаблицы;
// Указываем область: (Верх, Лево, Низ, Право)
ТабДок.ОбластьПечати = ТабДок.Область(1, 1, Высота, 6);

// Теперь при вызове метода Напечатать() или просмотре 
// будут учитываться только эти границы
ТабДок.Показать();

Проанализируем ситуацию: использование ОбластьПечати жестко ограничивает рамки вывода. Однако, если нам нужно скрыть колонки в середине отчета (например, 3-ю и 5-ю), этот метод не подойдет, так как область печати всегда представляет собой единый прямоугольник.

Метод 2: Программное скрытие колонок через свойство Видимость

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

Рассмотрим пример кода для реализации этой логики:


Процедура КомандаПечатьТолькоНужного(Команда)
    // Создаем копию сформированного отчета
    ПечатнаяФорма = Новый ТабличныйДокумент;
    ПечатнаяФорма.Вывести(Элементы.Результат); // Результат — поле табличного документа на форме
    
    // Скрываем конкретные колонки (например, 7 и 8)
    // Обращаемся к области по номеру колонок
    ПечатнаяФорма.Область(, 7, , 8).Видимость = Ложь;
    
    // Выводим диалог печати или сразу на принтер
    ПечатнаяФорма.Напечатать(РежимИспользованияДиалогаПечати.Использовать);
КонецПроцедуры

Важный момент: при использовании этого метода нужно быть внимательными с объединенными ячейками. Если колонка, которую вы скрываете, входит в состав горизонтального объединения (например, общая «шапка» над всеми колонками), скрытие одной колонки может привести к непредсказуемому визуальному искажению. В таких случаях перед скрытием рекомендуется программно «разъединить» такие ячейки, установив свойство Объединить = Ложь для соответствующей области.

Метод 3: Использование условного оформления СКД

Посмотрим на задачу под другим углом. Можно ли обойтись без сложного программного кода, используя только мощь СКД? Да, это возможно через управление шириной колонок.

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

  1. Добавим в отчет новый параметр, например, РежимПечати с типом Булево.
  2. В настройках отчета перейдем на закладку Условное оформление.
  3. Создадим новый элемент оформления. В качестве оформляемых полей выберем те колонки, которые должны исчезать.
  4. В параметрах оформления установим значения Максимальная ширина и Минимальная ширина равными 0.
  5. В условии укажем: ПараметрыДанных.РежимПечати Равно Истина.

Как это работает? Перед выводом на печать программно устанавливаем параметр РежимПечати = Истина, формируем отчет во временный табличный документ и отправляем его на принтер. После этого возвращаем параметр в Ложь, чтобы пользователь на экране видел все данные. Этот способ элегантен тем, что структура документа пересчитывается самой системой компоновки данных.

Метод 4: Работа с расширениями и БСП

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

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

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

Метод 5: Использование двух разных макетов

Рассмотрим еще один архитектурный подход. Мы можем подготовить два макета в схеме компоновки данных или два разных варианта отчета.

Один вариант предназначен для отображения на экране (со всеми колонками), а второй — упрощенный — программно вызывается только в момент нажатия кнопки печати.


// Пример логики вызова упрощенного макета
НастройкиДляПечати = Отчет.КомпоновщикНастроек.ПолучитьНастройки();
// Программная смена варианта или скрытие полей в настройках
ПолеСкрыть = НастройкиДляПечати.ВыбранныеПоля.Элементы.Найти("ИмяТехническогоПоля");
Если ПолеСкрыть <> Неопределено Тогда
    ПолеСкрыть.Использование = Ложь;
КонецЕсли;

// Формируем результат с новыми настройками в отдельный ТабДок
// и отправляем на печать

Этот метод считается наиболее «чистым» с точки зрения методологии 1С, так как он не ломает верстку существующего документа, а создает новый, изначально корректный документ для печати.

Резюме и практические советы

Выбор метода зависит от сложности вашего отчета:

Помните: всегда проверяйте результат на наличие объединенных ячеек. Если заголовок отчета объединен по всей ширине, скрытие колонок может привести к тому, что текст заголовка станет нечитаемым или «сожмется». В таких ситуациях всегда программно обрабатывайте область заголовка отдельно.

← На главную