Почему печатная форма УПД некорректно разбивается на страницы при вызове ПроверитьВывод и как это исправить

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При формировании печатных форм первичных документов (в частности, универсального передаточного документа — УПД) разработчики часто сталкиваются с ситуацией, когда один и тот же документ у разных пользователей или на разных рабочих местах разбивается на страницы по-разному. В одном случае документ компактно умещается на одном листе, а в другом — подвал таблицы или блок подписей переносится на отдельный лист, оставляя на второй странице лишь небольшую секцию.

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

Основные причины плавающего разбиения на страницы

Метод табличного документа ПроверитьВывод выполняет виртуальный расчет высоты переданных областей макета и сравнивает ее с доступным пространством страницы. Однако этот расчет зависит от целого ряда скрытых настроек и системных параметров:

  1. Несовместимость с автоматическим масштабированием. Метод ПроверитьВывод выполняет проверку строго в масштабе 100%. Если в параметрах табличного документа включен признак АвтоМасштаб = Истина, платформа не применяет коэффициент сжатия в момент проверки. В результате метод возвращает Ложь, считая, что область не помещается, хотя при реальном выводе на печать со сжатием она легко уместилась бы.
  2. Влияние драйвера принтера по умолчанию. Платформа 1С при расчете параметров страницы запрашивает аппаратные границы печати (непечатаемые поля) у принтера, назначенного в операционной системе по умолчанию. Если у пользователей установлены разные драйверы или подключение происходит через RDP с перенаправлением принтеров (Easy Print), доступная область страницы для расчета оказывается разной.
  3. Системное масштабирование Windows (DPI) и автовысота строк. Если в ячейках макета включено свойство РазмещениеТекста.Переносить и не задана жесткая высота строк, расчет высоты ячеек опирается на шрифтовые метрики ОС. При разном системном масштабе экрана (100%, 125%, 150%) текст переносится по-разному, изменяя суммарную высоту выводимых секций.
  4. Сохраненные пользовательские настройки печати. Если у табличного документа задано свойство ИмяПараметровПечати, платформа считывает параметры из системного хранилища настроек пользователя. Эти параметры имеют приоритет и переопределяют значения, заданные по умолчанию в макете.

Шаг 1. Сброс и принудительная инициализация параметров печати

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

Посмотрим на пример правильной инициализации табличного документа в модуле формирования печатной формы:


ТабДокумент = Новый ТабличныйДокумент;

// Очищаем имя параметров печати, чтобы исключить чтение сохраненных настроек из базы
ТабДокумент.ИмяПараметровПечати = "";

// Принудительно задаем ориентацию и поля страницы
ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДокумент.ПолеСлева = 5;
ТабДокумент.ПолеСправа = 5;
ТабДокумент.ПолеСверху = 5;
ТабДокумент.ПолеСнизу = 5;

// Обнуляем колонтитулы
ТабДокумент.РазмерКолонтитулаСверху = 0;
ТабДокумент.РазмерКолонтитулаСнизу = 0;

// Задаем размещение на одной странице по ширине
ТабДокумент.АвтоМасштаб = Истина;

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

Шаг 2. Корректное формирование массива для ПроверитьВывод

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

Проанализируем правильный алгоритм проверки: в массив для метода ПроверитьВывод необходимо одновременно помещать текущую строку таблицы, подвал таблицы и секцию подписей:


МассивОбластей = Новый Массив;

Для Каждого СтрокаТЧ Из СсылкаНаДокумент.Товары Цикл
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    // Заполнение параметров строки
    ОбластьСтрока.Параметры.Заполнить(СтрокаТЧ);
    
    МассивОбластей.Очистить();
    МассивОбластей.Добавить(ОбластьСтрока);
    МассивОбластей.Добавить(ОбластьИтоги);
    МассивОбластей.Добавить(ОбластьПодписи);
    
    // Если вместе с подвалом строка не умещается, выводим разделитель страниц
    Если Не ТабДокумент.ПроверитьВывод(МассивОбластей) Тогда
        ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
        ТабДокумент.Вывести(ОбластьШапкаТаблицы);
    КонецЕсли;
    
    ТабДокумент.Вывести(ОбластьСтрока);
КонецЦикла;

// После завершения цикла выводим подвал и подписи
ТабДокумент.Вывести(ОбластьИтоги);
ТабДокумент.Вывести(ОбластьПодписи);

Шаг 3. Фиксация высоты строк в макете и оптимизация драйверов

Рассмотрим дополнительные технические меры, позволяющие сделать расчет высоты детерминированным:

  1. Фиксация высоты строк макета. В свойствах строк табличной части макета снимите флаг автоматической высоты и задайте фиксированное значение в пунктах. Это предотвратит скачки высоты строк из-за различий в шрифтовых метриках операционной системы.
  2. Настройка терминального сервера (RDP). При работе в терминале рекомендуется отключить Easy Print через групповые политики Windows (GPO) и установить на сервер оригинальные драйверы используемых принтеров. Это устранит искажения в определении непечатаемых областей страницы.
  3. Учет аппаратных полей принтера. Установка нулевых полей (ПолеСнизу = 0) не всегда решает проблему, так как драйвер принтера автоматически подставляет минимальное аппаратное ограничение устройства. Для стабильного результата задавайте минимальный технологический отступ в 5 мм.
← На главную