При разработке внешних печатных форм, особенно для таких документов, как договора, часто возникает необходимость вывода дополнительной информации на каждой странице. Это могут быть номера страниц, краткие реквизиты сторон или фраза «Подпись Поставщика / Подпись Покупателя». В 1С для этих целей предусмотрен механизм колонтитулов. В данной статье мы подробно разберем, как правильно настроить их программно, проанализируем типичные ошибки и рассмотрим альтернативные варианты реализации сложных подписей.
Рассмотрим ситуацию, с которой часто сталкиваются начинающие разработчики. При написании кода для настройки колонтитулов может возникнуть ошибка Ожидается символ '('. Выясним причину: она кроется в нарушении базового синтаксиса языка 1С. В сообщениях темы мы видим, что автор забыл указать имя процедуры после ключевого слова Процедура. Код выглядел так:
Процедура
Макет.НижнийКолонтитул.Выводить = Истина;
// ... остальной код
КонецПроцедуры
Для исправления необходимо обязательно задать уникальное имя процедуры и параметры в скобках. Разберем по шагам, как это должно выглядеть в контексте внешней печатной формы:
Процедура НастроитьКолонтитулы(ТабличныйДокумент) Экспорт
// Здесь мы передаем наш сформированный документ для настройки
ТабличныйДокумент.НижнийКолонтитул.Выводить = Истина;
КонецПроцедуры
Вторая важная деталь, на которую стоит обратить внимание: колонтитулы настраиваются не у объекта Макет, а у объекта ТабличныйДокумент, который является результатом заполнения макета данными. Проанализируем ситуацию: макет — это лишь шаблон (чертеж), а табличный документ — это готовый «лист», который пойдет на печать. Поэтому обращение Макет.НижнийКолонтитул ошибочно. Правильно использовать ТабличныйДокумент.НижнийКолонтитул.
Посмотрим на пример правильной настройки свойств нижнего колонтитула:
// Настройка отображения нижнего колонтитула
ТабличныйДокумент.НижнийКолонтитул.Выводить = Истина;
ТабличныйДокумент.НижнийКолонтитул.НачальнаяСтраница = 1; // Начинаем вывод с первой страницы
ТабличныйДокумент.НижнийКолонтитул.ТекстСлева = "Договор поставки № [&Номер]";
ТабличныйДокумент.НижнийКолонтитул.ТекстСправа = "Страница [&НомерСтраницы] из [&СтраницВсего]";
Одной из самых полезных возможностей колонтитулов является использование встроенных переменных. 1С позволяет автоматически подставлять данные в текст. Рассмотрим основные конструкции, которые пишутся в квадратных скобках:
[&НомерСтраницы] — вставляет порядковый номер текущего листа, что удобно, если выполняется печать книжкой.[&СтраницВсего] — общее количество страниц в документе.[&Дата] — текущая системная дата.[&Время] — текущее время печати.[&Пользователь] — имя текущего пользователя.Важный момент: Эти переменные работают только внутри свойств ТекстСлева, ТекстВЦентре и ТекстСправа. Если вы просто напишете текст без скобок, система выведет его «как есть».
Проанализируем параметры оформления. Часто требуется изменить шрифт колонтитула, чтобы он не отвлекал от основного текста договора. Для этого мы создаем объект Шрифт и присваиваем его свойству Шрифт колонтитула. Рассмотрим пример:
// Создаем шрифт: имя, размер, жирность, наклон
НовыйШрифт = Новый Шрифт("Arial", 8, Ложь, Истина);
ТабличныйДокумент.НижнийКолонтитул.Шрифт = НовыйШрифт;
// Устанавливаем высоту области колонтитула в миллиметрах
ТабличныйДокумент.РазмерКолонтитулаСнизу = 15;
Нужно помнить, что в стандартном колонтитуле нельзя применить разное оформление к разным словам. Шрифт устанавливается сразу для всей строки (левой, центральной и правой частей одновременно).
В процессе обсуждения на форуме была замечена ошибка, когда разработчик пытался применить метод Вывести() к области, предназначенной для колонтитула. Выясним, почему это не работает. Метод Вывести() добавляет данные в «тело» документа, последовательно заполняя его сверху вниз. Колонтитулы же — это служебные зоны вне основного текста, которые отрисовываются платформой автоматически на каждом листе бумаги.
Если вам нужно вывести информацию именно в колонтитул, вы просто задаете свойства ТабличныйДокумент.НижнийКолонтитул. Система сама поймет, где их напечатать.
Если ваша задача — вывести внизу каждой страницы не просто текст, а полноценные линии для подписей, места для печатей или логотипы, стандартный механизм колонтитулов не справится, так как он поддерживает только текст. В этом случае разберем альтернативный подход — повторяющиеся строки.
Алгоритм действий следующий:
ПодвалСтраницы), в которой рисуем линии подписей и размещаем текст.ПовторятьПриПечатиСтроки.Посмотрим на пример кода:
// Предположим, область подписей занимает строки с 50 по 55
ТабличныйДокумент.ПовторятьПриПечатиСтроки = ТабличныйДокумент.Область(50, , 55, );
Таким образом, указанный диапазон строк будет дублироваться в нижней части каждого печатного листа, создавая эффект полноценного графического колонтитула.
При работе с колонтитулами крайне важно правильно настроить поля документа, иначе текст колонтитула может либо обрезаться принтером, либо наложиться на основной текст. Разберем рекомендуемые параметры:
ПолеСнизу — должно быть всегда больше, чем РазмерКолонтитулаСнизу. Например, если поле 20мм, то колонтитул стоит ставить 10-12мм.Автомасштаб — лучше установить в Истина, чтобы документ корректно вписывался в границы листа при разном количестве текста.Итоговый правильный блок кода для интеграции в функцию печати будет выглядеть так:
Процедура ЗавершитьНастройкуДокумента(ТабличныйДокумент)
// Включаем нижний колонтитул
Колонтитул = ТабличныйДокумент.НижнийКолонтитул;
Колонтитул.Выводить = Истина;
Колонтитул.НачальнаяСтраница = 1;
Колонтитул.ТекстСлева = "Экземпляр Поставщика";
Колонтитул.ТекстСправа = "Стр. [&НомерСтраницы]";
// Устанавливаем шрифт
Колонтитул.Шрифт = Новый Шрифт("Times New Roman", 9);
// Настраиваем отступы
ТабличныйДокумент.РазмерКолонтитулаСнизу = 10;
ТабличныйДокумент.ПолеСнизу = 20;
КонецПроцедуры
Следуя этим рекомендациям и понимая разницу между объектами макета и итогового документа, вы сможете гибко настраивать любые печатные формы, обеспечивая профессиональный вид ваших договоров и отчетов. А если доработка кода избыточна, изучите редактирование печатных форм в пользовательском режиме.