Как правильно использовать метод ПроверитьВывод() для разделения табличного документа на страницы?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Анализируем причину проблемы

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

Проанализируем основные факторы, влияющие на точность расчета:

  1. Масштабирование: Если в документе включен АвтоМасштаб, система пытается "сжать" данные под ширину листа, что неизбежно меняет и вертикальные пропорции.
  2. Параметры страницы: Поля (левое, правое, верхнее, нижнее) резервируют место, которое ПроверитьВывод() должен вычесть из полезной площади листа.
  3. Содержимое ячеек: Высота строки может динамически увеличиваться, если включен автоперенос текста.
  4. Кэширование настроек: 1С сохраняет параметры печати для конкретных отчетов и пользователей, что может приводить к использованию старых (неверных) отступов.

Решение 1: Использование массива областей вместо документа

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

Посмотрим на пример правильной подготовки массива для проверки:


МассивОбластей = Новый Массив;
// Добавляем основную строку
МассивОбластей.Добавить(ОбластьСтрока);
// ОБЯЗАТЕЛЬНО добавляем область подвала или итога, 
// который должен идти вместе со строкой на этой же странице
МассивОбластей.Добавить(ОбластьПодвал);

Если Не ТабДок.ПроверитьВывод(МассивОбластей) Тогда
    // Если массив целиком не влезает, принудительно переходим на новую страницу
    ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
    // Выводим шапку на новой странице, если это необходимо
    ТабДок.Вывести(ОбластьШапкаТаблицы);
КонецЕсли;

Решение 2: Предварительная установка параметров печати

Выясним критически важный нюанс: все настройки страницы должны быть определены до вызова метода проверки. Если вы устанавливаете АвтоМасштаб или ориентацию страницы в самом конце процедуры (перед методом Показать()), то ПроверитьВывод() выполнит расчет исходя из стандартных настроек (масштаб 100%, портретная ориентация), что приведет к ошибке.

Разберем последовательность действий:

  1. Создаем объект ТабличныйДокумент.
  2. Устанавливаем ИмяПараметровПечати (чтобы подтянулись настройки пользователя).
  3. Явно прописываем АвтоМасштаб = Истина (если он нужен).
  4. Устанавливаем поля (ПолеСверху, ПолеСнизу и т.д.).
  5. Устанавливаем ОриентацияСтраницы.
  6. И только после этого запускаем цикл вывода строк с проверкой.

Пример инициализации документа:


ТабДок = Новый ТабличныйДокумент;
ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ОТЧЕТ_ОБОРОТЫ";
ТабДок.АвтоМасштаб = Истина;
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДок.ПолеСверху = 10;
ТабДок.ПолеСнизу  = 10;

Решение 3: Заполнение параметров области до проверки

Проанализируем ситуацию с динамической высотой строк. Если в вашей ячейке стоит свойство "Размещать: Переносить", то высота строки зависит от длины текста. Если вы проверите "пустую" область макета, она будет иметь минимальную высоту. Как только вы заполните параметры (например, длинное наименование товара), область "раздуется".

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


ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
// Сначала заполняем данные!
ОбластьСтрока.Параметры.Номенклатура = Выборка.НоменклатураНаименование;
ОбластьСтрока.Параметры.Количество = Выборка.Количество;

МассивДляПроверки = Новый Массив;
МассивДляПроверки.Добавить(ОбластьСтрока);

// Теперь проверка будет учитывать реальную высоту заполненной строки
Если Не ТабДок.ПроверитьВывод(МассивДляПроверки) Тогда
    ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ТабДок.Вывести(ОбластьСтрока);

Решение 4: Очистка кэша настроек печати

Иногда программные методы бессильны, если у конкретного пользователя в базе сохранились некорректные настройки принтера или полей для данной формы. Если у одного пользователя отчет печатается правильно, а у другого — с разрывами, стоит обратить внимание на системный регистр СохраненныеНастройки (в некоторых конфигурациях) или системные хранилища настроек.

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

Практические рекомендации по отладке

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

  1. Включите отображение сетки и заголовков в табличном документе во время отладки.
  2. Проверьте, не используются ли в макете объединенные ячейки по вертикали. Метод ПроверитьВывод() иногда некорректно считает высоту блоков, если внутри них есть сложные объединения, выходящие за границы одной области.
  3. Обратите внимание на колонтитулы. Если НижнийКолонтитул задан (даже пробелом), он "съедает" место на каждой странице. Убедитесь, что высота колонтитулов учтена в ваших расчетах.

Подводя итог, можно сказать, что секрет успеха заключается в строгой последовательности: Настройка документа -> Заполнение данных в области -> Проверка массива областей -> Вывод. Соблюдение этой цепочки гарантирует, что ваши печатные формы будут выглядеть профессионально и аккуратно на любом принтере.

← На главную