При формировании печатной формы Универсального передаточного документа (УПД) в типовых конфигурациях (например, УПП 1.3 или Комплексная автоматизация) нередко возникает неприятная ситуация. В режиме редактирования или при визуальной оценке табличного документа видно, что весь текст должен уместиться, например, на 3 листах. Однако при открытии предварительного просмотра или отправке на принтер документ неожиданно выводится на 5 или 6 страницах. При этом последняя строка номенклатуры может «улетать» на отдельный лист без шапки и подвала, а итоговая часть документа переносится некорректно.
Разберем причины, по которым встроенные механизмы платформы 1С дают сбой при расчете переноса страниц, и рассмотрим рабочие способы устранения данной ошибки.
В типовых конфигурациях деление табличного документа на страницы выполняется программно с использованием метода ПроверитьВывод(). Проанализируем типичный алгоритм формирования печатной формы:
// Проверим возможность вывода табличного документа
СтрокаСПодвалом = Новый Массив;
СтрокаСПодвалом.Добавить(ОбластьМакета);
Если НомерСтроки = КоличествоСтрок Тогда
// Если последняя строка, то должен поместиться итог и подвал
СтрокаСПодвалом.Добавить(ОбластьМакетаИтого);
СтрокаСПодвалом.Добавить(ОбластьМакетаПодвал);
Если ЭтоПечатьУПД Тогда
СтрокаСПодвалом.Добавить(ОбластьМакетаПодвалНакладной);
КонецЕсли;
КонецЕсли;
#Если Сервер ИЛИ ВнешнееСоединение Тогда
РезультатПроверкиВывода = ФормированиеПечатныхФормСервер.ПроверитьВыводТабличногоДокумента(ТабДокумент, СтрокаСПодвалом);
#ИначеЕсли ТолстыйКлиентОбычноеПриложение Тогда
РезультатПроверкиВывода = ФормированиеПечатныхФорм.ПроверитьВыводТабличногоДокумента(ТабДокумент, СтрокаСПодвалом);
#КонецЕсли
Если НЕ РезультатПроверкиВывода Тогда
Если КоличествоСтрок > 0 Тогда
// Вывод разделителя и заголовка таблицы на новой странице
ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
ТабДокумент.Вывести(ОбластьМакетаЗаголовокТаблицы);
КоличествоСтраниц = КоличествоСтраниц + 1;
КонецЕсли;
КонецЕсли;
Метод ТабДокумент.ПроверитьВывод() возвращает Истина, если переданный массив областей макета физически помещается на текущей странице, и Ложь, если требуется перенос. Однако на практике метод может вернуть Истина, посчитав, что строка помещается, а при финальном рендеринге в окне предварительного просмотра строка выталкивается за границы листа. В результате платформа автоматически создает дополнительный разрыв, на который переносится всего одна строка без повтора шапки таблицы.
#Если Сервер), метод ориентируется на параметры принтера по умолчанию, установленного на сервере 1С:Предприятия. Клиентский принтер может иметь другие непечатные поля и настройки формата бумаги (например, Letter вместо A4).ИмяПараметровПечати. Если пользователь ранее вручную менял поля, масштаб или ориентацию в диалоге печати, они применяются к предпросмотру, но могут не учитываться кодом при первоначальном заполнении.ПроверитьВывод() производит проверку по стандартным системным полям (10 мм), что искажает результат.Самый быстрый способ устранить проблему в типовой конфигурации без внесения правок в программный код — скорректировать параметры страницы через диалог предварительного просмотра или настройки печати:
Увеличение боковых полей заставляет алгоритм ПроверитьВывод() раньше определять нехватку места по вертикали, а уменьшенные верхние и нижние поля гарантируют, что проверенная область гарантированно уместится на физическом листе.
Если печатную форму необходимо настроить гарантированно для всех пользователей, выполним программную корректировку формирования табличного документа:
ТабДокумент.РазмерСтраницы = "A4";
ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДокумент.ПолеСверху = 5;
ТабДокумент.ПолеСнизу = 5;
ТабДокумент.ПолеСлева = 10;
ТабДокумент.ПолеСправа = 10;
ТабДокумент.ОтображатьКолонтитулы = Ложь;
ТабДокумент.АвтоМасштаб = Истина;
Убедимся, что области подвала и строк таблицы передаются в метод ПроверитьВывод() только после того, как в них подставлены реальные текстовые значения параметров (ФИО, должности, основания). Только тогда платформа рассчитает точную высоту ячеек с учетом автоматического переноса строк.
ПовторятьПриПечатиСтроки:
Чтобы избежать появления строк без заголовка таблицы при непредвиденном разрыве, передадим управление повтором шапки встроенному механизму платформы вместо ручной вставки разделителей:
ТабДокумент.ПовторятьПриПечатиСтроки = ТабДокумент.Область("ШапкаТаблицы");
В этом случае платформа автоматически продублирует заголовок на каждой новой странице, если строка перенесется естественным образом.