Как реализовать вывод промежуточных итогов по каждой странице в печатной форме 1С

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

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

Основной механизм: Метод ПроверитьВывод()

Для того чтобы понять, уместится ли очередная строка на текущей странице, в 1С используется метод ПроверитьВывод() объекта ТабличныйДокумент. Этот метод позволяет имитировать вывод набора областей макета и возвращает булево значение: Истина, если области помещаются, и Ложь, если происходит переход на новую страницу.

Рассмотрим алгоритм реализации постраничных итогов по шагам:

  1. Создаем переменную для накопления итога по странице и обнуляем ее перед началом цикла.
  2. В цикле обхода данных заполняем область строки макета.
  3. Формируем массив областей, которые должны уместиться вместе (сама строка + подвал с итогами по странице).
  4. Вызываем ПроверитьВывод(), передавая этот массив.
  5. Если области не помещаются, выводим итог по странице, вставляем разделитель и шапку таблицы на новой странице, после чего обнуляем счетчик.
  6. Выводим строку в табличный документ и прибавляем значение к итогу.

Пример программной реализации

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


// Инициализация переменных
ИтогПоСтранице = 0;
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МойМакет");

ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьИтогов = Макет.ПолучитьОбласть("ИтогиСтраницы");

// Выводим заголовок документа и шапку таблицы в начале
ТабДок.Вывести(Макет.ПолучитьОбласть("Заголовок"));
ТабДок.Вывести(ОбластьШапкаТаблицы);

Для Каждого СтрокаДанных Из ТаблицаТоваров Цикл
    
    // Заполняем параметры строки
    ОбластьСтрока.Параметры.Заполнить(СтрокаДанных);
    
    // Подготовка массива для проверки вывода
    // Важно: проверяем сразу строку и область итога, чтобы итог не «оторвался»
    МассивПроверки = Новый Массив;
    МассивПроверки.Добавить(ОбластьСтрока);
    МассивПроверки.Добавить(ОбластьИтогов);
    
    Если Не ТабДок.ПроверитьВывод(МассивПроверки) Тогда
        
        // Если не влезает — выводим итог по текущей странице
        ОбластьИтогов.Параметры.СуммаПоСтранице = ИтогПоСтранице;
        ТабДок.Вывести(ОбластьИтогов);
        
        // Переходим на новую страницу
        ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
        
        // Повторяем шапку таблицы на новом листе
        ТабДок.Вывести(ОбластьШапкаТаблицы);
        
        // Сбрасываем промежуточный итог
        ИтогПоСтранице = 0;
        
    КонецЕсли;
    
    // Выводим саму строку и накапливаем сумму
    ТабДок.Вывести(ОбластьСтрока);
    ИтогПоСтранице = ИтогПоСтранице + СтрокаДанных.Сумма;
    
КонецЦикла;

// В конце выводим итог по последней странице
ОбластьИтогов.Параметры.СуммаПоСтранице = ИтогПоСтранице;
ТабДок.Вывести(ОбластьИтогов);

Разбор типичных ошибок при разработке

Выясним причины, по которым механизм может работать некорректно, основываясь на опыте практикующих разработчиков:

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

Продвинутые техники и оптимизация

Рассмотрим подробнее ситуации, требующие более сложной логики:

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

2. Использование БСП (Библиотеки стандартных подсистем). В современных конфигурациях 1С (например, ERP, УТ 11, БП 3.0) формирование печатных форм реализовано через общие модули управления печатью. Прежде чем писать сложный цикл вручную, проверьте методы модуля УправлениеПечатью. Там существуют готовые процедуры для формирования табличных частей с переносом итогов, что значительно упрощает поддержку кода. В качестве основы для разработки можно использовать шаблон внешней печатной формы на БСП с выводом подписей.

3. Предотвращение «висячих» строк. Рассмотрим ситуацию: последняя строка товара выводится на страницу, а за ней должен идти большой финальный подвал с подписями ответственных лиц. Если подвал не влезает, он уйдет на новый лист один. Чтобы этого избежать, при проверке вывода последней строки в массив областей нужно добавить не только «Итог по странице», но и весь финальный подвал документа. Тогда платформа перенесет последнюю строку вместе с подписями на новый лист, сохранив целостность документа.

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

Заключение

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

← На главную