Почему при печати УПД в 1С документ разбивается на лишние страницы и как это исправить?

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При формировании печатной формы Универсального передаточного документа (УПД) в типовых конфигурациях (например, УПП 1.3 или Комплексная автоматизация) нередко возникает неприятная ситуация. В режиме редактирования или при визуальной оценке табличного документа видно, что весь текст должен уместиться, например, на 3 листах. Однако при открытии предварительного просмотра или отправке на принтер документ неожиданно выводится на 5 или 6 страницах. При этом последняя строка номенклатуры может «улетать» на отдельный лист без шапки и подвала, а итоговая часть документа переносится некорректно.

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

Анализ типового механизма проверки вывода строк

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


// Проверим возможность вывода табличного документа
СтрокаСПодвалом = Новый Массив;
СтрокаСПодвалом.Добавить(ОбластьМакета);
Если НомерСтроки = КоличествоСтрок Тогда
    // Если последняя строка, то должен поместиться итог и подвал
    СтрокаСПодвалом.Добавить(ОбластьМакетаИтого);
    СтрокаСПодвалом.Добавить(ОбластьМакетаПодвал);
    Если ЭтоПечатьУПД Тогда
        СтрокаСПодвалом.Добавить(ОбластьМакетаПодвалНакладной);
    КонецЕсли;
КонецЕсли;

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

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

Причины расхождения между проверкой вывода и реальной печатью

  1. Разница в драйверах и контексте выполнения: Если расчет выполняется на сервере (в контексте #Если Сервер), метод ориентируется на параметры принтера по умолчанию, установленного на сервере 1С:Предприятия. Клиентский принтер может иметь другие непечатные поля и настройки формата бумаги (например, Letter вместо A4).
  2. Пользовательские параметры печати: Платформа кэширует настройки страниц по свойству ИмяПараметровПечати. Если пользователь ранее вручную менял поля, масштаб или ориентацию в диалоге печати, они применяются к предпросмотру, но могут не учитываться кодом при первоначальном заполнении.
  3. Порядок установки свойств: Если параметры страницы (поля, колонтитулы) задаются в самом конце процедуры печати, метод ПроверитьВывод() производит проверку по стандартным системным полям (10 мм), что искажает результат.
  4. Автовысота строк и длинный текст: В подвале УПД часто выводятся расшифровки подписей, доверенности и длинные наименования должностей. Если для ячеек включено свойство «Переносить», реальная высота области увеличивается только после заполнения фактическими данными. Если проверять пустой макет до заполнения параметров, метод сочтет его высоту минимальной.
  5. Ненулевые колонтитулы: По умолчанию колонтитулы резервируют дополнительное пространство сверху и снизу листа, уменьшая полезную высоту области печати.

Способ 1. Корректировка параметров страницы (без изменения конфигурации)

Самый быстрый способ устранить проблему в типовой конфигурации без внесения правок в программный код — скорректировать параметры страницы через диалог предварительного просмотра или настройки печати:

  1. Установите поля документа: Верхнее и Нижнее сделайте по 5 мм, а Левое и Правое увеличьте до 20–30 мм.
  2. Установите размер верхнего и нижнего колонтитулов в 0 мм (или отключите их отображение).
  3. В параметрах масштабирования выберите режим «По ширине листа» (Автомасштаб).

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

Способ 2. Программная доработка макета и вывода

Если печатную форму необходимо настроить гарантированно для всех пользователей, выполним программную корректировку формирования табличного документа:

  1. Инициализируйте параметры страницы до начала цикла вывода строк:
    
    ТабДокумент.РазмерСтраницы = "A4";
    ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
    ТабДокумент.ПолеСверху = 5;
    ТабДокумент.ПолеСнизу = 5;
    ТабДокумент.ПолеСлева = 10;
    ТабДокумент.ПолеСправа = 10;
    ТабДокумент.ОтображатьКолонтитулы = Ложь;
    ТабДокумент.АвтоМасштаб = Истина;
    
  2. Заполняйте параметры областей перед проверкой:

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

  3. Использование свойства ПовторятьПриПечатиСтроки:

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

    ТабДокумент.ПовторятьПриПечатиСтроки = ТабДокумент.Область("ШапкаТаблицы");

    В этом случае платформа автоматически продублирует заголовок на каждой новой странице, если строка перенесется естественным образом.

← На главную