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