Почему таблица в печатной форме 1С "рвется" и переносится на новую страницу с большими пустыми полями?

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

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

Проанализируем типичную ситуацию: в конфигурации 1С:УНФ через расширение была доработана печатная форма "Счет на оплату". Изменения были минимальны — добавили логотип и поменяли местами некоторые области в макете. После этого при большом количестве номенклатуры в счете печать "расползается" на несколько страниц с пустыми местами. Проблема кроется в нарушении логики вывода табличного документа.

Основная причина — некорректная работа с функцией `ПроверитьВывод`

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

Алгоритм вывода строк табличной части обычно выглядит так:

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

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

Как найти и исправить ошибку: пошаговая инструкция

Разберем по шагам, как диагностировать и решить проблему.

Шаг 1. Находим код формирования печатной формы

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

Шаг 2. Анализируем цикл вывода строк

Внутри этой процедуры найдите цикл, который обходит строки табличной части документа. Чаще всего это цикл вида Для Каждого ТекСтрокаТовары Из СсылкаНаОбъект.Товары Цикл.

Шаг 3. Ищем вызов `ПроверитьВывод`

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


// Создаем массив для проверки
МассивОбластейДляПроверки = Новый Массив;
МассивОбластейДляПроверки.Добавить(ОбластьМакетаСтрока);
МассивОбластейДляПроверки.Добавить(ОбластьМакетаПодвал); // Например, если подвал должен идти вместе со строкой

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

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

Шаг 4. Корректируем состав массива для проверки

Это самый важный этап. Вам нужно убедиться, что в массив МассивОбластейДляПроверки добавляются все области, которые должны быть выведены как единый, неразрывный блок. Если вы добавили в макет новую область, которая должна выводиться после каждой строки, ее тоже нужно добавить в этот массив для корректной проверки.

Важный нюанс: если после таблицы должен идти общий подвал с итогами, то проверять нужно не только следующую строку табличной части, но и эту строку вместе с подвалом. Иначе может случиться так, что последняя строка на странице поместится, а подвал уже нет. В итоге подвал "улетит" на следующую страницу, оставив на предыдущей пустое место.

Дополнительные аспекты, на которые стоит обратить внимание

Если проверка кода не дала результатов, проблема может быть глубже.

Лучшая практика: используйте Внешние Печатные Формы (ВПФ)

Участники обсуждения на форуме совершенно справедливо советуют для доработок печатных форм использовать механизм Внешних печатных форм (ВПФ). Этот подход имеет массу преимуществ перед доработкой через расширение:

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

← На главную