Как вывести две разные области макета на один лист А4 в ландшафтной ориентации?

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

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

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

Основная концепция: Методы Вывести() и Присоединить()

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

Рассмотрим стандартный сценарий. У нас есть две области (или два отдельных табличных документа), которые мы хотим видеть бок о бок. Логика работы будет следующей:

  1. Создаем результирующий ТабличныйДокумент.
  2. Сначала используем Вывести() для левой части.
  3. Затем используем Присоединить() для правой части.

Проанализируем пример кода, который позволяет объединить два табличных документа в один:


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

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

Работа с именованными областями одного макета

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

Допустим, у нас есть области ОбластьЛево и ОбластьПраво. Чтобы они оказались на одной горизонтали, мы должны сначала сформировать левую часть, а затем «приклеить» правую.


// Создаем итоговый документ
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МойМакет");

// Получаем области
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьВтораяСтраница = Макет.ПолучитьОбласть("ВтораяСтраница");

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

// 2. Выводим левую часть в основной документ
ТабДок.Вывести(ТабДокЛево);

// 3. Присоединяем правую часть
ТабДок.Присоединить(ОбластьВтораяСтраница);

Важный момент: если вы используете ВывестиГоризонтальныйРазделительСтраниц(), помните, что он работает на всю ширину документа. Если ваша цель — уместить всё на одну страницу А4, разделители внутри документа (между левой и правой частью) использовать не нужно, иначе правая часть может принудительно перенестись на следующий лист.

Проблема общей сетки колонок

Разберем ситуацию, которая часто ставит разработчиков в тупик. В 1С ТабличныйДокумент имеет единую структуру колонок для каждой строки. Если в левой области у вас 5 колонок по 10 мм, а в правой — 3 колонки по 15 мм, то после выполнения Присоединить() колонки правой области будут подстраиваться под индексы колонок левой.

Чтобы избежать этого, рекомендуется использовать один из двух подходов:

  1. Создание «разнесенного» макета: В самом макете (в конфигураторе) визуально разделите колонки. Например, колонки с 1 по 10 используйте для левой части документа, а колонки с 15 по 25 — для правой. Тогда при программном выводе они не будут конфликтовать.
  2. Использование формата строк: В современных версиях платформы 8.3 можно настраивать формат строк независимо. Однако при горизонтальном соединении (Присоединить) этот механизм работает сложнее, так как строки физически одни и те же.

Настройка параметров страницы для печати

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


// Устанавливаем альбомную (ландшафтную) ориентацию
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;

// Включаем автоматический масштаб, чтобы документ вписался в границы листа
ТабДок.АвтоМасштаб = Истина;

// Явно указываем, что по ширине должна быть только одна страница
ТабДок.КоличествоСтраницПоШирине = 1;

// Убираем лишние поля, если данных очень много
ТабДок.ПолеСлева = 5;
ТабДок.ПолеСправа = 5;
ТабДок.ПолеСверху = 5;
ТабДок.ПолеСнизу = 5;

Использование свойства КоличествоСтраницПоШирине = 1 является критически важным. Оно заставляет драйвер принтера или систему предварительного просмотра 1С масштабировать документ так, чтобы правая присоединенная часть не «вылетала» за границы первого листа.

Синхронизация высоты строк

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

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

Альтернативный метод: Настройка принтера

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

  1. Выводите области последовательно друг за другом (одна под другой), как будто это просто разные страницы одного документа.
  2. В параметрах печати (или настройках принтера) установите опцию «2 страницы на лист».

Однако этот метод неудобен тем, что его сложно автоматизировать «одной кнопкой» для пользователя без вызова диалога печати. Поэтому программный метод с использованием Присоединить() и АвтоМасштаб остается приоритетным и наиболее профессиональным решением для разработчика 1С.

Подведем итог. Для качественного вывода двух областей на один ландшафтный лист мы должны:

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

← На главную