Работа с печатными формами в 1С:Предприятии — одна из самых частых задач программиста. Однако нередко возникают ситуации, когда программно заданные настройки страницы (ориентация, поля, размер бумаги) попросту игнорируются системой или приводят к некорректному разбиению документа на листы. В этой статье мы разберем, почему так происходит, и выработаем надежный алгоритм управления параметрами ТабличныйДокумент.
Рассмотрим ситуацию, с которой столкнулся автор темы. При формировании внешнего отчета в конфигурации «Бухгалтерия предприятия 3.0» была предпринята попытка программно установить ландшафтную ориентацию и нулевые поля. Несмотря на наличие кода, на экране документ все равно отображался с настройками по умолчанию. Давайте проанализируем исходный код:
&НаСервере
Функция ПечатьНаСервере()
ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
Макет = ОтчетОбъект.ПолучитьМакет("МБ2");
Таб = Новый ТабличныйДокумент;
// Установка параметров страницы
Таб.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
Таб.ПолеСверху = 13;
Таб.ПолеСлева = 0;
Таб.ПолеСнизу = 0;
Таб.ПолеСправа = 0;
// ... дальнейший вывод областей ...
КонецФункции
Выясним причину, по которой этот код может не работать. Самая распространенная ошибка — влияние свойства КлючПараметровПечати. В 1С реализован механизм сохранения пользовательских настроек печати. Если вы один раз сформировали отчет и вручную изменили параметры в диалоге печати, система запомнит их для данного ключа. При последующих запусках программные установки будут перекрываться сохраненными настройками пользователя.
Чтобы гарантировать применение настроек из кода, нам необходимо либо уникализировать ключ, либо очистить его. Если ключ не задан явно, 1С может использовать имя формы или имя объекта метаданных. Разберем, как принудительно заставить систему слушать наш код:
1. Если вы хотите, чтобы настройки применялись каждый раз «как в первый раз», установите пустое значение для ключа перед выводом:
Таб.КлючПараметровПечати = "";
2. Если же вы хотите сохранить возможность пользовательской настройки, но сбросить текущие «неправильные» параметры, измените строку идентификатора ключа, например, добавьте версию или текущую дату (в целях отладки).
Важный момент: настройка Таб.Автомасштаб = Истина; также может конфликтовать с ручным разбиением на страницы. Проанализируем это подробнее в следующем разделе.
Одной из серьезных проблем является некорректное разбиение на страницы, когда после вывода части данных внизу листа остается много пустого места (до 40%). Рассмотрим, как работает метод ПроверитьВывод(). Этот метод анализирует, поместится ли массив областей на текущую страницу, исходя из текущих настроек табличного документа и параметров принтера по умолчанию.
Разберем по шагам правильный алгоритм работы:
ОриентацияСтраницы, РазмерСтраницы, ПолеСверху, ПолеСнизу), должны быть установлены до первого вызова метода Вывести() или ПроверитьВывод(). Если вы измените ориентацию с портрета на ландшафт в середине процесса, 1С продолжит рассчитывать перенос страниц по старым границам.ВерхнийКолонтитул.Выводить = Истина;, система резервирует под него место. Проверьте высоту колонтитула, так как она напрямую уменьшает полезную область печати.ПроверитьВывод() критически зависит от драйвера принтера. Если в системе нет установленных принтеров, расчеты могут быть непредсказуемыми. Попробуйте установить в системе стандартный виртуальный принтер (например, Microsoft Print to PDF) как принтер по умолчанию.Иногда даже при верных настройках «хвосты» таблиц не влезают. Посмотрим на пример кода, который помогает справиться с этой ситуацией, используя программный контроль масштаба:
// Перед началом вывода
Таб.Автомасштаб = Истина; // Позволяет 1С самой вписать документ по ширине
Таб.РазмерСтраницы = "A4";
// Если нужно жестко контролировать высоту страницы
// (иногда используется для нестандартных бланков)
Таб.РазмерСтраницы = "Custom";
Таб.ВысотаСтраницы = 297; // Значение в миллиметрах
Таб.ШиринаСтраницы = 210;
В сообщении №10 автор предложил использовать свойство Custom и временно увеличивать высоту страницы. Это является «костылем», но помогает понять логику платформы: увеличивая виртуальную высоту страницы, мы заставляем ПроверитьВывод думать, что места еще много. Однако правильнее будет отрегулировать поля и проверить, нет ли в макете строк с включенным свойством ВместеСоСледующим.
Проанализируем ситуацию, если параметры все равно не применяются:
Таб.Записать(Путь, ТипФайлаТабличногоДокумента.PDF)), убедитесь, что перед записью вы явно установили ИмяПринтера = "";. Это инициализирует контекст печати и заставляет 1С применить параметры страницы к PDF-файлу.Таб.КоличествоСтраниц(). Если это число увеличивается раньше, чем вы ожидали, значит, текущая выводимая область (или её настройки оформления) не проходят проверку высоты.ПроверитьВывод() плохо работает с областями, где есть перенос текста в объединенных по вертикали ячейках. 1С не всегда может заранее рассчитать их итоговую высоту.Подведем итог. Для надежного управления страницей ТабличныйДокумент всегда придерживайтесь правила: сначала инициализируем объект, затем устанавливаем все параметры страницы и КлючПараметровПечати = "", и только после этого приступаем к заполнению документа данными. Это исключит влияние старых настроек пользователя и позволит методу ПроверитьВывод работать корректно.