При разработке печатных форм в системе 1С:Предприятие часто возникает задача жесткого позиционирования определенных данных. Одной из наиболее распространенных проблем является необходимость вывести "Подвал" (например, блок с подписями, печатями или рекламную информацию) строго в нижней части листа, независимо от того, сколько строк занимает основная табличная часть документа. По умолчанию 1С выводит области друг за другом, и если данных мало, подвал "подпрыгивает" к середине страницы, что выглядит не всегда эстетично и не соответствует стандартам некоторых бланков.
В этой статье мы подробно разберем, как программно сместить область в конец страницы, проанализируем работу метода ПроверитьВывод и рассмотрим дополнительные нюансы, связанные с настройками принтера и графическими объектами.
Основная идея решения заключается в том, чтобы "забить" свободное пространство между основной табличной частью и подвалом пустыми строками. Мы будем добавлять пустую область до тех пор, пока очередная порция данных еще помещается на текущую страницу. Как только система сообщит, что данные перестали влезать — значит, мы достигли максимально возможного заполнения и можем выводить сам подвал.
Рассмотрим базовый алгоритм, который обсуждался на форуме. Предположим, у нас есть область Подвал, которую нужно прижать вниз, и область Пропуск, представляющая собой пустую строку.
Проанализируем программный код, реализующий этот подход:
// Получаем необходимые области из макета
ПоследняяОбласть = Макет.ПолучитьОбласть("Подвал");
ПустаяОбласть = Макет.ПолучитьОбласть("Пропуск");
// Создаем массив для проверки вывода.
// Важно проверять связку: ПустаяСтрока + ИтоговыйПодвал
МассивДляПроверки = Новый Массив;
МассивДляПроверки.Добавить(ПустаяОбласть);
МассивДляПроверки.Добавить(ПоследняяОбласть);
// Цикл добавления пустых строк
Пока ТабДокумент.ПроверитьВывод(МассивДляПроверки) Цикл
ТабДокумент.Вывести(ПустаяОбласть);
КонецЦикла;
// Когда место закончилось, выводим сам подвал
ТабДокумент.Вывести(ПоследняяОбласть);
При использовании стандартной высоты строки в области Пропуск вы можете заметить, что подвал все равно не доходит до самого края. Это происходит потому, что цикл прекращается, когда целая строка стандартной высоты (например, 15 пунктов) уже не влезает, хотя там могло остаться 10 пунктов свободного места.
Для максимально точного позиционирования выполним следующие действия:
Пропуск установим минимально возможную высоту строки (например, 1 или 2 пункта).ПустаяОбласть.Область().ВысотаСтроки = 1;.Чем меньше высота "шага" (пустой строки), тем точнее будет прижат подвал к нижнему полю страницы. Это позволяет добиться визуального эффекта "приклеивания" к самому краю листа.
Разберем ситуацию, когда ПроверитьВывод может работать некорректно. Этот метод эмулирует печать на текущий установленный в системе принтер. Если у пользователя не установлен принтер по умолчанию или настройки полей страницы в 1С конфликтуют с настройками драйвера, результат может быть непредсказуемым.
Важные рекомендации для повышения стабильности:
ТабДокумент.НижнееПоле = 10; // Размер в миллиметрахАвтоМасштаб установлено в значение Истина, метод ПроверитьВывод часто ошибается. Система пытается "ужать" документ, чтобы он влез по ширине, и это меняет пропорции высоты. Для точного прижимания подвала рекомендуется фиксировать масштаб (100%).Если ваша область Подвал содержит логотипы, печати или факсимиле, необходимо обратить внимание на свойства графических объектов в макете. В 1С объекты "Рисунок" имеют свойство Размещение.
Для корректного смещения вниз убедитесь, что выбрано значение "Перемещать с данными". Если установить "Не перемещать", то при программном добавлении пустых строк текст подвала уедет вниз, а картинки останутся висеть в воздухе посреди страницы.
Также стоит помнить, что картинки, выходящие за границы именованной области ячеек, могут искажать расчеты метода ПроверитьВывод. Старайтесь компоновать подвал так, чтобы все графические элементы находились строго внутри границ строк, входящих в область.
Выясним, в каких случаях стоит отказаться от манипуляций с областями в пользу штатного механизма колонтитулов. Если ваш подвал — это простая строка текста (например, "Страница №, адрес компании"), то использование ТабДокумент.НижнийКолонтитул будет гораздо эффективнее.
Преимущества колонтитула:
Минусы:
Иногда по условиям задачи подвал должен быть всегда на последней странице, причем эта страница должна быть выделена только под подвал. В этом случае перед началом нашего цикла заполнения пустотами следует принудительно разорвать страницу:
// Выводим основные данные
ТабДокумент.Вывести(ОбластьДанные);
// Переходим на новую страницу для формирования красивого финала
ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
// Теперь запускаем цикл заполнения пустотами уже на новом листе
// Это гарантирует, что подвал будет внизу абсолютно пустой последней страницы
Пока ТабДокумент.ПроверитьВывод(МассивДляПроверки) Цикл
ТабДокумент.Вывести(ПустаяОбласть);
КонецЦикла;
ТабДокумент.Вывести(ПоследняяОбласть);
Для реализации "прижатого" подвала в 1С 8.2/8.3 мы проанализировали механизм циклического вывода пустых строк с проверкой на заполнение страницы. Основными инструментами здесь выступают объект ТабличныйДокумент, методы ПроверитьВывод и Вывести. Соблюдение правил настройки высоты строк, фиксация полей страницы и правильное формирование массива для проверки позволяют добиться профессионального вида печатной формы, где все элементы подписи и итоги находятся строго на своих местах в нижней части бланка.