Как правильно переносить подвал с печатями на новую страницу при сохранении табличного документа 1С в PDF?

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

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

Понимание работы метода ПроверитьВывод и его зависимость от настроек принтера

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

Однако, как выяснилось в ходе обсуждения (сообщения 4, 6, 8), поведение метода ПроверитьВывод может быть непредсказуемым при сохранении в PDF. Выясним причину:

  1. Зависимость от принтера: Несмотря на то что мы сохраняем документ в PDF, метод ПроверитьВывод фактически опирается на настройки текущего или заданного в документе принтера. Система 1С обращается к драйверу принтера, чтобы определить физические параметры страницы (размер бумаги, отступы, непечатаемые области), на которой должно быть расположено содержимое.
  2. Различия в настройках: Если настройки принтера по умолчанию на сервере или клиентской машине, где происходит генерация PDF, отличаются от тех, что используются для формирования PDF (например, виртуальный PDF-принтер или встроенный конвертер 1С), могут возникнуть расхождения. Принтер может иметь меньшую "рабочую" область печати из-за своих полей, чем та, что подразумевается для PDF.

Для устранения этой неопределенности, рекомендуем проверить и, при необходимости, программно установить параметры печати для табличного документа перед вызовом ПроверитьВывод:


ТабДокумент.ИмяПринтера = "Microsoft Print to PDF"; // Или имя другого PDF-принтера, если установлен
ТабДокумент.ПолеСлева = 10;
ТабДокумент.ПолеСверху = 10;
ТабДокумент.ПолеСправа = 10;
ТабДокумент.ПолеСнизу = 10;
// Можно также установить размер бумаги, ориентацию и другие параметры
// ТабДокумент.РазмерБумаги = РазмерБумаги.А4;
// ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;

Настроив параметры печати, мы минимизируем влияние внешних факторов и делаем поведение ПроверитьВывод более предсказуемым.

Решение 1: Точное управление переносом с помощью метода ПроверитьВывод и МассивОбластей

Вернемся к основному вопросу автора: как сделать так, чтобы область подвала на новую страницу переносилась только там, где она действительно не помещается, избегая при этом пустого пространства? Автор столкнулся с тем, что конструкция МассивОбластей.Добавить(ТабДокумент) (сообщение 7) приводит к тому, что подвал всегда выводится на новый лист, что неприемлемо. Это происходит потому, что при добавлении всего табличного документа в массив для проверки, система фактически пытается разместить весь документ на одной странице, и, конечно, это не удается, что приводит к принудительному разрыву.

Ключевым моментом здесь является правильное использование МассивОбластей. Как верно подметили в сообщении 2, в массив областей надо добавить не только сам подвал, но и область, которая непосредственно предшествует подвалу. Это позволяет системе оценить, поместятся ли обе эти области (последняя часть основной таблицы и подвал) вместе на текущей странице.

Давайте рассмотрим типичную структуру кода, которую мы модифицируем:


// ... вывод основной части табличного документа ...

// Получаем последнюю выведенную область, которая предшествует подвалу
// Важно: Эта переменная должна быть реально последней выведенной областью!
// Например, если основной документ выводится по строкам, то это будет последняя строка.
// В данном примере возьмем ее как 'СтрокаТабДок'
// Область ТабДокумент.Область("ИмяОбластиПоследнейСтроки")

МассивОбластей = Новый Массив();
МассивОбластей.Добавить(СтрокаТабДок); // Область, предшествующая подвалу
МассивОбластей.Добавить(Подвал);     // Сам подвал

Если Не ТабДокумент.ПроверитьВывод(МассивОбластей) Тогда
    ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ТабДокумент.Вывести(Подвал);

В сообщении 3 автор попытался реализовать это, но столкнулся с тем же результатом. Почему это могло произойти? Причин может быть несколько:

  1. Неправильно определена СтрокаТабДок: Переменная СтрокаТабДок должна действительно ссылаться на последнюю выведенную область перед подвалом. Если она пустая, или ссылается на какую-то другую область, или же на страницу уже выведена дополнительная информация после этой "последней строки", то проверка будет некорректной.
  2. Размер областей: Даже если СтрокаТабДок определена верно, их суммарная высота (вместе с подвалом) может быть больше, чем оставшееся свободное место на странице, особенно с учетом полей принтера.
  3. Проблема с полями принтера: Как мы уже обсуждали, если у принтера установлены большие непечатаемые поля, это может "съедать" полезное пространство, и метод ПроверитьВывод будет ошибочно считать, что места недостаточно.

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

Решение 2: Использование свойства "Вместе со следующим" в макете

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

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

Давайте разберем по шагам, как применить это свойство:

  1. Откройте макет: В конфигураторе откройте макет табличного документа, в котором находится подвал.

  2. Найдите предшествующую область: Определите самую последнюю строку (или область), которая всегда должна быть вместе с подвалом. Это может быть последняя строка основной таблицы, итог или любой другой элемент, непосредственно предшествующий подвалу.

  3. Выделите строку/область: Нажмите на номер строки (или выделите область) в макете.

  4. Откройте свойства: Щелкните правой кнопкой мыши по выделенной строке/области и выберите пункт "Свойства".

  5. Установите свойство "Вместе со следующим": В окне свойств найдите раздел "Параграф". В этом разделе установите флажок напротив свойства "Вместе со следующим".

  6. Сохраните макет: Обязательно сохраните изменения в макете.

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

Дополнительные подходы и рекомендации

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

  1. Самостоятельный расчет доступного пространства: Мы можем реализовать более сложную логику, самостоятельно рассчитывая высоту оставшегося на странице пространства и высоту подвала. На основе этого расчета можно принудительно выводить горизонтальный разделитель страниц (ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц()) перед подвалом, если он объективно не помещается. Этот подход требует более детального понимания структуры табличного документа, размеров его областей и их динамического изменения.

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

  2. Использование методов НачатьАвтоматическоеФормированиеСтраниц и ЗакончитьАвтоматическоеФормированиеСтраниц: Эти методы позволяют программно управлять процессом автоматической разбивки на страницы. Внутри блока этих методов можно более гибко контролировать перенос областей, но они требуют глубокого понимания логики формирования документа. Мы можем использовать их, чтобы временно отключить автоматическую разбивку, вывести несколько областей, а затем снова включить, чтобы система перенесла весь блок на новую страницу, если он не поместится.

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

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

← На главную