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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке собственных печатных форм в среде 1С:Предприятие часто возникает задача динамического контроля того, сколько строк табличной части поместится на одну страницу документа. Проблема заключается в том, что высота строки может варьироваться из-за переноса текста, а макеты содержат не только строки данных, но и шапки, подвалы и итоги. Давайте разберем, как правильно реализовать этот механизм.

Понимание ограничений и подходов

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

Реализация постраничного вывода через метод ПроверитьВывод

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

Для реализации этого механизма выполним следующие шаги:

  1. Подготовим ТабличныйДокумент и выведем в него заголовок (шапку).
  2. В цикле будем добавлять строки табличной части.
  3. Перед каждой итерацией или группой строк будем вызывать ПроверитьВывод, передавая массив областей.
  4. Если метод возвращает Ложь, значит, место на странице закончилось. Мы принудительно выводим подвал (итоги по странице), добавляем разделитель страниц, выводим новую шапку и продолжаем заполнение.

Посмотрим на пример кода, который реализует данный алгоритм:


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

// Выводим строку данных
ТабДокумент.Вывести(ОбластьСтроки);

Важные нюансы работы

Работая с ПроверитьВывод, важно учитывать несколько критических аспектов, которые помогут избежать «прыгающей» верстки:

Почему не стоит пытаться считать строки вручную?

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

Рекомендация по использованию типовых механизмов

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

← На главную