Как разделить лист А3 на две страницы формата А4 при выводе табличного документа в 1С?

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

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

Анализ проблемы: почему метод Присоединить() смещает строки вниз

Рассмотрим исходный алгоритм: разработчик создает временный ТабличныйДокумент формата А4, заполняет его строками выборки до тех пор, пока выполняется условие ТабДок.ПроверитьВывод(), а затем пытается присоединить готовую страницу ко второму (правому) блоку результирующего листа А3.

На практике при вызове метода ТабДокБольшой.Присоединить(ТабДок) вторая страница не встает справа от первой с верхней строки, а добавляется ниже со смещением, удваивая общую высоту таблицы (например, с 72 строк до 144). Разберем, почему это происходит:

  1. Особенность работы метода Присоединить(): данный метод пристыковывает передаваемую область или документ справа к строкам последнего ранее выведенного блока, а не ко всему документу с первой строки (с координаты 1, 1). Если в результирующий документ уже выведена колонка высотой в 72 строки, присоединение целого документа начнет добавлять ячейки справа только к 72-й строке и ниже.
  2. Потеря данных при проверке вывода: когда метод ПроверитьВывод() возвращает Ложь, текущая запись из выборки не выводится. Если после сброса страницы не предусмотреть вывод этой же строки на новую страницу, данные текущей итерации цикла будут безвозвратно потеряны.
  3. Особенности спуска полос для брошюр: если задача состоит в том, чтобы сложить листы А3 пополам и получить скрепленную книгу (тетрадь), простого последовательного вывода страниц (1 и 2 на первом листе, 3 и 4 на втором) недостаточно. Для брошюры на одном развороте должны располагаться первая и последняя полосы тетради (например, 8 и 1, затем 2 и 7 на обороте).

Рассмотрим основные способы правильного формирования подобной печатной формы.

Способ 1. Печать стандартного документа А4 в режиме брошюры (рекомендуемый)

Проанализируем самый надежный и простой подход с точки зрения разработки. Вместо ручного программного разделения листа А3 на две колонки табличный документ формируется стандартным образом — последовательно страница за страницей в формате А4 книжной ориентации.

После формирования документа задача правильного спуска полос и масштабирования делегируется драйверу печати или программе просмотра PDF:

  1. В коде 1С формируется обычный отчет в формате А4 с автоматической или принудительной расстановкой разделителей страниц через ВывестиГоризонтальныйРазделительСтраниц().
  2. При отправке на принтер или при сохранении в файл PDF пользователь выбирает в параметрах печати режим «Брошюра» (Booklet) и целевой формат бумаги А3.
  3. Драйвер принтера самостоятельно выполняет спуск полос, масштабирует страницы и выводит их в правильном порядке для последующего сгиба тетради.

Способ 2. Программное позиционирование областей через метод ВставитьОбласть()

Если требуется сформировать готовый макет А3 непосредственно в окне 1С без использования настроек драйвера, объединять сформированные страницы формата А4 необходимо с помощью прямого указания координат и метода ВставитьОбласть().

Разберем по шагам, как скопировать две заранее сформированные страницы А4 на один разворот А3:


// Создаем результирующий табличный документ формата А3
ТабДокА3 = Новый ТабличныйДокумент;
ТабДокА3.РазмерСтраницы = "A3";
ТабДокА3.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;

// Предположим, что ТабДокСтр1 и ТабДокСтр2 уже содержат готовые страницы А4
ШиринаПервой = ТабДокСтр1.ШиринаТаблицы;
ВысотаПервой = ТабДокСтр1.ВысотаТаблицы;

ШиринаВторой = ТабДокСтр2.ШиринаТаблицы;
ВысотаВторой = ТабДокСтр2.ВысотаТаблицы;

// Определяем исходные области страниц
ОбластьСтр1 = ТабДокСтр1.Область(1, 1, ВысотаПервой, ШиринаПервой);
ОбластьСтр2 = ТабДокСтр2.Область(1, 1, ВысотаВторой, ШиринаВторой);

// Вставляем левую страницу (с 1-й колонки)
ОбластьПриемникаЛевая = ТабДокА3.Область(1, 1, ВысотаПервой, ШиринаПервой);
ТабДокА3.ВставитьОбласть(ОбластьСтр1, ОбластьПриемникаЛевая);

// Вставляем правую страницу (со смещением по колонкам)
СмещениеКолонок = ШиринаПервой + 1;
ОбластьПриемникаПравая = ТабДокА3.Область(1, СмещениеКолонок, ВысотаВторой, СмещениеКолонок + ШиринаВторой - 1);
ТабДокА3.ВставитьОбласть(ОбластьСтр2, ОбластьПриемникаПравая);

ТабДокА3.Показать();

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

Способ 3. Построчный вывод через двухколоночный макет

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

Посмотрим, как организовать алгоритм в этом случае:

  1. В макете создается область строки (например, ОбластьСтрокаРазворота), в которой слева располагаются параметры для первой страницы, а справа — параметры для второй страницы.
  2. Данные выборки считываются пакетами. Для каждой строки разворота заполняются одновременно левые и правые параметры.
  3. Область целиком выводится стандартным методом ТабДок.Вывести(ОбластьСтрокаРазворота).
  4. При таком подходе высота таблицы увеличивается синхронно, а колонки никогда не смещаются относительно друг друга.
← На главную