Каждый разработчик 1С рано или поздно сталкивается с досадной ситуацией: созданный или отредактированный макет печатной формы в режиме предварительного просмотра выглядит отлично на первой странице, но вслед за ней принтер упорно пытается напечатать десятки абсолютно пустых листов. Пользователи жалуются на перевод бумаги, а визуальный осмотр макета в Конфигураторе не показывает никаких явных проблем.
В этой статье мы подробно разберем, почему возникает этот эффект, проанализируем неочевидные причины растягивания табличных документов и рассмотрим пошаговые методы устранения этой проблемы раз и навсегда.
Платформа 1С:Предприятие определяет физические границы области печати табличного документа по крайним заполненным ячейкам. При этом заполненной считается любая ячейка, которая содержит хотя бы одно измененное свойство, отличное от стандартного. Вы можете не писать в ячейку текст, но если у нее изменен цвет фона, установлен шрифт, настроена невидимая граница или случайно объединены ячейки, уходящие далеко вправо, платформа посчитает эту ячейку частью печатной области.
Как показывает практика практикующих разработчиков, часто виновником становится едва заметная вертикальная пунктирная линия разметки (граница страницы), которая может находиться в 100-й или 150-й колонке макета. Ее практически невозможно заметить при обычном открытии макета, так как она сливается с краем окна Конфигуратора или скрыта за областью прокрутки.
Разберем по шагам, как очистить макет от скрытого форматирования:
Даже если макет сверстан аккуратно, физические размеры ячеек могут незначительно (буквально на несколько пикселей) превышать стандартную ширину печатного листа формата А4 с учетом установленных полей принтера. В этом случае 1С автоматически перенесет невлезающую часть на соседний лист справа. На печати это выглядит как один заполненный лист и один пустой (или содержащий едва заметный хвостик рамки таблицы).
Чтобы избежать подобных ситуаций, мы должны явно указать платформе, что документ необходимо масштабировать под ширину печатного листа.
Проанализируем программный способ установки автомасшабирования. В модуле менеджера или модуле объекта, где происходит формирование печатной формы, перед выводом документа пользователю необходимо прописать свойство АвтоМасштаб:
ТабличныйДокумент = Новый ТабличныйДокумент;
// ... Код заполнения областей макета ...
ТабличныйДокумент.АвтоМасштаб = Истина;
Установка свойства АвтоМасштаб в значение Истина заставит платформу пропорционально сжать содержимое макета так, чтобы оно целиком поместилось по ширине листа бумаги, предотвращая образование пустых страниц справа.
Бывает так: разработчик исправил макет, проверил его под своей учетной записью — все выводится на одну страницу. Однако у конкретного пользователя в режиме «1С:Предприятие» при печати того же самого документа по-прежнему вылезает куча пустых страниц. Причина кроется в механизме сохранения индивидуальных настроек принтера и страницы в системном кэше 1С.
Когда в коде формирования печатной формы задано свойство ИмяПараметровПечати, платформа сохраняет масштаб, поля и ориентацию страницы, которые пользователь выбрал при первой печати. Если когда-то ранее пользователь случайно изменил поля или масштаб, эти некорректные настройки будут применяться к его печатной форме постоянно, игнорируя изменения самого макета в Конфигураторе.
Рассмотрим, как решить эту проблему:
Вариант А. Интерактивный сброс настроек пользователем:
Вариант Б. Программный сброс параметров разработчиком:
Если пользователей много и заходить к каждому проблематично, мы можем временно изменить или очистить свойство ИмяПараметровПечати в коде формирования документа. Например:
// Было: ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_РеализацияТоваровУслуг";
// Изменяем имя параметров печати, чтобы сбросить кэш у всех пользователей:
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_РеализацияТоваровУслуг_Новый";
После изменения имени параметров печати платформа создаст новую запись в кэше настроек для каждого пользователя с настройками по умолчанию, которые зашиты в макете.
Если пустые страницы появляются строго внизу документа (после вывода всех данных), стоит внимательно проанализировать алгоритм компоновки табличного документа в цикле. Распространенной ошибкой является безусловный вывод горизонтального разделителя страниц.
Рассмотрим пример ошибочного кода:
Для Каждого СтрокаДанных Из ТаблицаТоваров Цикл
// Вывод области строки
ТабличныйДокумент.Вывести(ОбластьСтрока);
// Ошибочный безусловный вывод разделителя страниц
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЦикла;
В данном примере на последней итерации цикла, когда все полезные данные уже выведены, программа все равно добавит в табличный документ команду ВывестиГоризонтальныйРазделительСтраниц(). В результате в самом конце печатной формы образуется пустой лист. Чтобы этого избежать, всегда добавляйте условие проверки окончания обхода коллекции:
ВсегоСтрок = ТаблицаТоваров.Количество();
Для Индекс = 0 По ВсегоСтрок - 1 Цикл
СтрокаДанных = ТаблицаТоваров[Индекс];
ТабличныйДокумент.Вывести(ОбластьСтрока);
// Выводим разделитель только если это не последняя строка
Если Индекс < ВсегоСтрок - 1 Тогда
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
КонецЦикла;
В редких случаях макет сверстан идеально, в коде прописан АвтоМасштаб, но при работе пользователей через удаленный рабочий стол (RDP) на печать выводятся пустые листы. Это связано с тем, что 1С запрашивает параметры области печати (минимально допустимые поля) у драйвера принтера, установленного по умолчанию в сессии пользователя.
Если драйвер передан некорректно (например, при использовании стандартного Easy Print в Windows Server без установки родных драйверов на сервере), платформа может получить неверные физические размеры полей принтера (например, нулевые или слишком большие границы). 1С ошибочно считает, что макет не помещается на стандартный лист, и принудительно дробит его на части.
Для решения этой проблемы системному администратору необходимо обновить драйверы принтеров на терминальном сервере до актуальных версий или использовать универсальные драйверы печати (Universal Printer Driver) от производителя печатного оборудования.
Придерживаясь этих простых правил гигиены при разработке макетов и написании кода печати, вы навсегда избавите пользователей от проблемы лишних пустых листов при работе с документами в 1С.