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