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