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

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

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

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

Способ 1. Объединение в один табличный документ

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

Рассмотрим по шагам, как реализовать этот алгоритм:

  1. Создадим новый объект типа ТабличныйДокумент, который будет выступать в роли контейнера.
  2. Используем метод Вывести() для добавления данных из каждой вкладки.
  3. Чтобы данные каждой вкладки начинались с нового листа, будем использовать метод ВывестиГоризонтальныйРазделительСтраниц().

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


// Создаем результирующий документ
ТабДокИтоговый = Новый ТабличныйДокумент;

// Выводим данные первой вкладки (например, Зарплата)
ТабДокИтоговый.Вывести(ЭлементыФормы.ТабДокЗарплата);

// Добавляем разделитель, чтобы следующая вкладка шла с новой страницы
ТабДокИтоговый.ВывестиГоризонтальныйРазделительСтраниц();

// Выводим данные второй вкладки (например, Премия)
ТабДокИтоговый.Вывести(ЭлементыФормы.ТабДокПремия);

// Отправляем на печать или показываем пользователю
ТабДокИтоговый.Показать("Печать всех вкладок отчета");

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

Способ 2. Использование объекта ПакетОтображаемыхДокументов

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

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


// Инициализируем пакет документов
Пакет = Новый ПакетОтображаемыхДокументов;

// Создаем первый элемент пакета
ЭлементПакета1 = Пакет.Состав.Добавить();
// Помещаем табличный документ во временное хранилище
// Используем УникальныйИдентификатор формы для привязки данных к сеансу
ЭлементПакета1.Данные = ПоместитьВоВременноеХранилище(ТабДокЗарплата, ЭтаФорма.УникальныйИдентификатор);

// Создаем второй элемент пакета
ЭлементПакета2 = Пакет.Состав.Добавить();
ЭлементПакета2.Данные = ПоместитьВоВременноеХранилище(ТабДокПремия, ЭтаФорма.УникальныйИдентификатор);

// Отображаем пакет пользователю для предварительного просмотра
Пакет.Показать("Пакетная печать отчета");

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

Разбор типичной ошибки: Переданное значение не может быть перемещено во временное хранилище

Часто новички сталкиваются с ошибкой при использовании метода ПоместитьВоВременноеХранилище. Выясним причину этой проблемы. Она обычно кроется в попытке передать объект, который не сериализуется, или при неправильном указании идентификатора.

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

Чтобы избежать ошибки «УникальныйИдентификатор не определен», всегда проверяйте контекст. В коде формы следует использовать свойство ЭтаФорма.УникальныйИдентификатор. Это гарантирует, что система «поймет», в рамках какого окна и сеанса создаются временные данные, и автоматически очистит их при закрытии формы.

Оптимизация настроек печати (Автомасштаб и Ориентация)

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

Во-первых, это свойство Автомасштаб. Если в табличном документе много колонок, они могут не влезть на один лист. Установив Автомасштаб = Истина, мы заставляем систему автоматически сжимать документ до ширины страницы.

Во-вторых, это свойство ОриентацияСтраницы. Оно принимает значения из системного перечисления ОриентацияСтраницы.Ландшафт или ОриентацияСтраницы.Портрет. Рассмотрим пример настройки перед выводом в пакет:


ТабДокЗарплата.Автомасштаб = Истина;
ТабДокЗарплата.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;

ТабДокПремия.Автомасштаб = Истина;
ТабДокПремия.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;

Благодаря использованию пакета, эти настройки сохранятся: первая часть отчета выйдет из принтера «горизонтально», а вторая — «вертикально».

Предварительный просмотр vs Прямая печать

В 1С существует два основных метода вывода: Напечатать() и Показать(). Проанализируем разницу между ними:

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

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

Использование механизмов БСП (Библиотеки стандартных подсистем)

Если ваша конфигурация построена на базе БСП (например, 1С:ERP, УТ 11 или Бухгалтерия 3.0), ручное создание пакетов может быть излишним. В БСП существует подсистема «Печать», которая оперирует объектом КоллекцияПечатныхФорм.

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

Заключение

Мы разобрали основные способы печати нескольких вкладок формы. Для простых случаев достаточно метода Вывести() с разделителем страниц. Для профессиональных отчетов с разными настройками страниц идеальным выбором станет ПакетОтображаемыхДокументов. Помните о правильной работе с УникальныйИдентификатор и всегда настраивайте Автомасштаб, чтобы ваши отчеты выглядели презентабельно на любом принтере.

← На главную