При разработке печатных форм часто возникает задача вывода промежуточных итогов (например, «Итого по странице» или «Перенос») в нижней части каждого печатного листа. Это особенно актуально для многостраничных документов, таких как товарные накладные, акты или ведомости, где пользователю важно видеть сумму накопленных данных на текущем листе. В рамках этой статьи мы разберем механизмы платформы 1С, позволяющие решить эту задачу, проанализируем типичные ошибки и рассмотрим лучшие практики разработки.
Для того чтобы понять, уместится ли очередная строка на текущей странице, в 1С используется метод ПроверитьВывод() объекта ТабличныйДокумент. Этот метод позволяет имитировать вывод набора областей макета и возвращает булево значение: Истина, если области помещаются, и Ложь, если происходит переход на новую страницу.
Рассмотрим алгоритм реализации постраничных итогов по шагам:
ПроверитьВывод(), передавая этот массив.Проанализируем пример кода, который позволяет динамически отслеживать заполнение страницы и выводить промежуточные суммы. Обратите внимание на порядок добавления областей в массив для проверки.
// Инициализация переменных
ИтогПоСтранице = 0;
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МойМакет");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьИтогов = Макет.ПолучитьОбласть("ИтогиСтраницы");
// Выводим заголовок документа и шапку таблицы в начале
ТабДок.Вывести(Макет.ПолучитьОбласть("Заголовок"));
ТабДок.Вывести(ОбластьШапкаТаблицы);
Для Каждого СтрокаДанных Из ТаблицаТоваров Цикл
// Заполняем параметры строки
ОбластьСтрока.Параметры.Заполнить(СтрокаДанных);
// Подготовка массива для проверки вывода
// Важно: проверяем сразу строку и область итога, чтобы итог не «оторвался»
МассивПроверки = Новый Массив;
МассивПроверки.Добавить(ОбластьСтрока);
МассивПроверки.Добавить(ОбластьИтогов);
Если Не ТабДок.ПроверитьВывод(МассивПроверки) Тогда
// Если не влезает — выводим итог по текущей странице
ОбластьИтогов.Параметры.СуммаПоСтранице = ИтогПоСтранице;
ТабДок.Вывести(ОбластьИтогов);
// Переходим на новую страницу
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
// Повторяем шапку таблицы на новом листе
ТабДок.Вывести(ОбластьШапкаТаблицы);
// Сбрасываем промежуточный итог
ИтогПоСтранице = 0;
КонецЕсли;
// Выводим саму строку и накапливаем сумму
ТабДок.Вывести(ОбластьСтрока);
ИтогПоСтранице = ИтогПоСтранице + СтрокаДанных.Сумма;
КонецЦикла;
// В конце выводим итог по последней странице
ОбластьИтогов.Параметры.СуммаПоСтранице = ИтогПоСтранице;
ТабДок.Вывести(ОбластьИтогов);
Выясним причины, по которым механизм может работать некорректно, основываясь на опыте практикующих разработчиков:
ИтогПоСтранице = 0 внутри тела цикла без условия. Это приводит к тому, что в итог попадает значение только последней выведенной строки. Переменная должна инициализироваться до цикла.Если Не ПроверитьВывод) останутся без подвала.ОбластьСтрока, может возникнуть ситуация, когда строка на страницу поместилась, а область итога — уже нет. В итоге подвал с суммами перенесется на чистый лист, что выглядит непрофессионально. Всегда добавляйте в массив проверки область итога.АвтоМасштаб, метод ПроверитьВывод() может давать погрешность. Рекомендуется сначала настроить все параметры страницы (поля, ориентацию), и только потом начинать вывод строк.Рассмотрим подробнее ситуации, требующие более сложной логики:
1. Нарастающий итог. В некоторых формах требуется выводить не только сумму «по листу», но и «всего с начала документа». Для этого создайте вторую переменную, которую не нужно обнулять при переходе на новую страницу. Выводите её значение в ту же область итогов под именем «Нарастающий итог».
2. Использование БСП (Библиотеки стандартных подсистем). В современных конфигурациях 1С (например, ERP, УТ 11, БП 3.0) формирование печатных форм реализовано через общие модули управления печатью. Прежде чем писать сложный цикл вручную, проверьте методы модуля УправлениеПечатью. Там существуют готовые процедуры для формирования табличных частей с переносом итогов, что значительно упрощает поддержку кода. В качестве основы для разработки можно использовать шаблон внешней печатной формы на БСП с выводом подписей.
3. Предотвращение «висячих» строк. Рассмотрим ситуацию: последняя строка товара выводится на страницу, а за ней должен идти большой финальный подвал с подписями ответственных лиц. Если подвал не влезает, он уйдет на новый лист один. Чтобы этого избежать, при проверке вывода последней строки в массив областей нужно добавить не только «Итог по странице», но и весь финальный подвал документа. Тогда платформа перенесет последнюю строку вместе с подписями на новый лист, сохранив целостность документа.
4. Оптимизация производительности. Создание нового массива Новый Массив на каждой итерации цикла при тысячах строк может замедлить формирование отчета. Проанализируем способ оптимизации: создайте массив один раз перед циклом, добавьте в него области, а внутри цикла просто вызывайте метод проверки. Сами области в памяти не дублируются, обновляются только их параметры.
Реализация постраничных итогов — это классическая задача, требующая внимательности к деталям работы с табличным документом. Основным инструментом здесь выступает ПроверитьВывод(), а главным залогом успеха — правильное управление переменными-счетчиками и корректное формирование массива проверяемых областей. Используя предложенные шаблоны кода, вы сможете создавать профессиональные и удобные для чтения печатные формы.