При формировании сложных печатных форм в 1С:Предприятие 8 часто возникает ситуация, когда необходимо вывести несколько небольших макетов (областей) один за другим. Если очередная область не помещается на остаток текущего листа А4, платформа по умолчанию «разрывает» её: часть строк печатается на одной странице, а часть — на другой. Это выглядит неэстетично и затрудняет чтение документа. Рассмотрим подробно, как программно проконтролировать вывод и перенести область целиком на следующий лист.
Основным инструментом для решения этой задачи является метод ПроверитьВывод() объекта ТабличныйДокумент. Этот метод позволяет системе «смоделировать» вывод области или массива областей в текущий документ с учетом текущих настроек принтера и страницы. Разберем по шагам, как работает этот механизм.
Метод возвращает логическое значение Истина, если передаваемая область помещается на текущей странице, и Ложь, если для её размещения потребуется переход на новый лист. Важно понимать, что метод учитывает уже выведенные в ТабличныйДокумент данные.
Для того чтобы область переносилась целиком, мы должны выполнять проверку непосредственно перед её выводом в итоговый документ. Проанализируем типичный код, который решает эту задачу:
// Предположим, ТабДок — это итоговый табличный документ
// ОбластьМакета — область, которую мы хотим вывести
МассивОбластей = Новый Массив;
МассивОбластей.Добавить(ОбластьМакета);
Если Не ТабДок.ПроверитьВывод(МассивОбластей) Тогда
// Если область не влезает, принудительно вставляем разрыв страницы
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
// Теперь выводим саму область
ТабДок.Вывести(ОбластьМакета);
Рассмотрим подробнее, почему мы используем Массив. Хотя метод ПроверитьВывод() может принимать одну область, передача массива считается более правильной практикой. Это позволяет проверять сразу группу областей (например, заголовок и первую строку таблицы), чтобы они гарантированно не разделялись при печати.
Метод ПроверитьВывод() крайне чувствителен к настройкам страницы табличного документа. Если вызовем его до того, как определим параметры печати, результат может быть непредсказуемым, так как расчет будет производиться по настройкам «по умолчанию». Проанализируем, какие параметры необходимо установить заранее:
ТабДок.АвтоМасштаб = Истина позволяет системе вписывать данные по ширине листа. Это напрямую влияет на то, сколько строк поместится по высоте.Посмотрим на пример правильной инициализации документа перед проверкой:
ТабДок = Новый ТабличныйДокумент;
ТабДок.АвтоМасштаб = Истина;
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДок.ПолеСверху = 10;
ТабДок.ПолеСнизу = 10;
// Только после этого вызываем ПроверитьВывод() в цикле формирования
Существует специфическая ситуация: если сама область макета по высоте больше, чем чистый лист А4, метод ПроверитьВывод() всегда будет возвращать Ложь. В этом случае программа может войти в цикл вставки бесконечных пустых страниц. Чтобы избежать этого, выясним причину и добавим дополнительное условие.
Логично добавлять разделитель страниц только в том случае, если в табличном документе уже есть хоть какие-то данные. Проверим это через свойство ВысотаТаблицы:
// Проверяем, что документ не пустой И область не влезает
Если ТабДок.ВысотаТаблицы > 0 И Не ТабДок.ПроверитьВывод(МассивОбластей) Тогда
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
Таким образом, если первая же область документа оказывается слишком большой, она просто начнет выводиться с первой страницы, а разрыв не будет вставлен перед ней.
Иногда макет состоит из множества мелких секций, которые выводятся динамически (например, строки дерева значений с группировками). Проверить их «пачкой» через Массив может быть сложно. В таких случаях программисты 1С используют метод фиктивного табличного документа.
Рассмотрим этот метод:
Мы создаем временный ТабличныйДокумент, выводим в него весь сложный блок, а затем проверяем, поместится ли этот временный документ целиком в основной. Это гарантирует, что сложная логическая структура не будет разорвана в самом неподходящем месте.
На практике метод ПроверитьВывод() иногда ошибается на 1–2 строки. Это связано с тем, что разные принтеры имеют разные «непечатные зоны». Чтобы перестраховаться и сделать вывод более надежным, рекомендуется добавить небольшой «запас».
Один из способов — добавить в массив для проверки дополнительную пустую область (строку) небольшой высоты. Если поместится основная область плюс эта «запасная» строка, значит, основная область точно не будет разорвана драйвером принтера в последний момент.
Для качественного формирования печатных форм в 1С следует придерживаться следующих правил:
АвтоМасштаб и поля до начала вывода данных.ПроверитьВывод() перед выводом каждой логически завершенной секции макета.ВывестиГоризонтальныйРазделительСтраниц().ВысотаТаблицы, чтобы не плодить пустые листы в начале документа.Соблюдение этих простых рекомендаций позволит вам создавать профессиональные отчеты и документы, которые будут корректно выглядеть на бумаге независимо от объема выводимых данных. Для изучения архитектуры формирования документов можно использовать пример внешней печатной формы на БСП.