При работе с печатными формами в 1С, особенно когда речь идет о заполнении строго регламентированных бланков (например, листков нетрудоспособности или государственных актов), программисты часто сталкиваются с проблемой "лишней" второй страницы. Даже если визуально макет идеально вписывается в один лист, система может принудительно выдавать пустую страницу. Ситуация осложняется тем, что для таких бланков нельзя использовать Автомасштаб, так как данные должны попадать точно в ячейки бланка с точностью до миллиметра.
В этой статье мы подробно разберем, почему возникает вторая страница и как её эффективно удалить или предотвратить её появление.
Перед тем как приступать к программному решению, давайте проанализируем ситуацию. 1С формирует разделитель страниц автоматически, если суммарная ширина колонок или высота строк превышает размер области печати, определенный драйвером принтера и параметрами страницы. Основные причины "фантомных" листов:
Рассмотрим пошагово способы решения этой проблемы.
Самый надежный метод — явно указать системе, какую именно область макета следует отправлять на принтер. Это позволяет игнорировать любые объекты, находящиеся за пределами этой области. Для этого используется свойство ОбластьПечати объекта ТабличныйДокумент.
Рассмотрим пример кода, где мы ограничиваем вывод только нужным нам диапазоном ячеек:
// Определяем область, которую нужно напечатать (например, с 1-й строки 1-й колонки по 50-ю строку и 10-ю колонку)
НужнаяОбласть = ТабДок.Область(1, 1, 50, 10);
// Устанавливаем эту область как единственную для печати
ТабДок.ОбластьПечати = НужнаяОбласть;
После установки этого свойства всё, что находится правее 10-й колонки или ниже 50-й строки, будет полностью проигнорировано при выводе на печать.
Если макет "не влезает" совсем чуть-чуть, проанализируем параметры страницы. Часто достаточно убрать отступы, которые система резервирует по умолчанию. Выясним, как это сделать программно:
ТабДок.АвтоМасштаб = Ложь; // Масштаб должен быть 100%
ТабДок.ПолеСлева = 0;
ТабДок.ПолеСправа = 0;
ТабДок.ПолеСверху = 0;
ТабДок.ПолеСнизу = 0;
ТабДок.РазмерКолонтитулаСверху = 0;
ТабДок.РазмерКолонтитулаСнизу = 0;
// Можно также принудительно установить формат А4
ТабДок.РазмерСтраницы = "A4";
Важный нюанс: Некоторые принтеры имеют "непечатную область" (физические ограничения механики). Если вы установите поля в 0, а данные подходят к самому краю, принтер может обрезать край текста, но в 1С документ будет считаться помещающимся на одну страницу.
Если нам не удается заставить систему считать документ одностраничным, мы можем просто приказать принтеру печатать только первую страницу. Метод Напечатать() позволяет указать начальную и конечную страницы.
Посмотрим на пример вызова:
// Напечатать с 1-й по 1-ю страницу, без вывода диалога печати
ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать, 1, 1);
Этот метод эффективен, когда вторая страница пустая или содержит ненужные артефакты, возникшие из-за особенностей разметки.
Рассмотрим ситуацию, когда мы заранее не знаем высоту макета. Мы можем использовать метод ПроверитьВывод(), чтобы убедиться, что область помещается на лист. Если метод возвращает Ложь, мы можем попробовать программно уменьшить высоту строк или удалить последние (пустые) строки макета.
МассивОбластей = Новый Массив;
МассивОбластей.Добавить(ТабДок.Область("Заголовок"));
МассивОбластей.Добавить(ТабДок.Область("ТелоБланка"));
Если Не ТабДок.ПроверитьВывод(МассивОбластей) Тогда
Сообщить("Внимание: Данные не помещаются на одну страницу!");
// Здесь можно реализовать логику уменьшения высоты строк
КонецЕсли;
Часто проблема кроется в самом макете (объекте Макет). Если в процессе редактирования вы случайно изменили ширину крайней правой колонки или добавили строку далеко внизу, 1С будет считать их частью документа.
Проанализируем макет визуально в конфигураторе:
РазмещениеТекста. Если установлено Переносить, длинный пробел в конце строки может увеличить высоту ячейки и вытолкнуть документ на новую страницу. Установите Обрезать.В исходном вопросе автор пытался использовать свойство КонецСтраницы = Ложь. Выясним причину неудачи. Это свойство предназначено исключительно для работы с принудительными разделителями страниц, которые программист установил методом ВывестиГоризонтальныйРазделительСтраниц(). Оно не позволяет отменить автоматический разделитель, который система ставит на основе геометрических параметров листа. Поэтому единственный способ "убрать" такой разделитель — изменить геометрию документа так, чтобы системе не пришлось его ставить.
Для решения задачи "печати поверх бланка" лучше всего комбинировать несколько методов:
ОбластьПечати, чтобы отсечь лишнее.ТабДок.Напечатать(..., 1, 1).Такой комплексный подход гарантирует, что ваш табличный документ всегда будет занимать ровно одну страницу, а данные не "съедут" относительно ячеек бумажного бланка.