Как управлять разрывами страниц при печати в 1С

· 9 мин

Содержание

Разрыв страницы в 1С вставляют в двух местах: в макете табличного документа (меню Таблица) и в коде командой ВывестиГоризонтальныйРазделительСтраниц(). Первый способ подходит для постоянной печатной формы, второй нужен там, где число строк заранее неизвестно, например в отчёте или пакетной печати.

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

Как 1С делит документ на страницы

Табличный документ — это сетка из строк и колонок, и 1С режет её на листы сама. Границы листа зависят от четырёх вещей:

  • размер бумаги и ориентация (книжная или альбомная);
  • поля страницы;
  • масштаб печати;
  • высота и ширина строк и колонок.

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

Параметры листа задают в редакторе макета, пункт Файл → Параметры страницы. Там же включают колонтитулы и подгонку по ширине. Для A4 в книжной ориентации лист 210×297 мм, при полях по 10 мм рабочая ширина остаётся 190 мм. Если колонки в сумме шире, правая часть таблицы уйдёт на отдельный лист, и это не ошибка разрыва, а нехватка ширины.

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

Что быстрее: макет или код

СпособКогда применятьОграничение
Разрыв в макетеФорма фиксированная: акт, договор, приложениеПоложение разрыва не меняется от данных
Разрыв в кодеЧисло строк плавающее: отчёты, списки, пакетная печатьНужно менять конфигурацию или расширение
Настройки областиНужно повторять шапку или не рвать блокНе заменяет разрыв, а дополняет

Принудительный разрыв в макете и в отчётах

Ручная вставка в табличном документе

Пошагово это выглядит так:

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

Разрыв встаёт перед выделенной строкой: она станет первой на новом листе. Чтобы убрать его, снова встаньте в эту строку и выберите удаление разрыва в том же меню.

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

Разрыв в отчёте на СКД

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

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

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

Разделители страниц в коде 1С

В программе используют две процедуры табличного документа:

  • ВывестиГоризонтальныйРазделительСтраниц() — следующая область пойдёт с нового листа;
  • ВывестиВертикальныйРазделительСтраниц() — разделяет по колонкам, нужен редко.

Типичный сценарий — печать нескольких документов подряд. Каждый должен начинаться с новой страницы.

ТабДок = Новый ТабличныйДокумент;
Первый = Истина;

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

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

    ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
    Для Каждого Строка Из Документ.Товары Цикл
        ОбластьСтроки.Параметры.Наименование = Строка.Номенклатура;
        ОбластьСтроки.Параметры.Сумма = Строка.Сумма;
        ТабДок.Вывести(ОбластьСтроки);
    КонецЦикла;
КонецЦикла;

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

Не рвать блок: ПроверитьВывод

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

Области = Новый Массив;
Области.Добавить(ОбластьЗаголовокГруппы);
Области.Добавить(ОбластьПерваяСтрока);

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

ТабДок.Вывести(ОбластьЗаголовокГруппы);

Так заголовок всегда идёт вместе хотя бы с одной строкой данных. Тот же приём работает для итогов: добавьте в проверяемый массив последнюю строку таблицы и область итогов.

Проверяйте вывод по блокам, а не по каждой ячейке. На длинных отчётах покоячеечные проверки заметно тормозят формирование.

Спецсимволы и формулы: что реально работает

Ячейка табличного документа не умеет «разрывать страницу» через символ в тексте. Символ перевода строки (Символы.ПС) переносит текст внутри ячейки, и всё. Символ перевода формы (Символы.ПФ) используют в обычных текстовых файлах для принтеров, а в табличном документе его на разрыв не рассчитывайте.

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

Если ТекущийКонтрагент <> ПредыдущийКонтрагент И ПредыдущийКонтрагент <> Неопределено Тогда
    ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ПредыдущийКонтрагент = ТекущийКонтрагент;

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

Область печати, масштаб и повторяющаяся шапка

Эти настройки не ставят разрыв, но решают половину жалоб «страница разорвана не там».

Область печати

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

Масштаб и подгонка по ширине

