Как посчитать количество строк и итоги по каждой странице при печати в 1С?

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет
← На главную

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

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

Главный инструмент для решения нашей задачи — метод табличного документа ПроверитьВывод(). Этот метод позволяет «спросить» у системы: «Влезет ли указанный массив областей на текущую страницу с учетом текущих настроек принтера, полей и масштаба?». Если ответ отрицательный, мы понимаем, что текущую страницу нужно закрыть, вывести итоги и начать новую.

Рассмотрим алгоритм реализации этой логики по шагам:

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

Проанализируем пример кода, реализующий эту логику:


// Инициализируем общие итоги и переменные страницы
ИтогоПоСтраницеСумма = 0;
ИтогоПоСтраницеКолСтрок = 0;
НомерСтрокиНаСтранице = 0;

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

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

Метод «Виртуального» документа

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

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

Важные нюансы и технические ограничения

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

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

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

3. Резервирование места под подвал. Как показано в примере кода, мы всегда добавляем ОбластьПодвалСтраницы в массив для проверки. Это гарантирует, что на странице не останется «одинокая» строка без итогов, и сами итоги не перенесутся на пустой лист.

Особенности для инвентаризации ОС

Для документов типа «Инвентаризационная опись» часто требуется выводить итоги не просто цифрами, а прописью. Для этого в момент закрытия страницы (внутри условия Если Не ТабДок.ПроверитьВывод) используйте стандартную функцию ЧислоПрописью(). Например:


ОбластьПодвалСтраницы.Параметры.ИтогКоличестваПрописью = ЧислоПрописью(ИтогоПоСтраницеКолСтрок, , "порядковых номеров");

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

Подведем итог: для корректного подсчета строк и сумм на каждой странице необходимо использовать построчный вывод в цикле с обязательной предварительной проверкой массива областей (строка + подвал). Только такой подход гарантирует правильное визуальное разделение данных по листам печатной формы.

← На главную