При разработке печатных форм в системе 1С:Предприятие программисты часто сталкиваются с ситуацией, когда документ, который визуально должен занимать одну страницу, при предварительном просмотре или печати «разлетается» на несколько листов. Это проявляется либо в виде появления абсолютно пустых страниц в конце документа, либо в виде «отрезания» правой части таблицы на отдельный лист. Разберем детально, почему это происходит и как настроить программный код и макет, чтобы отчет выглядел профессионально.
Самая распространенная причина появления лишних страниц — это наличие форматирования или данных в ячейках, которые находятся за пределами основной области печати. Даже если в ячейке нет текста, но у нее установлена граница, изменен фон или просто когда-то вводилось значение, 1С считает эту ячейку значимой и пытается вывести её на печать.
Проанализируем алгоритм очистки макета:
Ctrl+Shift+Стрелка вправо).Del.Ctrl+Shift+Стрелка вниз) и удалите их.В конфигураторе часто можно заметить пунктирную линию — это программная граница страницы. Если ваша таблица хотя бы на пиксель заходит за эту линию, система создаст вторую страницу. После удаления лишних колонок пунктир должен переместиться в правильное положение.
Если ваша таблица по ширине лишь немного не помещается на лист, самым простым программным решением будет использование свойства Автомасштаб. Рассмотрим, как это прописать в коде формирования печатной формы:
ТабДокумент = Новый Табличный Документ;
// Установка основных параметров
ТабДокумент.ПолеСверху = 5;
ТабДокумент.ПолеСлева = 5;
ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
// Включаем автоматическое масштабирование
ТабДокумент.Автомасштаб = Истина;
Свойство Автомасштаб заставляет систему пропорционально уменьшить масштаб всего документа так, чтобы по ширине он гарантированно уместился на один лист. Однако будьте осторожны: если в макете остались «забытые» далеко справа ячейки, 1С попытается уместить и их, из-за чего основной текст станет нечитаемым (микроскопическим).
Чтобы полностью исключить влияние мусора в макете, мы можем жестко ограничить область, которую принтер должен брать в расчет. Для этого используется свойство ОбластьПечати. Выясним, как это реализовать, если мы знаем границы нашей таблицы.
// Предположим, наша таблица заканчивается на 50-й строке и 10-й колонке
ПоследняяСтрока = 50;
ПоследняяКолонка = 10;
ТабДокумент.ОбластьПечати = ТабДокумент.Область(1, 1, ПоследняяСтрока, ПоследняяКолонка);
При таком подходе всё, что находится вне прямоугольника с 1 по 50 строку и с 1 по 10 колонку, будет проигнорировано при печати, даже если там есть данные или оформление. Это наиболее «чистый» способ борьбы с лишними страницами.
Иногда свойство Автомасштаб работает слишком агрессивно. Если нам нужно, чтобы документ подгонялся только по ширине, но при этом мог занимать сколько угодно страниц в длину, следует использовать более точные настройки масштабирования:
// Подгоняем только по ширине страницы
ТабДокумент.ПоШиринеСтраницы = Истина;
// Либо задаем количество страниц в ширину принудительно
ТабДокумент.КоличествоСтраницПоШирине = 1;
Эти параметры позволяют избежать ситуации, когда длинный отчет (например, на 100 строк) система пытается сжать до размера одной почтовой марки, чтобы уместить его на один лист и по ширине, и по высоте. С установкой КоличествоСтраницПоШирине = 1, 1С будет масштабировать только горизонталь.
Рассмотрим ситуацию: вы изменили код, удалили лишние колонки, но у пользователя всё равно печатается «криво». Причина может крыться в свойстве ИмяПараметровПечати. Система 1С запоминает настройки печати (поля, масштаб, ориентацию), которые пользователь установил вручную в диалоге печати, и связывает их с определенным именем.
// Уникальное имя параметров печати для этого отчета
ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_РЕЕСТР_ПРОДАЖ";
Если вы используете одно и то же имя для разных отчетов или если настройки «испортились», удалите это свойство в коде или измените имя на новое. Это сбросит кэшированные настройки печати у пользователя, и система применит те параметры, которые вы жестко задали в коде.
Посмотрим на проблему с другой стороны. Иногда лишние страницы вызывают не ячейки, а графические объекты: картинки, логотипы, линии или диаграммы. Рассмотрим, как их найти:
Ctrl+A (выделить всё).ВысотаСтроки. Если у пустых строк внизу установлена фиксированная высота (не «Авто»), они будут принудительно выводиться на печать.Проанализируем настройки полей. В коде автора указано значение 5 мм для всех полей. Важно помнить: большинство лазерных принтеров имеют физическую «непечатную зону» (обычно от 4 до 7 мм). Если вы устанавливаете программное поле в 5 мм, а физическое поле принтера составляет 6 мм, происходит микро-сдвиг содержимого. Этот сдвиг может привести к тому, что крайняя правая линия таблицы не поместится и вызовет печать целого пустого листа справа.
Рекомендуется устанавливать поля не менее 10 мм для обеспечения совместимости с большинством печатающих устройств:
ТабДокумент.ПолеСлева = 10;
ТабДокумент.ПолеСправа = 10;
ТабДокумент.ПолеСверху = 10;
ТабДокумент.ПолеСнизу = 10;
Подводя итог, можно сказать, что решение проблемы лишних страниц всегда комплексное. Сначала мы очищаем макет физически (удаляем строки и колонки), затем настраиваем программное масштабирование через Автомасштаб или КоличествоСтраницПоШирине, и в завершение фиксируем область печати через ОбластьПечати. Сочетание этих методов гарантирует предсказуемый результат при выводе любого документа на печать.