Как установить номер первой страницы в табличном документе 1С для сквозной нумерации?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При формировании комплектов документов в 1С часто возникает задача обеспечить сквозную нумерацию. Например, когда первый документ заканчивается на 5-й странице, а второй должен автоматически начаться с 6-й. Стандартные средства работы с колонтитулами в 1С используют шаблон [&НомерСтраницы], который по умолчанию всегда начинает отсчет с единицы. В этой статье мы подробно разберем, как программно изменить этот порядок и какие нюансы платформы стоит учитывать при работе с печатными формами.

Использование свойства НомерПервойСтраницы

Рассмотрим основной способ решения задачи. Начиная с версии платформы 8.3.3, у объекта ТабличныйДокумент появилось встроенное свойство НомерПервойСтраницы. Это именно тот аналог FirstPageNumber из Excel, который искали разработчики на форумах долгое время.

Разберем, как это работает на практике. Если нам нужно, чтобы нумерация в документе началась, например, с 10-й страницы, нам достаточно установить соответствующее значение свойству объекта перед его выводом на печать или отображением пользователю. Проанализируем пример кода:


// Создаем новый табличный документ
ТабДок = Новый ТабличныйДокумент;

// Настраиваем нижний колонтитул
ТабДок.НижнийКолонтитул.Выводить = Истина;
ТабДок.НижнийКолонтитул.ТекстСправа = "Страница: [&НомерСтраницы]";

// Устанавливаем номер, с которого начнется отсчет
ТабДок.НомерПервойСтраницы = 10;

// Далее идет формирование и вывод макета
// ...
ТабДок.Показать();

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

Реализация сквозной нумерации для комплекта документов

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

Для определения количества страниц в уже сформированном документе используется метод КоличествоСтраниц(). Проанализируем алгоритм реализации такой задачи:

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

Рассмотрим пример реализации на языке 1С:


ТекущийНомер = 1;
СписокДокументов = ПолучитьСписокПечатныхФорм(); // Ваш метод получения массива ТабДок

Для Каждого ТекущийТабДок Из СписокДокументов Цикл
    // Устанавливаем начальный номер для текущего документа
    ТекущийТабДок.НомерПервойСтраницы = ТекущийНомер;
    
    // Принудительно заставляем платформу рассчитать страницы
    // Важно: это может работать медленно на очень больших документах
    КолВоСтраниц = ТекущийТабДок.КоличествоСтраниц();
    
    ТекущийНомер = ТекущийНомер + КолВоСтраниц;
КонецЦикла;

Проблема разной ориентации страниц

Часто программисты пытаются объединить весь комплект в один большой ТабличныйДокумент методом Вывести() или Присоединить(). Однако этот подход сталкивается с серьезным ограничением: в рамках одного табличного документа нельзя задать разную ориентацию страниц (например, для одного листа — «Портрет», для другого — «Ландшафт»).

Выясним, как обойти это ограничение. Начиная с версии 8.3.15, в 1С появился механизм ПакетОтображаемыхДокументов. Он позволяет объединить несколько разных объектов ТабличныйДокумент в один пакет для печати. При этом каждый документ сохраняет свои настройки (поля, ориентацию, масштаб). Но есть нюанс: сквозная нумерация в пакете автоматически не проставляется. Поэтому метод с использованием НомерПервойСтраницы и предварительным расчетом количества страниц остается самым надежным и универсальным.

Особенности и "подводные камни"

Проанализируем несколько критически важных моментов, которые могут встретиться при работе с нумерацией:

Ручное управление нумерацией (альтернативный метод)

В исключительных случаях, когда системные механизмы не подходят (например, требуется сложный формат вида "Страница 5 (Раздел А)"), разработчики используют метод ручного контроля вывода.

Разберем этот процесс по шагам:

  1. В макете создается область, имитирующая колонтитул.
  2. При выводе строк данных используется метод ПроверитьВывод().
  3. Как только метод возвращает Ложь (строка не влезает на текущий лист), программно выводится область "колонтитула" с номером страницы, затем вызывается ВывестиВертикальныйРазделительСтраниц(), и счетчик страниц инкрементируется.

Этот метод трудозатратен, но дает 100% контроль над визуализацией нумерации в любых версиях платформы 1С.

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

← На главную