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