Когда таблица шире листа на пару колонок, быстрее уменьшить масштаб , чем переделывать макет. В параметрах страницы есть масштаб в процентах и режим подгонки под размер страницы. Скорее всего, хватит 85–90%: текст остаётся читаемым, а колонки помещаются.

Если же ширина больше листа в полтора раза и больше, масштаб слишком мелкий. Тогда переверните лист в альбомную ориентацию (ширина A4 вырастет до 297 мм) или уберите лишние колонки.

Шапка на каждой странице

Для длинных таблиц шапку повторяют на каждом листе. В редакторе выделите строки шапки и включите их повтор при печати в меню Таблица. В коде аналогичное свойство — ПовторятьПриПечатиСтроки.

Когда шапка повторяется, место под неё берётся с каждого листа. Поэтому в ПроверитьВывод() её добавлять не надо: 1С её выведет сама.

Как выбрать ориентацию и поля

Ориентацию выбирают по ширине таблицы, а не по привычке. Ориентиры для A4:

ОриентацияШирина листаРабочая ширина при полях 10 мм
Книжная210 мм190 мм
Альбомная297 мм277 мм

Если сумма ширины колонок укладывается в 190 мм, оставляйте книжную. Для таблиц с десятком колонок почти всегда нужна альбомная. Левое поле при подшивке увеличивают до 20 мм, и рабочая ширина книжного листа падает до 180 мм. Учитывайте это заранее, иначе последняя колонка уедет на следующий лист.

Колонтитулы

Номер страницы и дату печати выводят через колонтитулы, а не ячейками. В параметрах страницы включите верхний или нижний колонтитул и вставьте нужное поле — номер страницы или общее число. Так номера будут правильными, даже если разрывы поменяются.

Частые ошибки и быстрая диагностика

Большинство проблем с разрывами повторяются от формы к форме. Набор симптомов и причин — ниже.

Диагностика: выберите симптом

Разрыв стоит, но не работает

Один из частых случаев: разрыв вставили, а на бумаге его нет. Три причины, по убыванию вероятности:

  1. Печать идёт из другой формы или копии макета: вы правите одно, а система берёт другое.
  2. Настроена подгонка под размер страницы, и принтерный драйвер переопределяет разметку.
  3. Разрыв стоит в строке, которая скрыта или сгруппирована, и в итоговом документе её нет.

Для первой причины проверьте, какой макет реально используется: временно измените в нём заметный текст и распечатайте.

Печать больших отчётов без тормозов

Формирование отчёта на десятки тысяч строк занимает время не из-за разрывов, а из-за способа вывода. Что даёт эффект:

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

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

Ещё один приём — разбить огромный отчёт по периодам или подразделениям. Страниц получится столько же, но формировать их можно отдельными запусками, а предварительный просмотр не будет зависать на одной громадной таблице.

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

Перед отправкой формы в печать
Выполнено: 0 / 5

Частые вопросы

Можно ли поставить разрыв страницы прямо в ячейке?
Нет. Разрыв относится к строке или колонке, а не к тексту. Для переноса текста внутри ячейки используют перенос строки, он страницу не меняет.
Как убрать все разрывы сразу?
В редакторе выделите всю таблицу и выберите в меню Таблица удаление разрыва страницы для выделенного. В коде достаточно не вызывать разделители при выводе.
Чем горизонтальный разрыв отличается от вертикального?
Горизонтальный проходит между строками, и следующая строка начнётся с нового листа. Вертикальный проходит между колонками, и колонки справа от разрыва печатаются отдельно.
Почему разрыв работает на экране, но не при печати на принтере?
Подгонка под размер страницы в настройках драйвера принтера иногда меняет масштаб. Отключите её в свойствах печати и оставьте масштаб из параметров страницы 1С.
Как начать новую страницу при смене группы в отчёте?
Сравнивайте значение группировки с предыдущим и вызывайте горизонтальный разделитель перед первой строкой новой группы. Пример с контрагентами выше.
Нужно ли ставить разрыв вручную, если форма сама делится на страницы?
Нет. Ручной разрыв нужен, когда блок обязан начаться с нового листа: приложение к договору, акт сверки по каждой организации, отдельный документ в пакетной печати.