Как предотвратить разрыв секций и перенос подвала на новую страницу в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

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

Способ 1. Использование свойства «Вместе со следующим» в макете таблицы

Самый простой и эффективный способ не допустить разрыва строк самого подвала — использование встроенного механизма управления положением строк на странице. Платформа 1С 7.7 позволяет запретить автоматический разрыв между определенными строками макета.

Разберем по шагам, как настроить строки секции в редакторе таблиц:

  1. Откроем макет печатной формы в конфигураторе или внешней обработке.
  2. Выделим строки подвала (блоки с суммами, расшифровками, полями подписей), кроме самой последней строки.
  3. В главном меню перейдем в пункт Таблица > Положение на странице.
  4. Установим флажок у свойства Вместе со следующим (Keep with next).
  5. Сохраним изменения в макете.

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

Способ 2. Защита от «висячего подвала» (привязка последней строки к подвалу)

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

Чтобы связать последнюю позицию номенклатуры с подвалом, применим следующую технику:

  1. В макете создадим две секции для вывода строк: стандартную секцию Строка и секцию-дублер СтрокаПоследняя.
  2. В секции СтрокаПоследняя выделим все строки и установим для них свойство Вместе со следующим.
  3. В программном коде вывода табличной части организуем проверку: пока перебираются обычные строки, выводим секцию Строка, а на последней итерации цикла вызываем секцию СтрокаПоследняя.

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


// Пример вывода табличной части с защитой от висячего подвала
ВсегоСтрок = Документ.КоличествоСтрок();
Счетчик = 0;

Документ.ВыбратьСтроки();
Пока Документ.ПолучитьСтроку() = 1 Цикл
    Счетчик = Счетчик + 1;
    
    // Заполняем параметры строки
    ПечНом = Счетчик;
    ПечТовар = Документ.Товар;
    ПечКоличество = Документ.Количество;
    ПечСумма = Документ.Сумма;
    
    Если Счетчик = ВсегоСтрок Тогда
        // Для последней строки выводим секцию, связанную со следующим блоком
        Таб.ВывестиСекцию("СтрокаПоследняя");
    Иначе
        Таб.ВывестиСекцию("Строка");
    КонецЕсли;
КонецЦикла;

// Выводим секцию подвала (ее строки уже связаны свойством "Вместе со следующим")
Таб.ВывестиСекцию("Подвал");

Способ 3. Программный контроль с помощью таблицы-черновика

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

Проанализируем алгоритм работы с черновой таблицей:

  1. Создаем основной объект таблицы Таб и скрытый служебный объект ТабЧерновик через СоздатьОбъект("Таблица").
  2. Задаем для обоих объектов абсолютно одинаковые параметры страницы с помощью метода ПараметрыСтраницы().
  3. Перед выводом очередного блока (или связки «последняя строка + подвал») выводим его сначала в служебную таблицу ТабЧерновик.
  4. Сравниваем значение метода КоличествоСтраниц() у черновика до и после вывода секции.
  5. Если число страниц увеличилось, значит, блок не помещается на текущем листе. В основную таблицу принудительно вставляем команду Таб.НоваяСтраница(), после чего выводим данные.

Рассмотрим пример кода с использованием контрольной таблицы:


Таб = СоздатьОбъект("Таблица");
ТабЧерновик = СоздатьОбъект("Таблица");

// Настраиваем идентичные параметры печати
Таб.ПараметрыСтраницы(1, 100, 1, 10, 10, 10, 10, 0, 0, 1);
ТабЧерновик.ПараметрыСтраницы(1, 100, 1, 10, 10, 10, 10, 0, 0, 1);

// Выводим шапку
Таб.ВывестиСекцию("Шапка");
ТабЧерновик.ВывестиСекцию("Шапка");

// Вывод строк документа
Документ.ВыбратьСтроки();
Пока Документ.ПолучитьСтроку() = 1 Цикл
    // Заполнение переменных секции
    ПечТовар = Документ.Товар;
    ПечСумма = Документ.Сумма;
    
    СтраницДо = ТабЧерновик.КоличествоСтраниц();
    ТабЧерновик.ВывестиСекцию("Строка");
    СтраницПосле = ТабЧерновик.КоличествоСтраниц();
    
    Если СтраницПосле > СтраницДо Тогда
        // Произошел перенос страницы в черновике
        Таб.НоваяСтраница();
    КонецЕсли;
    
    Таб.ВывестиСекцию("Строка");
КонецЦикла;

Ограничения и особенности платформы 1С 7.7

При работе с разрывами страниц в 1С 7.7 важно учитывать следующие технические нюансы:

  1. Суммарная высота блока: Если общая высота строк, связанных свойством Вместе со следующим, физически превышает высоту целого листа бумаги (с учетом полей), платформа проигнорирует ограничение и разорвет секцию либо сформирует пустой лист.
  2. Автовысота строк: Если для ячеек включен флаг «Переносить», метод ВысотаСтроки() возвращает 0, поэтому рассчитывать высоту строк вручную по пикселям не рекомендуется — лучше использовать метод с контролем КоличествоСтраниц().
  3. Драйвер принтера: Расчет разбивки на страницы в методе КоличествоСтраниц() напрямую зависит от установленного в операционной системе принтера по умолчанию. Для стабильного результата всегда инициализируйте параметры страницы программно перед формированием отчета.
← На главную