Как перенести подвал печатной формы на следующую страницу в 1С 7.7?

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

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

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

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

Разберем самый простой и быстрый метод, не требующий написания сложного кода. Он основан на встроенных возможностях визуального редактора таблиц 1С 7.7.

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

  1. Выделим все строки секции подвала, кроме самой последней строки.
  2. В верхнем меню откроем параметры ячеек и установим флажок «Вместе со следующим» (или «Печать со следующим»).
  3. Для правильной связки табличной части с подвалом создадим две секции для строк таблицы:
    • Секция_Строка: стандартная секция, которая выводится для всех строк табличной части, кроме последней.
    • Секция_Строка_Последняя: идентичная по структуре секция, но с включенным свойством «Вместе со следующим». Она выводится ровно один раз — для последней строки документа.

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

Способ 2. Двухпроходный вывод с использованием метода КоличествоСтраниц()

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

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

  1. Создадим две таблицы в коде: основную (которую увидят пользователи) и вспомогательную (тестовую).
  2. Перед выводом очередного блока или подвала выведем его во вспомогательную таблицу.
  3. Проверим значение метода КоличествоСтраниц() у вспомогательной таблицы до и после вывода блока.
  4. Если количество страниц увеличилось, значит, выводимая область вызывает перенос на новый лист. В таком случае в основную таблицу перед выводом подвала программно вставляем разделитель страниц с помощью метода НоваяСтраница().

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


// Создаем основную и тестовую таблицы
Таб = СоздатьОбъект("Таблица");
ТестТаб = СоздатьОбъект("Таблица");

// Загружаем макет в обе таблицы
Таб.ИсходнаяТаблица("Макет");
ТестТаб.ИсходнаяТаблица("Макет");

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

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

ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
    Таб.ВывестиСекцию("Строка");
    ТестТаб.ВывестиСекцию("Строка");
КонецЦикла;

// Проверяем вывод подвала
СтрДо = ТестТаб.КоличествоСтраниц();
ТестТаб.ВывестиСекцию("Подвал");
СтрПосле = ТестТаб.КоличествоСтраниц();

// Если количество страниц увеличилось, принудительно переносим подвал
Если СтрПосле > СтрДо Тогда
    Таб.НоваяСтраница();
КонецЕсли;

Таб.ВывестиСекцию("Подвал");
Таб.Показать();

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

Способ 3. Программный расчет высоты строк при изменении текста

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

Выясним, как работает функция расчета высоты строки на основе массива ширин символов:


Функция ПолучитьВысотуСтроки(ТекстСтроки, ШиринаСтолбца, СписокШиринШрифта)
    Длина = 0;
    Пробел = 0;
    КоличествоСтрок = 1;
    
    Для Х = 1 По СтрДлина(ТекстСтроки) Цикл
        КодСимвола = КодСимв(Сред(ТекстСтроки, Х, 1));
        Если КодСимвола = 32 Тогда 
            Пробел = Длина; 
        КонецЕсли;
        
        Длина = Длина + СписокШиринШрифта.ПолучитьЗначение(КодСимвола);
        Если Длина > ШиринаСтолбца Тогда
            Длина = ?(Пробел = 0, 0, Длина - Пробел);
            КоличествоСтрок = КоличествоСтрок + 1;
            Пробел = 0;
        КонецЕсли;
    КонецЦикла;
    
    // Возвращаем итоговую высоту в пунктах (базовая высота + добавочная за перенос)
    ВысотаБазовая = СписокШиринШрифта.ПолучитьЗначение(256);
    ВысотаПриращения = СписокШиринШрифта.ПолучитьЗначение(257);
    
    Возврат ВысотаБазовая + (КоличествоСтрок - 1) * ВысотаПриращения;
КонецФункции

Этот метод требует предварительной подготовки таблицы ширин для конкретного гарнитура и размера шрифта (например, Arial 8pt), но позволяет с высокой точностью определять момент достижения границы печатного листа.

← На главную