При разработке печатных форм и сравнения объектов в системе 1С:Предприятие программисты часто сталкиваются с ситуацией, когда на экранной форме документ выглядит корректно, но при выводе на принтер или в предварительном просмотре появляются лишние пустые листы. Особенно остро эта проблема проявляется при попытке вывести две небольшие накладные или квитанции горизонтально на одном листе формата А4, используя метод Присоединить(). Проанализируем причины этого поведения и разберем по шагам, как добиться идеальной печати.
Когда мы используем метод Присоединить() для печати в несколько колонок, система 1С достраивает таблицу «вправо». Основная сложность заключается в том, что платформа рассчитывает границы печати исходя из общей ширины и высоты всех выведенных областей. Если итоговая ширина документа хотя бы на один пиксель превышает доступную ширину области печати принтера (с учетом полей), 1С автоматически переносит «остаток» на следующий лист. Если же при этом программно добавлены разделители страниц, ситуация усугубляется, создавая целую сетку из пустых и полупустых листов.
Рассмотрим фрагмент кода, часто встречающийся, когда используется шаблон регистрации внешней печатной формы, который становится причиной ошибки. В нем одновременно используются методы принудительного разрыва страницы как по вертикали, так и по горизонтали. Посмотрим на пример некорректного подхода:
ТабДокумент.Вывести(ОбластьМакета);
ТабДокПравый = Новый ТабличныйДокумент;
ТабДокПравый.Вывести(ОбластьМакета);
// Потенциальная ошибка: избыточные разделители
ТабДокПравый.ВывестиГоризонтальныйРазделительСтраниц();
ТабДокПравый.ВывестиВертикальныйРазделительСтраниц();
ТабДокумент.Присоединить(ТабДокПравый);
ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
ТабДокумент.ВывестиВертикальныйРазделительСтраниц();
Важный момент: Методы ВывестиГоризонтальныйРазделительСтраниц() и ВывестиВертикальныйРазделительСтраниц() создают жесткие границы. Если вызвать их сразу после присоединения области, 1С интерпретирует это как команду: «завершить текущий блок и начать новый с новой страницы справа и снизу». В результате, если ваши данные помещаются на один лист, эти команды принудительно создают пустые листы вокруг них.
Решение: Если ваша задача — уместить две накладные на одном листе А4 по горизонтали, уберите все ручные разделители страниц. Система сама перейдет на новый лист, когда место закончится, либо вы добавите один ВывестиГоризонтальныйРазделительСтраниц() после того, как пара накладных будет полностью сформирована.
Часто причина кроется не в коде, а в самом макете (ОбластьМакета), поэтому полезно изучить инструкцию по редактированию печатных форм. Даже если визуально ячейки кажутся пустыми, они могут содержать форматирование: невидимые границы, измененный цвет фона или установленную ширину колонок далеко за пределами основной области печати. Выясним, как это исправить:
Ctrl+Shift+Right).Delete лишь очистит содержимое, но не удалит сами колонки с их настройками.После этого 1С перестанет учитывать «пустое пространство» как часть документа, которую нужно выводить на печать.
Одним из самых эффективных способов борьбы с лишними листами является использование свойства АвтоМасштаб. Оно позволяет системе автоматически подогнать ширину документа под ширину бумажного листа. Рассмотрим, как это применить в коде:
ТабДокумент = Новый ТабличныйДокумент;
// Устанавливаем автоматическое масштабирование
ТабДокумент.АвтоМасштаб = Истина;
// Задаем ландшафтную ориентацию, если накладные широкие
ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
// Минимизируем поля, чтобы расширить полезную площадь
ТабДокумент.ПолеСлева = 5;
ТабДокумент.ПолеСправа = 5;
Когда свойство АвтоМасштаб установлено в значение Истина, 1С попытается «сжать» две присоединенные накладные так, чтобы они влезли в одну страницу по ширине. Это предотвращает появление тех самых 1-2 миллиметров «переезда» на соседний лист, которые и генерируют пустые страницы.
Для профессионального решения задачи рекомендуется проверять, поместится ли очередная область на лист, прежде чем ее выводить. Проанализируем ситуацию: мы хотим вывести документ, и если он не влезает, только тогда добавлять разделитель. Для этого используется метод ПроверитьВывод().
МассивОбластей = Новый Массив;
МассивОбластей.Добавить(ОбластьМакета);
Если Не ТабДокумент.ПроверитьВывод(МассивОбластей) Тогда
// Если область не влезает, переходим на новый лист
ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ТабДокумент.Вывести(ОбластьМакета);
Обратите внимание, что метод ПроверитьВывод() работает только после того, как у табличного документа установлены параметры страницы (ориентация, поля, масштаб). Поэтому задавайте их в самом начале формирования отчета.
Если вы используете механизмы БСП (Библиотеки Стандартных Подсистем), обратите внимание на вызов УправлениеПечатью.ЗадатьОбластьПечатиДокумента(). Эта функция определяет, какая именно часть табличного документа пойдет на принтер. Если вы передаете в нее некорректные номера строк (например, захватываете лишние пустые строки в конце), это гарантированно приведет к появлению пустых листов. Убедитесь, что переменная НомерСтрокиНачало вычисляется точно по высоте заполненной таблицы.
Резюмируем: Для устранения пустых листов необходимо действовать комплексно: очистить макет от лишних колонок/строк, отказаться от избыточных вертикальных разделителей, включить АвтоМасштаб и правильно настроить поля страницы. Такой подход гарантирует, что ваши накладные будут печататься ровно и экономно.