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

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

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

Базовый вывод двух макетов с помощью метода Вывести

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

Посмотрим на пример кода формирования двух макетов в рамках одной процедуры печати:


ТабДокумент = Новый ТабличныйДокумент;

// Получаем и выводим области первого макета
Макет1 = ПолучитьМакет("МакетПервый");
ОбластьШапка1 = Макет1.ПолучитьОбласть("Шапка");
// Заполняем параметры области первого макета при необходимости
ТабДокумент.Вывести(ОбластьШапка1);

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

// Получаем и выводим области второго макета
Макет2 = ПолучитьМакет("МакетВторой");
ОбластьШапка2 = Макет2.ПолучитьОбласть("Шапка");
// Заполняем параметры области второго макета
ТабДокумент.Вывести(ОбластьШапка2);

ТабДокумент.Показать();

Управление разрывом страниц

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

Если же требуется, чтобы каждый макет обязательно печатался с нового листа, перед выводом второго макета необходимо вызвать метод ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц(). Это гарантирует принудительный перенос печати на следующий физический лист.

Коллизии ширины колонок и независимые форматы строк

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

Чтобы избежать этой проблемы, разберем по шагам правильные подходы:

  1. Использование механизма раздельного формата строк: в редакторе макета платформы 1С для конкретных строк можно установить отдельный формат колонок. Для этого выделите нужные строки, откройте контекстное меню и выберите «Таблица» — «Имена» — «Создать формат строк». Тогда ширина колонок в этой секции станет независимой от остального документа.
  2. Выравнивание сетки колонок: при проектировании макетов заранее проектируйте унифицированную мелкую сетку колонок и формируйте нужную ширину ячеек через объединение колонок.

Ограничения параметров печати в едином табличном документе

Проанализируем существенные ограничения, накладываемые архитектурой платформы на один объект ТабличныйДокумент:

  1. Единая ориентация страниц: нельзя задать первому макету портретную ориентацию, а второму — альбомную. Свойство ОриентацияСтраницы применяется ко всему табличному документу целиком.
  2. Общие поля и колонтитулы: размеры отступов (поля сверху, снизу, слева, справа), масштаб (АвтоМасштаб, МасштабПечати) и параметры колонтитулов действуют на весь документ.
  3. Сохраняемые настройки: свойство ИмяПараметровПечати определяет ключ, под которым сохраняются пользовательские настройки печати. При объединении двух документов будет действовать только один набор сохраненных параметров.

Альтернативное решение: использование пакетной печати

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

Рассмотрим пример использования объекта ПакетТабличныхДокументов:


ТабДок1 = СформироватьПечатнуюФорму1();
ТабДок1.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;

ТабДок2 = СформироватьПечатнуюФорму2();
ТабДок2.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;

Пакет = Новый ПакетТабличныхДокументов;
Пакет.Состав.Добавить(ТабДок1);
Пакет.Состав.Добавить(ТабДок2);

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

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

Формирование комплектов документов в конфигурациях на БСП

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

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

← На главную