При разработке печатных форм в 1С программисты часто сталкиваются с задачей, когда определенные блоки (например, итоговые суммы, подписи сторон или реквизиты) должны располагаться не строго за табличной частью, а в самом низу листа, «прижатыми» к нижнему краю. Это придает документу профессиональный вид и соответствует стандартам многих типовых бланков. В этой статье мы подробно разберем несколько способов реализации данной задачи, начиная от простых манипуляций с макетом и заканчивая использованием программных методов контроля вывода.
Это наиболее надежный и гибкий способ. Его суть заключается в том, чтобы после вывода основной табличной части программно заполнять оставшееся пустое пространство страницы «невидимыми» строками до тех пор, пока на текущем листе еще остается место. Как только 1С определит, что место заканчивается, мы выводим итоговую область.
Рассмотрим по шагам, как это реализовать:
ПустаяСтрока), состоящую из одной строки минимальной высоты.ПроверитьВывод(), который позволяет имитировать добавление области в табличный документ и проверять, помещается ли она на текущую страницу с учетом заданных параметров печати.Проанализируем пример кода, реализующий данный алгоритм:
// Сначала выводим шапку и табличную часть
ТабДок.Вывести(ОбластьШапка);
Для Каждого СтрокаТЧ Из СсылкаНаОбъект.Товары Цикл
ОбластьСтрока.Параметры.Заполнить(СтрокаТЧ);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
// Теперь определяем, сколько пустых строк нужно вставить
// Создаем массив областей, которые ДОЛЖНЫ поместиться внизу страницы (пустая строка + итоги)
МассивОбластей = Новый Массив;
МассивОбластей.Добавить(ОбластьПустаяСтрока);
МассивОбластей.Добавить(ОбластьИтоги);
// В цикле добавляем пустые строки, пока они помещаются вместе с подвалом
Пока ТабДок.ПроверитьВывод(МассивОбластей) Цикл
ТабДок.Вывести(ОбластьПустаяСтрока);
КонецЦикла;
// Когда цикл прервался, значит следующая пустая строка вызовет переход на новый лист
// Теперь выводим область итогов, она окажется в самом низу текущей страницы
ТабДок.Вывести(ОбластьИтоги);
Важно помнить: чтобы этот метод работал корректно, у ТабличногоДокумента должны быть установлены параметры страницы (размер бумаги, поля), иначе ПроверитьВывод() не сможет правильно рассчитать остаток места.
Иногда требуется записать данные в конкретную ячейку, зная ее номер строки и колонки. В 1С объект ТабличныйДокумент позволяет обращаться к любой области по координатам через метод Область(). Это может быть полезно, если вы работаете с бланком строгой отчетности, где высота каждой строки фиксирована.
Выясним, как работать с координатами напрямую. Допустим, мы знаем, что на стандартном листе А4 при определенной высоте строк (например, 15 пунктов) помещается ровно 40 строк. Мы можем принудительно вывести итоги в 38-ю строку.
Посмотрим на пример кода:
// Предположим, итоги должны быть в 40-й строке
НомерСтрокиДляИтогов = 40;
НомерКолонкиДляИтогов = 5;
// Получаем конкретную ячейку по координатам (Строка_Начало, Колонка_Начало, Строка_Конец, Колонка_Конец)
ОбластьЯчейкаИтогов = ТабДок.Область(НомерСтрокиДляИтогов, НомерКолонкиДляИтогов, НомерСтрокиДляИтогов, НомерКолонкиДляИтогов);
ОбластьЯчейкаИтогов.Текст = "Итого: " + ИтоговаяСумма;
ОбластьЯчейкаИтогов.Шрифт = Новый Шрифт(,,Истина); // Жирный шрифт
Важный нюанс: если табличная часть окажется слишком длинной и «наползет» на фиксированные координаты итогов, данные могут перекрыться. Поэтому данный метод рекомендуется использовать только в сочетании с жестким ограничением количества строк в табличной части или на бланках с заранее известной разметкой.
Если задача стоит в том, чтобы выводить краткую информацию (номер страницы, ответственное лицо, сумма документа) в самом низу каждого листа, идеальным решением будет использование механизма колонтитулов. Колонтитулы — это специальные области, которые печатаются вне основного поля данных.
Разберем основные свойства колонтитула в 1С:
НижнийКолонтитул.Выводить — логическое значение, включающее отображение.НижнийКолонтитул.ТекстСправа, ТекстСлева, ТекстЦентр — позволяют задать текстовое содержимое.[&Страница] для номера текущей страницы, [&Дата] для текущей даты.Пример настройки программно:
ТабДок.НижнийКолонтитул.Выводить = Истина;
ТабДок.НижнийКолонтитул.ТекстСправа = "Итого к оплате: " + Формат(СуммаДокумента, "ЧДЦ=2");
ТабДок.НижнийКолонтитул.НачальнаяСтраница = 1;
Главным ограничением этого метода является невозможность использования сложного форматирования (рамки ячеек, картинки, сложные таблицы) внутри колонтитула — там доступен только простой текст.
Малоизвестный, но эффективный способ — программное создание объекта Рисунок в табличном документе. Рисунки в 1С могут содержать текст и позиционироваться в миллиметрах относительно краев листа.
Рассмотрим алгоритм действий:
ТипРисункаТабличногоДокумента.Текст.Верх и Лево в миллиметрах. Координата Верх для низа листа А4 составит примерно 280-285 мм.Проанализируем ситуацию на примере кода:
// Добавляем текстовый блок в самый низ страницы
НовыйРисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);
НовыйРисунок.Текст = "Подпись ответственного лица: ___________";
НовыйРисунок.Верх = 280; // Расстояние от верха страницы в мм
НовыйРисунок.Лево = 20; // Отступ слева в мм
НовыйРисунок.Высота = 10;
НовыйРисунок.Ширина = 150;
НовыйРисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии);
Этот метод позволяет «прибить» данные к определенному месту на бумаге абсолютно независимо от того, сколько строк вывела 1С в основной части документа. Однако следует быть осторожным с полями принтера, чтобы текст не попал в непечатную область.
Выбор метода зависит от ваших конкретных целей:
Мы надеемся, что эти способы помогут вам сделать ваши печатные формы более удобными и соответствующими требованиям заказчика. Помните, что всегда стоит проверять результат на предварительном просмотре печати, так как разные драйверы принтеров могут незначительно менять итоговую верстку документа.