Как найти и убрать разделители страниц в табличном документе 1С

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

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

Понятие ручных разделителей страниц

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

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

Как программно удалить разделители страниц

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


Для Инд = НомерНачальнойСтроки По НомерКонечнойСтроки Цикл
    ТекОбласть = ТабДок.Область(Инд, , Инд, ); 
    ТекОбласть.НачалоСтраницы = Ложь;
    ТекОбласть.КонецСтраницы = Ложь;
КонецЦикла;

В этом примере мы создаем объект Область для каждой конкретной строки. Указывая параметры в методе Область(Инд, , Инд, ), мы выделяем всю строку целиком. После этого принудительно устанавливаем свойства НачалоСтраницы и КонецСтраницы в значение Ложь.

Оптимизация работы с большими документами

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

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


ТабДок.Область().НачалоСтраницы = Ложь;
ТабДок.Область().КонецСтраницы = Ложь;

Однако стоит учитывать, что прямое присваивание всей области иногда может игнорироваться, если свойства были заданы для конкретных строк очень жестко. В таких случаях цикл остается самым надежным методом. Чтобы минимизировать количество операций записи, можно добавить проверку:


Для Инд = 1 По ТабДок.ВысотаТаблицы Цикл
    ТекОбласть = ТабДок.Область(Инд, , Инд, ); 
    Если ТекОбласть.НачалоСтраницы Тогда
        ТекОбласть.НачалоСтраницы = Ложь;
    КонецЕсли;
    Если ТекОбласть.КонецСтраницы Тогда
        ТекОбласть.КонецСтраницы = Ложь;
    КонецЕсли;
КонецЦикла;

Такой подход позволяет не перезаписывать свойства там, где они и так имеют значение Ложь, что в некоторых версиях платформы работает быстрее.

Автоматические разделители и метод ПроверитьВывод

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

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

Пример использования ПроверитьВывод():


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

Дополнительные свойства: ВместеССледующим

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

Вертикальные разделители

Не забудем и про вертикальные разрывы. Если ваш документ слишком широкий, он будет разбиваться на страницы по горизонтали. Для управления этими разрывами используются свойства:

Принцип работы с ними абсолютно идентичен работе со строками, только обращаться нужно к колонкам табличного документа.

Влияние на экспорт в PDF и Excel

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

Как узнать общее количество страниц

Если ваша задача — просто получить информацию о том, сколько страниц занимает документ, используйте метод КоличествоСтраниц(). Он возвращает число листов с учетом всех текущих настроек печати. Это гораздо эффективнее, чем пытаться программно вычислить положение каждого разрыва.

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

← На главную