При работе с многостраничными документами, такими как Универсальный передаточный документ (УПД), часто возникает необходимость вывода нумерации страниц и служебной информации (номер документа, дата) на каждом листе. В типовых конфигурациях на обычных формах, например, Управление торговлей 10.3, это реализуется программным управлением свойствами табличного документа.
Разберем подробно, как настроить автоматическую нумерацию страниц и почему стандартный код может не срабатывать, даже если он написан правильно.
Для вывода информации в нижней или верхней части каждой страницы в 1С используется объект Колонтитул. У объекта ТабличныйДокумент есть два соответствующих свойства: ВерхнийКолонтитул и НижнийКолонтитул. Проанализируем, какие параметры необходимо задать для корректного отображения номера страницы.
Рассмотрим пример кода, который устанавливает параметры нижнего колонтитула:
// Устанавливаем видимость колонтитула
ТабДокумент.НижнийКолонтитул.Выводить = Истина;
// Указываем, с какой страницы начинать вывод (обычно с 1 или 2)
ТабДокумент.НижнийКолонтитул.НачальнаяСтраница = 1;
// Определяем вертикальное положение текста в зоне колонтитула
ТабДокумент.НижнийКолонтитул.ВертикальноеПоложение = ВертикальноеПоложение.Низ;
// Формируем текст для вывода
НомерНаПечатьСтрокой = ОбщегоНазначения.ПолучитьНомерНаПечать(ДанныеДляПечати);
ДатаНаПечатьСтрокой = Формат(ДанныеДляПечати.Дата, "ДФ='дд ММММ гггг'") + " г.";
ЗаголовокДляПечати = "УПД № " + НомерНаПечатьСтрокой + " от " + ДатаНаПечатьСтрокой;
// Заполняем секции колонтитула (Лево, Центр, Право)
ТабДокумент.НижнийКолонтитул.ТекстСлева = ЗаголовокДляПечати;
ТабДокумент.НижнийКолонтитул.ТекстСправа = "Лист [&НомерСтраницы] из [&СтраницВсего]";
В данном примере мы используем специальные подстановочные конструкции: [&НомерСтраницы] и [&СтраницВсего]. Платформа 1С автоматически заменит их на порядковый номер текущего листа и общее количество страниц при выводе на печать.
Если вы добавили код, но при просмотре печатной формы колонтитулы отсутствуют, следует проверить три критических момента.
Печать() содержит несколько условий Если ... Тогда Возврат ТабДокумент;, код настройки колонтитулов должен стоять перед каждым таким возвратом. Если вы добавили настройку в самый конец функции, а программа вышла из нее раньше по условию (например, при печати по статусу счета-фактуры), настройки просто не применятся.ТабДокумент.ПолеСнизу установлено в значение 0, то колонтитулу может не хватить места для вывода. По умолчанию РазмерКолонтитулаСнизу составляет 10 мм. Рекомендуется устанавливать ПолеСнизу не менее 10-15 мм, чтобы текст не обрезался непечатной областью принтера.Проанализируем структуру функции печати в УПД. Часто документ может печататься в двух режимах: как полноценный УПД (статус 1) и как передаточный документ без счета-фактуры (статус 2). Для каждого из этих случаев в коде может быть отдельный блок вызова формирования данных.
Чтобы гарантировать вывод нумерации, лучше всего вынести настройки колонтитулов в отдельную вспомогательную процедуру и вызывать её непосредственно перед возвратом табличного документа из функции. Посмотрим на примере:
Процедура УстановитьКолонтитулыУПД(ТабДокумент, ДанныеДляПечати)
ТабДокумент.НижнийКолонтитул.Выводить = Истина;
ТабДокумент.НижнийКолонтитул.НачальнаяСтраница = 1;
НомерНаПечать = ОбщегоНазначения.ПолучитьНомерНаПечать(ДанныеДляПечати);
ДатаНаПечать = Формат(ДанныеДляПечати.Дата, "ДФ='дд ММММ гггг'");
Текст = "Универсальный передаточный документ № " + НомерНаПечать + " от " + ДатаНаПечать;
ТабДокумент.НижнийКолонтитул.ТекстСлева = Текст;
ТабДокумент.НижнийКолонтитул.ТекстСправа = "Лист [&НомерСтраницы]";
// Важно установить отступ, чтобы колонтитул влез
ТабДокумент.ПолеСнизу = 15;
КонецПроцедуры
Затем в основной функции ПечатьУниверсальногоПередаточногоДокумента найдите все строки Возврат ТабДокумент; и добавьте вызов этой процедуры перед ними.
Если требования к оформлению нумерации очень жесткие (например, номер страницы должен быть внутри рамки или иметь специфический шрифт, который нельзя задать в системном колонтитуле), применяется метод ручного вывода областей. Рассмотрим, как это работает:
ПодвалСтраницы.ПроверитьВывод().ПодвалСтраницы с параметром НомерСтраницы, затем вызывает ВывестиГоризонтальныйРазделительСтраниц() и только потом начинает новый лист с заголовком таблицы.Пример реализации проверки вывода:
Для Каждого СтрокаТовара Из ДанныеДляПечати.Товары Цикл
// Проверяем, влезет ли текущая строка вместе с подвалом страницы
МассивВыводимыхОбластей = Новый Массив;
МассивВыводимыхОбластей.Добавить(ОбластьСтрока);
МассивВыводимыхОбластей.Добавить(ОбластьПодвалСтраницы);
Если НЕ ТабДокумент.ПроверитьВывод(МассивВыводимыхОбластей) Тогда
// Выводим номер страницы в конце текущего листа
ОбластьПодвалСтраницы.Параметры.НомерСтраницы = ТекущийНомерСтраницы;
ТабДокумент.Вывести(ОбластьПодвалСтраницы);
// Переходим на новый лист
ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
ТабДокумент.Вывести(ОбластьЗаголовокТаблицы);
ТекущийНомерСтраницы = ТекущийНомерСтраницы + 1;
КонецЕсли;
ТабДокумент.Вывести(ОбластьСтрока);
КонецЦикла;
При формировании УПД важно не забывать про параметры масштабирования. Чтобы колонтитул не "съезжал" и документ выглядел профессионально, убедитесь, что в коде установлены следующие свойства:
ТабДокумент.АвтоМасштаб = Истина; — это позволит 1С автоматически подогнать ширину документа под печатный лист, что критично для широких таблиц УПД.ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт; — УПД чаще всего печатается в альбомной ориентации из-за большого количества колонок.ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_УПД"; — установка этого свойства позволит системе запомнить настройки принтера и полей, выбранные пользователем один раз, чтобы не настраивать их при каждой печати.Проанализировав ситуацию, мы выяснили, что ключ к успеху лежит в правильном расположении кода инициализации колонтитулов и контроле полей табличного документа. Используя системные свойства НижнийКолонтитул, вы получаете простой и эффективный механизм нумерации, который поддерживается платформой на уровне драйверов печати.