Как скрыть или удалить колонки из отчета 1С при печати?

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

Часто возникает ситуация, когда отчет, предназначенный для анализа на экране, содержит много колонок. При выводе на печать часть этой информации становится избыточной, и отчет не помещается на лист или становится трудночитаемым. Возникает задача: как сделать специальную, "облегченную" версию отчета для печати, убрав из нее ненужные колонки, при этом сохранив полную версию для отображения на форме?

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

Способ 1. Программное удаление колонок из готового отчета

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

Разберем по шагам реализацию:

  1. Создадим на форме отчета свои команды, например, "Печать с выбором принтера", "Печать сразу" и "Предварительный просмотр".
  2. В обработчиках этих команд будем вызывать общую клиентскую процедуру, которая передаст управление на сервер для модификации отчета.
  3. На сервере создадим новый табличный документ, скопируем в него данные из исходного отчета и выполним удаление колонок.

Посмотрим на пример кода:

Сначала определим клиентские процедуры для наших кнопок.


&НаКлиенте
Процедура Печать(Команда)
    ВыполнитьПечать(Ложь);
КонецПроцедуры

&НаКлиенте
Процедура ПечатьСразу(Команда)
    ВыполнитьПечать(Истина);
КонецПроцедуры

&НаКлиенте
Процедура ПредварительныйПросмотр(Команда)
    ВыполнитьПечать(Неопределено);
КонецПроцедуры

Далее, общая клиентская процедура, которая выполняет проверки и вызывает серверный метод.


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

    // Вызываем серверную функцию для подготовки документа
    ТабДок = ВыполнитьПечатьНаСервере();
    
    // В зависимости от команды либо показываем, либо печатаем
    Если Сразу = Неопределено Тогда
        ТабДок.Показать("Предварительный просмотр");
    Иначе
        ТабДок.Напечатать(?(Сразу, РежимИспользованияДиалогаПечати.НеИспользовать, РежимИспользованияДиалогаПечати.Использовать));
    КонецЕсли;
КонецПроцедуры

И, наконец, серверная функция, где происходит вся магия — копирование и удаление колонок.


&НаСервере
Функция ВыполнитьПечатьНаСервере()
    // Создаем новый табличный документ для печатной формы
    ТабДок = Новый ТабличныйДокумент;
    
    // Копируем в него всю область исходного отчета
    ВсяОбласть = ОтчетТабличныйДокумент.ПолучитьОбласть(,,,);
    ТабДок.Вывести(ВсяОбласть);
    
    // Удаляем колонки. Например, с 5-й по 6-ю
    // Важно: удаление происходит для всех строк документа
    ТабДок.УдалитьОбласть(ТабДок.Область(1, 5, ТабДок.ВысотаТаблицы, 6), ТипСмещенияТабличногоДокумента.ПоГоризонтали);
    
    Возврат ТабДок;
КонецФункции

Важный нюанс: проблема с объединенными ячейками.

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

Как это обойти?

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

Способ 2. Формирование отдельного варианта отчета для печати

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

Подход А: Создание отдельного варианта отчета в СКД

Если ваш отчет построен на Системе Компоновки Данных (СКД), самое простое решение — создать два варианта настроек:

  1. "Основной" — вариант по умолчанию, который видит пользователь, со всеми колонками.
  2. "Для печати" — второй вариант, в котором на вкладке "Выбранные поля" отключены ненужные колонки.

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

Подход Б: Программное отключение полей в СКД

Этот подход похож на предыдущий, но не требует создания сохраненного варианта. Вы изменяете настройки СКД "на лету".

Примерная логика:

  1. В обработчике команды печати получаете текущие настройки компоновки данных: КомпоновщикНастроек.ПолучитьНастройки().
  2. Программно находите в структуре настроек (в выбранных полях) элементы, соответствующие колонкам, которые нужно скрыть.
  3. Устанавливаете для этих полей свойство Использование в значение Ложь.
  4. Формируете отчет с измененными настройками в новый табличный документ.
  5. Отправляете этот новый документ на печать.

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


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

    // Формируем отчет с измененными настройками
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиСКД);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
    
    ТабДокДляПечати = Новый ТабличныйДокумент;
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ТабДокДляПечати);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    Возврат ТабДокДляПечати;
    
КонецФункции

Способ 3. Использование условного оформления

Это еще один элегантный способ, который позволяет не удалять колонки, а "прятать" их, устанавливая нулевую ширину. Он также отлично обходит проблему с объединенными ячейками.

Алгоритм действий:

  1. В схему компоновки данных добавьте новый параметр, например, ЭтоПечать с типом Булево.
  2. В настройках отчета перейдите на вкладку "Условное оформление" и создайте новый элемент.
  3. В условии укажите: ПараметрыДанных.ЭтоПечать = Истина.
  4. В оформлении выберите свойство МаксимальнаяШирина и установите значение 0 или 0.1.
  5. В оформляемых полях укажите те поля (колонки), которые нужно скрыть при печати.
  6. В коде вашей кнопки печати, перед формированием отчета, установите значение этого параметра в Истина.

При формировании отчета с этим параметром СКД автоматически применит оформление, и указанные колонки "схлопнутся" до нулевой ширины, став невидимыми.

← На главную