Почему некорректно срабатывает ВывестиГоризонтальныйРазделительСтраниц() в 1С и как это исправить

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

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

Суть проблемы: лишняя проверка одиночных областей

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

Посмотрим на исходный пример кода, с которым возникли сложности:


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

Выясним причину сбоя при выполнении данного алгоритма. Метод ТабличныйДокумент.Вывести() сам по себе автоматически переносит область на новую страницу, если она не помещается на текущем листе. Если при значении Ложь вручную вызывать ВывестиГоризонтальныйРазделительСтраниц(), в документ добавляется явный принудительный разрыв страницы. В результате платформа сперва ставит явный разделитель, а затем при выводе области при необходимости может перенести ее еще раз — получается лишняя пустая страница или некрасивый разрыв.

Правильные подходы к управлению разрывами страниц

Разберем по шагам, как исправить эту логику и сделать вывод печатной формы корректным.

1. Отказ от проверки одиночных областей

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

Уберем лишние проверки и упростим код:


Пока РезультатЗапросаТовары.Следующий() Цикл
    ОбластьСодержаниеТаблица.Параметры.Заполнить(РезультатЗапросаТовары);
    ТабличныйДокумент2.Вывести(ОбластьСодержаниеТаблица);
КонецЦикла;

2. Проверка связного комплекса областей

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

В таких ситуациях в массив для проверки нужно передавать обе области:


// Проверяем, поместятся ли вместе заголовок группы и первая строка данных
МассивПроверки = Новый Массив;
МассивПроверки.Добавить(ОбластьШапкаГруппы);
МассивПроверки.Добавить(ОбластьПерваяСтрока);

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

ТабличныйДокумент.Вывести(ОбластьШапкаГруппы);
ТабличныйДокумент.Вывести(ОбластьПерваяСтрока);

3. Порядок действий при выводе подвалов и шапок

Если проверка комплекта областей вернула Ложь, стандартный правильный алгоритм разрыва включает в себя несколько шагов:

  1. Вывести подвал текущей страницы (если предусмотрена сквозная нумерация или итоги по странице);
  2. Вызвать метод ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
  3. Вывести повторную шапку таблицы для новой страницы;
  4. Вывести проверяемые данные.

4. Использование свойства ПовторятьПриПечатиСтроки

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


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

Этот способ избавляет от необходимости писать сложную ручную логику с разделителями страниц и проверками вывода.

Важные нюансы: АвтоМасштаб и параметры печати

Проанализируем еще несколько факторов, влияющих на корректность работы метода ПроверитьВывод():

  1. Свойство АвтоМасштаб: Если у табличного документа установлено АвтоМасштаб = Истина, расчет высоты страниц в ПроверитьВывод() выполняется из расчета 100% масштаба, тогда как сам документ подгоняется под размер листа уже после полного формирования. Это может приводить к ошибкам расчета.
  2. Параметры страницы и драйвер принтера: Расчет геометрии листа зависит от полей (ПолеСверху, ПолеСнизу) и размера страницы. Перед вызовом проверки рекомендуется явно задать настройки печати табличного документа.
← На главную