Как сделать нумерацию страниц в печатной форме УПД

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При работе с многостраничными документами, такими как Универсальный передаточный документ (УПД), часто возникает необходимость вывода нумерации страниц и служебной информации (номер документа, дата) на каждом листе. В типовых конфигурациях на обычных формах, например, Управление торговлей 10.3, это реализуется программным управлением свойствами табличного документа.

Разберем подробно, как настроить автоматическую нумерацию страниц и почему стандартный код может не срабатывать, даже если он написан правильно.

Использование системных колонтитулов табличного документа

Для вывода информации в нижней или верхней части каждой страницы в 1С используется объект Колонтитул. У объекта ТабличныйДокумент есть два соответствующих свойства: ВерхнийКолонтитул и НижнийКолонтитул. Проанализируем, какие параметры необходимо задать для корректного отображения номера страницы.

Рассмотрим пример кода, который устанавливает параметры нижнего колонтитула:


// Устанавливаем видимость колонтитула
ТабДокумент.НижнийКолонтитул.Выводить = Истина;

// Указываем, с какой страницы начинать вывод (обычно с 1 или 2)
ТабДокумент.НижнийКолонтитул.НачальнаяСтраница = 1;

// Определяем вертикальное положение текста в зоне колонтитула
ТабДокумент.НижнийКолонтитул.ВертикальноеПоложение = ВертикальноеПоложение.Низ;

// Формируем текст для вывода
НомерНаПечатьСтрокой = ОбщегоНазначения.ПолучитьНомерНаПечать(ДанныеДляПечати);
ДатаНаПечатьСтрокой = Формат(ДанныеДляПечати.Дата, "ДФ='дд ММММ гггг'") + " г.";
ЗаголовокДляПечати = "УПД № " + НомерНаПечатьСтрокой + " от " + ДатаНаПечатьСтрокой;

// Заполняем секции колонтитула (Лево, Центр, Право)
ТабДокумент.НижнийКолонтитул.ТекстСлева = ЗаголовокДляПечати;
ТабДокумент.НижнийКолонтитул.ТекстСправа = "Лист [&НомерСтраницы] из [&СтраницВсего]";

В данном примере мы используем специальные подстановочные конструкции: [&НомерСтраницы] и [&СтраницВсего]. Платформа 1С автоматически заменит их на порядковый номер текущего листа и общее количество страниц при выводе на печать.

Почему колонтитулы не отображаются: основные причины

Если вы добавили код, но при просмотре печатной формы колонтитулы отсутствуют, следует проверить три критических момента.

  1. Точки возврата из функции (Return). Это самая частая ошибка при кастомизации внешних печатных форм. Если функция Печать() содержит несколько условий Если ... Тогда Возврат ТабДокумент;, код настройки колонтитулов должен стоять перед каждым таким возвратом. Если вы добавили настройку в самый конец функции, а программа вышла из нее раньше по условию (например, при печати по статусу счета-фактуры), настройки просто не применятся.
  2. Размер полей страницы. Если свойство ТабДокумент.ПолеСнизу установлено в значение 0, то колонтитулу может не хватить места для вывода. По умолчанию РазмерКолонтитулаСнизу составляет 10 мм. Рекомендуется устанавливать ПолеСнизу не менее 10-15 мм, чтобы текст не обрезался непечатной областью принтера.
  3. Режим предварительного просмотра. Обратите внимание, что системные колонтитулы часто не видны в обычном режиме просмотра формы в 1С, но становятся заметны при нажатии кнопки "Предварительный просмотр" или при физической печати (в том числе на виртуальный принтер PDF).

Корректировка логики функции печати УПД

Проанализируем структуру функции печати в УПД. Часто документ может печататься в двух режимах: как полноценный УПД (статус 1) и как передаточный документ без счета-фактуры (статус 2). Для каждого из этих случаев в коде может быть отдельный блок вызова формирования данных.

Чтобы гарантировать вывод нумерации, лучше всего вынести настройки колонтитулов в отдельную вспомогательную процедуру и вызывать её непосредственно перед возвратом табличного документа из функции. Посмотрим на примере:


Процедура УстановитьКолонтитулыУПД(ТабДокумент, ДанныеДляПечати)
    ТабДокумент.НижнийКолонтитул.Выводить = Истина;
    ТабДокумент.НижнийКолонтитул.НачальнаяСтраница = 1;
    
    НомерНаПечать = ОбщегоНазначения.ПолучитьНомерНаПечать(ДанныеДляПечати);
    ДатаНаПечать = Формат(ДанныеДляПечати.Дата, "ДФ='дд ММММ гггг'");
    
    Текст = "Универсальный передаточный документ № " + НомерНаПечать + " от " + ДатаНаПечать;
    
    ТабДокумент.НижнийКолонтитул.ТекстСлева = Текст;
    ТабДокумент.НижнийКолонтитул.ТекстСправа = "Лист [&НомерСтраницы]";
    
    // Важно установить отступ, чтобы колонтитул влез
    ТабДокумент.ПолеСнизу = 15;
КонецПроцедуры

Затем в основной функции ПечатьУниверсальногоПередаточногоДокумента найдите все строки Возврат ТабДокумент; и добавьте вызов этой процедуры перед ними.

Альтернативный метод: ручная нумерация через макет

Если требования к оформлению нумерации очень жесткие (например, номер страницы должен быть внутри рамки или иметь специфический шрифт, который нельзя задать в системном колонтитуле), применяется метод ручного вывода областей. Рассмотрим, как это работает:

  1. В макете печатной формы создается отдельная область, например, ПодвалСтраницы.
  2. В коде, при выводе строк товаров, используется метод ПроверитьВывод().
  3. Если очередная строка не помещается на текущий лист, программа сначала выводит область ПодвалСтраницы с параметром НомерСтраницы, затем вызывает ВывестиГоризонтальныйРазделительСтраниц() и только потом начинает новый лист с заголовком таблицы.

Пример реализации проверки вывода:


Для Каждого СтрокаТовара Из ДанныеДляПечати.Товары Цикл
    // Проверяем, влезет ли текущая строка вместе с подвалом страницы
    МассивВыводимыхОбластей = Новый Массив;
    МассивВыводимыхОбластей.Добавить(ОбластьСтрока);
    МассивВыводимыхОбластей.Добавить(ОбластьПодвалСтраницы);
    
    Если НЕ ТабДокумент.ПроверитьВывод(МассивВыводимыхОбластей) Тогда
        // Выводим номер страницы в конце текущего листа
        ОбластьПодвалСтраницы.Параметры.НомерСтраницы = ТекущийНомерСтраницы;
        ТабДокумент.Вывести(ОбластьПодвалСтраницы);
        
        // Переходим на новый лист
        ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
        ТабДокумент.Вывести(ОбластьЗаголовокТаблицы);
        
        ТекущийНомерСтраницы = ТекущийНомерСтраницы + 1;
    КонецЕсли;
    
    ТабДокумент.Вывести(ОбластьСтрока);
КонецЦикла;

Дополнительные настройки для печати

При формировании УПД важно не забывать про параметры масштабирования. Чтобы колонтитул не "съезжал" и документ выглядел профессионально, убедитесь, что в коде установлены следующие свойства:

Проанализировав ситуацию, мы выяснили, что ключ к успеху лежит в правильном расположении кода инициализации колонтитулов и контроле полей табличного документа. Используя системные свойства НижнийКолонтитул, вы получаете простой и эффективный механизм нумерации, который поддерживается платформой на уровне драйверов печати.

← На главную