При формировании комплектов документов в 1С часто возникает задача обеспечить сквозную нумерацию. Например, когда первый документ заканчивается на 5-й странице, а второй должен автоматически начаться с 6-й. Стандартные средства работы с колонтитулами в 1С используют шаблон [&НомерСтраницы], который по умолчанию всегда начинает отсчет с единицы. В этой статье мы подробно разберем, как программно изменить этот порядок и какие нюансы платформы стоит учитывать при работе с печатными формами.
Рассмотрим основной способ решения задачи. Начиная с версии платформы 8.3.3, у объекта ТабличныйДокумент появилось встроенное свойство НомерПервойСтраницы. Это именно тот аналог FirstPageNumber из Excel, который искали разработчики на форумах долгое время.
Разберем, как это работает на практике. Если нам нужно, чтобы нумерация в документе началась, например, с 10-й страницы, нам достаточно установить соответствующее значение свойству объекта перед его выводом на печать или отображением пользователю. Проанализируем пример кода:
// Создаем новый табличный документ
ТабДок = Новый ТабличныйДокумент;
// Настраиваем нижний колонтитул
ТабДок.НижнийКолонтитул.Выводить = Истина;
ТабДок.НижнийКолонтитул.ТекстСправа = "Страница: [&НомерСтраницы]";
// Устанавливаем номер, с которого начнется отсчет
ТабДок.НомерПервойСтраницы = 10;
// Далее идет формирование и вывод макета
// ...
ТабДок.Показать();
Важно помнить, что свойство НомерПервойСтраницы влияет только на подстановку значения в шаблон [&НомерСтраницы]. Оно не добавляет пустые страницы в начало документа и не изменяет общее количество страниц, выводимое через шаблон [&СтраницВсего]. Общее число страниц всегда рассчитывается исходя из фактического объема данных в документе.
Теперь разберем более сложную ситуацию: у нас есть массив различных табличных документов (счета, акты, накладные), которые нужно распечатать одним пакетом со сквозной нумерацией. Для этого нам необходимо знать, сколько страниц занял предыдущий документ, чтобы правильно установить начальный номер для следующего.
Для определения количества страниц в уже сформированном документе используется метод КоличествоСтраниц(). Проанализируем алгоритм реализации такой задачи:
ТекущийНомер = 1).ТабДок.НомерПервойСтраницы = ТекущийНомер.ТекущийНомер = ТекущийНомер + ТабДок.КоличествоСтраниц().Рассмотрим пример реализации на языке 1С:
ТекущийНомер = 1;
СписокДокументов = ПолучитьСписокПечатныхФорм(); // Ваш метод получения массива ТабДок
Для Каждого ТекущийТабДок Из СписокДокументов Цикл
// Устанавливаем начальный номер для текущего документа
ТекущийТабДок.НомерПервойСтраницы = ТекущийНомер;
// Принудительно заставляем платформу рассчитать страницы
// Важно: это может работать медленно на очень больших документах
КолВоСтраниц = ТекущийТабДок.КоличествоСтраниц();
ТекущийНомер = ТекущийНомер + КолВоСтраниц;
КонецЦикла;
Часто программисты пытаются объединить весь комплект в один большой ТабличныйДокумент методом Вывести() или Присоединить(). Однако этот подход сталкивается с серьезным ограничением: в рамках одного табличного документа нельзя задать разную ориентацию страниц (например, для одного листа — «Портрет», для другого — «Ландшафт»).
Выясним, как обойти это ограничение. Начиная с версии 8.3.15, в 1С появился механизм ПакетОтображаемыхДокументов. Он позволяет объединить несколько разных объектов ТабличныйДокумент в один пакет для печати. При этом каждый документ сохраняет свои настройки (поля, ориентацию, масштаб). Но есть нюанс: сквозная нумерация в пакете автоматически не проставляется. Поэтому метод с использованием НомерПервойСтраницы и предварительным расчетом количества страниц остается самым надежным и универсальным.
Проанализируем несколько критически важных моментов, которые могут встретиться при работе с нумерацией:
НомерПервойСтраницы = 0 или отрицательное число, платформа, как правило, игнорирует эту настройку и начинает нумерацию с 1. Минимальное корректное значение — 1.КоличествоСтраниц() только после того, как в документ выведены все области.НомерПервойСтраницы вам не поможет, так как оно действует на весь документ целиком. В этом случае придется либо разбивать документ на несколько разных объектов, либо отказываться от системных колонтитулов в пользу ручного вывода областей-подвалов.В исключительных случаях, когда системные механизмы не подходят (например, требуется сложный формат вида "Страница 5 (Раздел А)"), разработчики используют метод ручного контроля вывода.
Разберем этот процесс по шагам:
ПроверитьВывод().Ложь (строка не влезает на текущий лист), программно выводится область "колонтитула" с номером страницы, затем вызывается ВывестиВертикальныйРазделительСтраниц(), и счетчик страниц инкрементируется.Этот метод трудозатратен, но дает 100% контроль над визуализацией нумерации в любых версиях платформы 1С.
Подводя итог, можно сказать, что для большинства задач в современной 1С использование ТабДок.НомерПервойСтраницы в сочетании с КоличествоСтраниц() является оптимальным решением, позволяющим быстро и эффективно настроить печать комплектов документов любой сложности.