При разработке печатных форм в системе «1С:Предприятие» программисты часто сталкиваются с требованиями маркетологов или дизайнеров разместить в самом низу каждой страницы графический элемент. Это может быть рекламный баннер, логотип компании, факсимильная подпись или печать, предупреждающая надпись или плашка обратной связи. Однако стандартный механизм работы с колонтитулами в табличном документе (ТабличныйДокумент) имеет существенное ограничение: стандартные колонтитулы могут содержать исключительно текстовую информацию. Вставить картинку непосредственно в свойства верхнего или нижнего колонтитула штатными интерактивными средствами платформы невозможно.
В этой статье мы подробно разберем, как обойти это ограничение и гарантированно разместить изображение в самом низу печатной страницы, не нарушая общую структуру документа. Мы проанализируем несколько подходов — от программной имитации колонтитулов с помощью стандартного метода ПроверитьВывод() до более сложных альтернативных решений, таких как использование HTML-верстки, внешних компонент и COM-объектов пакета Microsoft Office.
Для верхнего колонтитула в платформе 1С существует удобное свойство ПовторятьПриПечатиСтроки. Мы можем настроить макет таким образом, чтобы определенная область (например, шапка таблицы со всеми картинками и логотипами) дублировалась в начале каждого нового листа при печати. К сожалению, аналогичного свойства для нижнего колонтитула (например, «ПовторятьПриПечатиСтрокиСнизу») в платформе не предусмотрено.
Главная сложность при выводе элементов в самом низу страницы заключается в том, что система 1С формирует табличный документ сверху вниз по мере вывода строк. Заранее «прибить гвоздями» картинку к нижнему краю листа без предварительного расчета высоты выводимых данных невозможно. Если печатная форма содержит малое количество строк, то без специального позиционирования баннер отобразится сразу за последней строкой — то есть в середине или даже вверху страницы, что выглядит крайне неаккуратно. Если же строк много, баннер может некорректно перенестись на следующий лист, оставив на предыдущем пустое место.
Выясним, какие эффективные способы решения этой задачи существуют в практике разработчиков 1С.
Рассмотрим самый популярный и надежный способ реализации нижнего колонтитула средствами встроенного языка 1С. Суть метода заключается в том, что мы искусственно заполняем свободное пространство между концом содержательной части документа и нижним краем страницы невидимыми пустыми строками фиксированной высоты.
Разберем по шагам алгоритм реализации этого подхода:
Тело — основная табличная часть (строки накладной, товаров, услуг);НижнийКолонтитул — область, содержащая нужный нам рисунок (картинку или баннер);ПустаяСтрока — вспомогательная строка минимальной высоты. Внутри этой строки обязательно должна быть хотя бы одна объединенная пустая ячейка. Это критически важно, поскольку пустая строка без ячеек или со стандартной сеткой может некорректно обрабатываться алгоритмом расчета высоты или вызывать сдвиги при последующем экспорте документа в форматы Microsoft Excel или PDF.Тело в итоговый табличный документ.Посмотрим на практический пример программного кода, реализующий описанный алгоритм:
// Создаем результирующий табличный документ
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетПечатнойФормы");
// Получаем области из макета
ОбластьТело = Макет.ПолучитьОбласть("Тело");
ОбластьКолонтитул = Макет.ПолучитьОбласть("НижнийКолонтитул");
ОбластьПустаяСтрока = Макет.ПолучитьОбласть("ПустаяСтрока");
// Выводим шапку и основную часть (тело документа)
Для Каждого СтрокаДанных Из СписокТоваров Цикл
ЗаполнитьЗначенияСвойств(ОбластьТело.Параметры, СтрокаДанных);
ТабДок.Вывести(ОбластьТело);
КонецЦикла;
// Начинаем заполнение пустого пространства до низа страницы
// Для проверки вывода формируем массив, содержащий пустую строку и сам колонтитул
МассивПроверки = Новый Массив;
МассивПроверки.Добавить(ОбластьПустаяСтрока);
МассивПроверки.Добавить(ОбластьКолонтитул);
// Цикл "добивки" страницы до заполнения
Пока ТабДок.ПроверитьВывод(МассивПроверки) Цикл
ТабДок.Вывести(ОбластьПустаяСтрока);
КонецЦикла;
// Как только места для очередной пустой строки не осталось,
// выводим нашу область с рекламным баннером или картинкой
ТабДок.Вывести(ОбластьКолонтитул);
// Если предполагается вывод последующих страниц, добавляем разделитель
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
Этот простой и элегантный код позволяет жестко позиционировать рекламный баннер или любой другой графический объект у нижнего среза листа. Метод ПроверитьВывод() анализирует параметры текущего принтера по умолчанию и настройки страницы табличного документа, гарантируя высокую точность позиционирования.
Проанализируем более сложную ситуацию. Предположим, что наше Тело документа содержит текстовые области переменной высоты с включенным свойством АвтовысотаСтроки (например, подробное техническое описание, условия гарантии или длинные юридические тексты договоров). Если выводить такую секцию целиком, платформа 1С при нехватке места перенесет всю большую текстовую область на следующую страницу. В результате на предыдущей странице может образоваться огромное пустое пространство, а колонтитул «улетит» вслед за текстом.
В таких сценариях нам поможет построчный вывод текста. Разберем по шагам логику решения:
Символы.ПС.ПроверитьВывод(), помещается ли текущая строка вместе с областью нижнего колонтитула на страницу.Такой гибкий алгоритм гарантирует аккуратный постраничный вывод документов любой сложности без некрасивых разрывов и пустых полей.
Иногда требования к оформлению печатных форм выходят за рамки классической сетки 1С. Если баннеры должны плавно масштабироваться, накладываться на другие элементы или иметь сложную верстку, отличной альтернативой стандартному табличному документу станет использование формата HTML.
Платформа 1С позволяет встраивать на формы элемент управления «Поле HTML-документа» и выводить на печать HTML-код. Веб-стандарты предоставляют мощные инструменты для работы с печатными версиями страниц посредством каскадных таблиц стилей (CSS).
Рассмотрим, как зафиксировать картинку-баннер внизу страницы при помощи HTML и CSS. Для этого используются правила позиционирования и медиа-запросы для печати:
<!DOCTYPE html>
<html>
<head>
<style>
@media print {
/* Задаем фиксированное положение для области подвала на каждой печатной странице */
div.divFooter {
position: fixed;
bottom: 0;
left: 0;
right: 0;
height: 100px; /* Высота вашего баннера */
text-align: center;
}
/* Добавляем отступ для основного содержимого, чтобы оно не перекрывалось подвалом */
body {
margin-bottom: 120px;
}
}
</style>
</head>
<body>
<div class="divContent">
<!-- Здесь располагается основное тело накладной -->
<h2>Товарная накладная №123</h2>
<p>Данные о товарах и услугах...</p>
</div>
<div class="divFooter">
<!-- Область с рекламным баннером -->
<img src="path_to_your_banner.png" alt="Рекламный баннер" style="width:100%; max-width:700px;">
</div>
</body>
</html>
Свойство position: fixed; bottom: 0; в сочетании с медиа-директивой @media print указывает браузеру (или встроенному движку рендеринга 1С), что данный блок разметки должен дублироваться строго внизу каждого печатного листа. Это избавляет разработчика от необходимости рассчитывать высоту строк на стороне 1С.
Для крупных корпоративных систем с высокой нагрузкой (например, массовая печать сотен тысяч накладных в день) программный расчет высоты страниц в 1С через цикл может вызывать задержки производительности. В таких случаях используют внешние компоненты, написанные на C++ или C#.
Принцип работы этого метода выглядит следующим образом:
Такой подход обеспечивает идеальное качество позиционирования (pixel-perfect) и высочайшую скорость обработки документов, разгружая сервер 1С.
Если печать документов происходит на клиентских компьютерах под управлением операционной системы Windows с установленным пакетом Microsoft Office, мы можем прибегнуть к технологии COM-соединения. Программа 1С инициализирует подключение к приложению через COMОбъект.
В отличие от табличного документа 1С, шаблоны документов MS Word (файлы .dotx) и книги MS Excel (.xlsx) обладают полноценной поддержкой вставки изображений и водяных знаков внутрь колонтитулов страниц. Разработчику достаточно один раз настроить шаблон офисного документа, вставить рисунок в нижний колонтитул средствами Word/Excel, а затем программно заполнять только параметры табличной части. Офисный пакет автоматически возьмет на себя задачу отображения и масштабирования картинки внизу каждого листа при выводе на печать.
Мы рассмотрели различные методики решения непростой задачи размещения графических элементов в нижнем колонтитуле. Выбор конкретного метода зависит от архитектуры вашей конфигурации и требований к системе: