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

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

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

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

Выясняем причину появления лишней страницы

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

Рассмотрим пошагово способы решения этой проблемы.

Способ 1: Принудительное ограничение области печати

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

Рассмотрим пример кода, где мы ограничиваем вывод только нужным нам диапазоном ячеек:


// Определяем область, которую нужно напечатать (например, с 1-й строки 1-й колонки по 50-ю строку и 10-ю колонку)
НужнаяОбласть = ТабДок.Область(1, 1, 50, 10);
// Устанавливаем эту область как единственную для печати
ТабДок.ОбластьПечати = НужнаяОбласть;

После установки этого свойства всё, что находится правее 10-й колонки или ниже 50-й строки, будет полностью проигнорировано при выводе на печать.

Способ 2: Настройка параметров страницы и обнуление полей

Если макет "не влезает" совсем чуть-чуть, проанализируем параметры страницы. Часто достаточно убрать отступы, которые система резервирует по умолчанию. Выясним, как это сделать программно:


ТабДок.АвтоМасштаб = Ложь; // Масштаб должен быть 100%
ТабДок.ПолеСлева = 0;
ТабДок.ПолеСправа = 0;
ТабДок.ПолеСверху = 0;
ТабДок.ПолеСнизу = 0;
ТабДок.РазмерКолонтитулаСверху = 0;
ТабДок.РазмерКолонтитулаСнизу = 0;
// Можно также принудительно установить формат А4
ТабДок.РазмерСтраницы = "A4";

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

Способ 3: Ограничение диапазона страниц в методе Напечатать

Если нам не удается заставить систему считать документ одностраничным, мы можем просто приказать принтеру печатать только первую страницу. Метод Напечатать() позволяет указать начальную и конечную страницы.

Посмотрим на пример вызова:


// Напечатать с 1-й по 1-ю страницу, без вывода диалога печати
ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать, 1, 1);

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

Способ 4: Проверка вывода и динамическая корректировка

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


МассивОбластей = Новый Массив;
МассивОбластей.Добавить(ТабДок.Область("Заголовок"));
МассивОбластей.Добавить(ТабДок.Область("ТелоБланка"));

Если Не ТабДок.ПроверитьВывод(МассивОбластей) Тогда
    Сообщить("Внимание: Данные не помещаются на одну страницу!");
    // Здесь можно реализовать логику уменьшения высоты строк
КонецЕсли;

Способ 5: Удаление лишних строк и колонок в макете

Часто проблема кроется в самом макете (объекте Макет). Если в процессе редактирования вы случайно изменили ширину крайней правой колонки или добавили строку далеко внизу, 1С будет считать их частью документа.

Проанализируем макет визуально в конфигураторе:

  1. Выделите все колонки справа от вашей рабочей области.
  2. Нажмите правую кнопку мыши и выберите "Удалить" (не просто очистить содержимое, а именно удалить сами колонки).
  3. Повторите то же самое для всех строк ниже основной области печати.
  4. Проверьте свойство ячеек РазмещениеТекста. Если установлено Переносить, длинный пробел в конце строки может увеличить высоту ячейки и вытолкнуть документ на новую страницу. Установите Обрезать.

Почему не сработал код с КонецСтраницы?

В исходном вопросе автор пытался использовать свойство КонецСтраницы = Ложь. Выясним причину неудачи. Это свойство предназначено исключительно для работы с принудительными разделителями страниц, которые программист установил методом ВывестиГоризонтальныйРазделительСтраниц(). Оно не позволяет отменить автоматический разделитель, который система ставит на основе геометрических параметров листа. Поэтому единственный способ "убрать" такой разделитель — изменить геометрию документа так, чтобы системе не пришлось его ставить.

Итоги и рекомендации

Для решения задачи "печати поверх бланка" лучше всего комбинировать несколько методов:

  1. Установить все поля и колонтитулы в 0.
  2. Явно задать ОбластьПечати, чтобы отсечь лишнее.
  3. В крайнем случае использовать ТабДок.Напечатать(..., 1, 1).

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

← На главную