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