Как управлять разрывами страниц при печати в 1С
Содержание
Разрыв страницы в 1С вставляют в двух местах: в макете табличного документа (меню Таблица) и в коде командой ВывестиГоризонтальныйРазделительСтраниц(). Первый способ подходит для постоянной печатной формы, второй нужен там, где число строк заранее неизвестно, например в отчёте или пакетной печати.
Лишние разрывы убирают тем же меню или удаляют строку кода. Если таблица рвётся посреди строки, а итоги уезжают на пустой лист, дело обычно не в самом разрыве, а в параметрах страницы и порядке вывода областей. Всё это ниже, с примерами.
Как 1С делит документ на страницы
Табличный документ — это сетка из строк и колонок, и 1С режет её на листы сама. Границы листа зависят от четырёх вещей:
- размер бумаги и ориентация (книжная или альбомная);
- поля страницы;
- масштаб печати;
- высота и ширина строк и колонок.
Автоматический разрыв стоит там, где следующая строка уже не помещается. Принудительный разрыв вы ставите сами, и он действует всегда, независимо от того, сколько места осталось.
Параметры листа задают в редакторе макета, пункт Файл → Параметры страницы. Там же включают колонтитулы и подгонку по ширине. Для A4 в книжной ориентации лист 210×297 мм, при полях по 10 мм рабочая ширина остаётся 190 мм. Если колонки в сумме шире, правая часть таблицы уйдёт на отдельный лист, и это не ошибка разрыва, а нехватка ширины.
Сначала посмотрите, как документ ляжет на листы: откройте предварительный просмотр печатной формы. Подгонять макет вслепую долго, а просмотр показывает реальные границы страниц.
Что быстрее: макет или код
| Способ | Когда применять | Ограничение |
|---|---|---|
| Разрыв в макете | Форма фиксированная: акт, договор, приложение | Положение разрыва не меняется от данных |
| Разрыв в коде | Число строк плавающее: отчёты, списки, пакетная печать | Нужно менять конфигурацию или расширение |
| Настройки области | Нужно повторять шапку или не рвать блок | Не заменяет разрыв, а дополняет |
Принудительный разрыв в макете и в отчётах
Ручная вставка в табличном документе
Пошагово это выглядит так:
- Откройте макет печатной формы или любой табличный документ в редакторе.
- Встаньте курсором в строку, перед которой страница должна закончиться.
- В меню
Таблицанайдите пункты, связанные с разрывом страницы, и выберите вставку горизонтального разрыва. Для разрыва между колонками есть вертикальный вариант. - Проверьте результат в предварительном просмотре.
Разрыв встаёт перед выделенной строкой: она станет первой на новом листе. Чтобы убрать его, снова встаньте в эту строку и выберите удаление разрыва в том же меню.
Расширять типовую печатную форму прямо в конфигурации нельзя без последствий: при обновлении правка слетит или превратится в конфликт. Если макет типовой, делайте копию формы через расширение или внешнюю печатную форму.
Разрыв в отчёте на СКД
В отчёте на системе компоновки данных строки появляются из настроек, и ручной разрыв в макете вам не поможет: итоговый документ формируется заново при каждом запуске. Есть два пути:
- разбить данные по группировкам и разделить страницы в коде после формирования;
- в пользовательском режиме сохранить настройку и выводить отчёт по частям, например по одной организации за раз.
В коде это делают в обработчике, который выводит результат в табличный документ. Принцип тот же, что в следующем разделе: вставить разделитель между блоками.
Разделители страниц в коде 1С
В программе используют две процедуры табличного документа:
ВывестиГоризонтальныйРазделительСтраниц()— следующая область пойдёт с нового листа;ВывестиВертикальныйРазделительСтраниц()— разделяет по колонкам, нужен редко.
Типичный сценарий — печать нескольких документов подряд. Каждый должен начинаться с новой страницы.
ТабДок = Новый ТабличныйДокумент;
Первый = Истина;
Для Каждого Документ Из МассивДокументов Цикл
Если Не Первый Тогда
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
Первый = Ложь;
Область = Макет.ПолучитьОбласть("Шапка");
Область.Параметры.Номер = Документ.Номер;
ТабДок.Вывести(Область);
ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
Для Каждого Строка Из Документ.Товары Цикл
ОбластьСтроки.Параметры.Наименование = Строка.Номенклатура;
ОбластьСтроки.Параметры.Сумма = Строка.Сумма;
ТабДок.Вывести(ОбластьСтроки);
КонецЦикла;
КонецЦикла;
Флаг Первый нужен, чтобы не получить пустой лист в начале. Если ставить разделитель после каждого документа, то пустая страница появится в конце.
Не рвать блок: ПроверитьВывод
Когда нужно, чтобы шапка группы не осталась одна внизу страницы, используют метод ПроверитьВывод(). Он принимает массив областей и отвечает, поместятся ли они на текущую страницу целиком.
Области = Новый Массив;
Области.Добавить(ОбластьЗаголовокГруппы);
Области.Добавить(ОбластьПерваяСтрока);
Если Не ТабДок.ПроверитьВывод(Области) Тогда
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ТабДок.Вывести(ОбластьЗаголовокГруппы);
Так заголовок всегда идёт вместе хотя бы с одной строкой данных. Тот же приём работает для итогов: добавьте в проверяемый массив последнюю строку таблицы и область итогов.
Проверяйте вывод по блокам, а не по каждой ячейке. На длинных отчётах покоячеечные проверки заметно тормозят формирование.
Спецсимволы и формулы: что реально работает
Ячейка табличного документа не умеет «разрывать страницу» через символ в тексте. Символ перевода строки (Символы.ПС) переносит текст внутри ячейки, и всё. Символ перевода формы (Символы.ПФ) используют в обычных текстовых файлах для принтеров, а в табличном документе его на разрыв не рассчитывайте.
Поэтому «формулу для разрыва» искать бесполезно. Если вам нужен разрыв по условию, проверьте условие в коде, а потом вызовите разделитель. Пример: начинать новый лист при смене контрагента.
Если ТекущийКонтрагент <> ПредыдущийКонтрагент И ПредыдущийКонтрагент <> Неопределено Тогда
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ПредыдущийКонтрагент = ТекущийКонтрагент;
Для переноса длинного текста в ячейке используйте свойства самой ячейки: в палитре свойств у режима заполнения выберите перенос по словам. Тогда строка растёт по высоте, а 1С учтёт новую высоту при делении на страницы.
Область печати, масштаб и повторяющаяся шапка
Эти настройки не ставят разрыв, но решают половину жалоб «страница разорвана не там».
Область печати
Если печатается лишнее (служебные колонки, примечания), задайте область печати: выделите нужный диапазон и в меню Таблица найдите пункты про область печати. Всё, что вне диапазона, на бумагу не пойдёт. В коде за это отвечает свойство ОбластьПечати табличного документа.
Масштаб и подгонка по ширине
Когда таблица шире листа на пару колонок, быстрее уменьшить масштаб , чем переделывать макет. В параметрах страницы есть масштаб в процентах и режим подгонки под размер страницы. Скорее всего, хватит 85–90%: текст остаётся читаемым, а колонки помещаются.
Если же ширина больше листа в полтора раза и больше, масштаб слишком мелкий. Тогда переверните лист в альбомную ориентацию (ширина A4 вырастет до 297 мм) или уберите лишние колонки.
Шапка на каждой странице
Для длинных таблиц шапку повторяют на каждом листе. В редакторе выделите строки шапки и включите их повтор при печати в меню Таблица. В коде аналогичное свойство — ПовторятьПриПечатиСтроки.
Когда шапка повторяется, место под неё берётся с каждого листа. Поэтому в ПроверитьВывод() её добавлять не надо: 1С её выведет сама.
Как выбрать ориентацию и поля
Ориентацию выбирают по ширине таблицы, а не по привычке. Ориентиры для A4:
| Ориентация | Ширина листа | Рабочая ширина при полях 10 мм |
|---|---|---|
| Книжная | 210 мм | 190 мм |
| Альбомная | 297 мм | 277 мм |
Если сумма ширины колонок укладывается в 190 мм, оставляйте книжную. Для таблиц с десятком колонок почти всегда нужна альбомная. Левое поле при подшивке увеличивают до 20 мм, и рабочая ширина книжного листа падает до 180 мм. Учитывайте это заранее, иначе последняя колонка уедет на следующий лист.
Колонтитулы
Номер страницы и дату печати выводят через колонтитулы, а не ячейками. В параметрах страницы включите верхний или нижний колонтитул и вставьте нужное поле — номер страницы или общее число. Так номера будут правильными, даже если разрывы поменяются.
Частые ошибки и быстрая диагностика
Большинство проблем с разрывами повторяются от формы к форме. Набор симптомов и причин — ниже.
Разрыв стоит, но не работает
Один из частых случаев: разрыв вставили, а на бумаге его нет. Три причины, по убыванию вероятности:
- Печать идёт из другой формы или копии макета: вы правите одно, а система берёт другое.
- Настроена подгонка под размер страницы, и принтерный драйвер переопределяет разметку.
- Разрыв стоит в строке, которая скрыта или сгруппирована, и в итоговом документе её нет.
Для первой причины проверьте, какой макет реально используется: временно измените в нём заметный текст и распечатайте.
Печать больших отчётов без тормозов
Формирование отчёта на десятки тысяч строк занимает время не из-за разрывов, а из-за способа вывода. Что даёт эффект:
- ⚡ выводить области пачками: сначала собрать весь блок, потом отправить в табличный документ;
- ⚡ вызывать
ПроверитьВывод()на группу, а не на каждую строку; - ⚡ не применять автоподбор высоты там, где она известна заранее;
- ⚡ для просмотра на экране не печатать, а сохранять результат в PDF или файл таблицы.
Если отчёт нужен только в виде файла, разрывы страниц ему не нужны вовсе. Выгрузка в табличный формат обходит деление на листы, и тогда ничего считать не придётся.
Ещё один приём — разбить огромный отчёт по периодам или подразделениям. Страниц получится столько же, но формировать их можно отдельными запусками, а предварительный просмотр не будет зависать на одной громадной таблице.
Если печатаете на сервере или в фоновом задании, ориентируйтесь на параметры страницы из макета: интерактивных настроек принтера там нет, и выбор бумаги определяется только макетом.
Частые вопросы
Можно ли поставить разрыв страницы прямо в ячейке?
Как убрать все разрывы сразу?
Таблица удаление разрыва страницы для выделенного. В коде достаточно не вызывать разделители при выводе.