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