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