Как в 1С перенести группу строк на следующую страницу при печати

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

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

Использование метода ПроверитьВывод с массивом областей

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

Разберем по шагам базовый алгоритм проверки группы секций:

  1. Получаем необходимые секции из макета и обязательно заполняем их параметры.
  2. Формируем массив из областей, которые требуется вывести неразрывно.
  3. Вызываем метод ПроверитьВывод для сформированного массива.
  4. Если метод возвращает Ложь, принудительно вставляем горизонтальный разделитель страниц методом ВывестиГоризонтальныйРазделительСтраниц.
  5. Последовательно выводим секции в итоговый табличный документ.

Посмотрим на пример реализации данного алгоритма:


// Формируем и заполняем секции макета
СекцияГруппа = Макет.ПолучитьОбласть("ШапкаГруппы");
СекцияКомментарий = Макет.ПолучитьОбласть("Комментарий");
СекцияИтоги = Макет.ПолучитьОбласть("ПодвалГруппы");

// Заполняем параметры секций реальными данными
СекцияГруппа.Параметры.Наименование = "Группа товаров 1";
СекцияКомментарий.Параметры.Текст = "Дополнительная информация";
СекцияИтоги.Параметры.Сумма = 15000;

// Собираем области в массив для проверки
СтрокаГруппа = Новый Массив;
СтрокаГруппа.Добавить(СекцияГруппа);
СтрокаГруппа.Добавить(СекцияКомментарий);
СтрокаГруппа.Добавить(СекцияИтоги);

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

// Выводим области в документ
ТабДок.Вывести(СекцияГруппа);
ТабДок.Вывести(СекцияКомментарий);
ТабДок.Вывести(СекцияИтоги);

Особенности и типовые ошибки при работе с методом ПроверитьВывод

Проанализируем частые причины, по которым метод ПроверитьВывод может работать некорректно или возвращать неожиданный результат:

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

Использование вспомогательного табличного документа

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


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

// Заполняем временный документ всеми строками блока
ВременныйТабДок.Вывести(СекцияГруппа);
Для Каждого Стр Из ТаблицаДанных Цикл
    СекцияСтрока.Параметры.Заполнить(Стр);
    ВременныйТабДок.Вывести(СекцияСтрока);
КонецЦикла;
ВременныйТабДок.Вывести(СекцияИтоги);

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

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

Применение свойства ВместеСоСледующим

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

Рассмотрим особенности работы этого свойства:

  1. Назначение свойства: если для строки установлено ВместеСоСледующим = Истина, платформа гарантирует, что эта строка не останется внизу страницы в одиночестве, если следующая за ней строка переносится на новый лист.
  2. Точечная настройка: не следует устанавливать это свойство для всех строк таблицы подряд, иначе платформе придется игнорировать разрывы. Свойство устанавливают точечно — например, для заголовков групп, предпоследней строки таблицы перед подвалом или для строки с подписями.
  3. Установка через код: свойство можно задать как интерактивно в свойствах макета, так и программно для области ячеек: Область.ВместеСоСледующим = Истина;.

Заполнение пустого пространства перед фиксированным подвалом

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

Посмотрим на пример вспомогательной функции и цикла заполнения:


Функция ВернутьМассивОбластей(Область1, Область2)
    Массив = Новый Массив;
    Массив.Добавить(Область1);
    Массив.Добавить(Область2);
    Возврат Массив;
КонецФункции

// Пример вставки пустых строк до достижения конца листа
ОбластьПустая = Макет.ПолучитьОбласть("ПустаяСтрока");
ОбластьПодвал = Макет.ПолучитьОбласть("ПодвалДокумента");
ОбластьПодвал.Параметры.Ответственный = "Иванов И.И.";

МассивПроверки = ВернутьМассивОбластей(ОбластьПустая, ОбластьПодвал);

// Пока пустая строка вместе с подвалом умещаются на листе, выводим пустую строку
Пока ТабДок.ПроверитьВывод(МассивПроверки) Цикл
    ТабДок.Вывести(ОбластьПустая);
КонецЦикла;

// Выводим итоговый подвал
ТабДок.Вывести(ОбластьПодвал);

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

← На главную