Как рассчитать итоги по страницам в печатной форме 1С 7.7?

Программист 1С v7.7
← На главную

В платформе 1С:Предприятие 7.7, в отличие от более современных версий, отсутствуют штатные механизмы автоматического подсчета итогов по страницам в табличных документах. Эта задача часто возникает при формировании многостраничных документов, таких как ТОРГ-12, счета-фактуры или реестры, где требования нормативных актов обязывают указывать промежуточные суммы "Итого по странице". Разберем по шагам, как реализовать этот функционал программно, проанализируем возможные подходы и выясним причины типичных ошибок.

Метод 1: Подсчет фиксированного количества строк

Это самый простой и распространенный метод. Он основан на предположении, что на одну страницу формата А4 помещается определенное количество строк (например, 25 или 40). Рассмотрим подробнее реализацию этого метода. Нам понадобятся переменные для накопления суммы по странице и счетчик выведенных строк.

Проанализируем пример кода, который позволяет выводить секцию итогов после каждых 40 строк товара:


// Перед началом цикла инициализируем переменные
СчетчикСтрок = 0;
ИтогоПоСтранице = 0;

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

Важный момент: Как справедливо заметили участники обсуждения, после завершения цикла необходимо проверить, остались ли "незакрытые" строки на последней странице. Если общее количество строк не кратно 40, итог для последнего листа не будет выведен внутри цикла. Поэтому обязательно добавляем проверку после оператора КонецЦикла:


Если СчетчикСтрок > 0 Тогда
    Таб.ВывестиСекцию("ИтогоПоСтранице");
КонецЕсли;

Метод 2: Динамический расчет высоты строк

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

Рассмотрим алгоритм более точного позиционирования:

  1. Создадим переменную для накопления текущей высоты выведенных секций в пикселях или условных единицах.
  2. Перед выводом каждой секции будем проверять ее высоту.
  3. Сравним накопленную высоту с максимально допустимой высотой страницы.

Посмотрим на пример логики:


ТекущаяВысота = ВысотаШапкиДокумента; 
МаксВысотаСтраницы = 800; // Определяется экспериментально для конкретного принтера и полей

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

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

Метод 3: Использование внешних компонент (FormEx, Йоксель)

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

Рекомендации по оформлению итогов

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

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

Полезный совет: Чтобы избежать "висящих" строк, когда на последней странице выводится только подвал с подписями без единой строки товара, используйте резервирование места. При расчете высоты страницы всегда добавляйте к высоте текущей строки высоту секции Итого и секции Подвал. Если они вместе не помещаются — делайте разрыв страницы заранее.

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

← На главную