Добавление колонки с порядковым номером (№ п/п) — одна из самых частых задач при доработке внешних печатных форм. Несмотря на кажущуюся простоту, начинающие разработчики часто сталкиваются с ситуацией, когда нумерация «сбивается», начинает отсчет заново для каждой позиции или выводится некорректно при наличии группировок. В этой статье мы подробно разберем, как реализовать нумерацию строк в 1С несколькими способами: от простого счетчика в коде до использования системных полей платформы.
Этот метод является классическим и наиболее гибким. Мы создаем переменную, которая увеличивается на единицу при каждом выводе строки в табличный документ. Рассмотрим пошагово, как это сделать на основе примера из обсуждения.
Шаг 1. Подготовка макета
Прежде всего, откроем макет печатной формы. В области, которая отвечает за вывод строки (обычно это ОбластьСтрока), добавим новую ячейку для номера. В свойствах этой ячейки укажем:
НомерПП (или любое другое удобное имя).Шаг 2. Инициализация переменной в коде
Проанализируем структуру циклов в коде формирования печатной формы. Очень важно определить место, где счетчик будет обнуляться. Если мы печатаем один документ, переменную нужно объявить до начала цикла обхода строк. Если печатается пакет документов, и в каждом документе нумерация должна начинаться с единицы, инициализацию следует делать внутри цикла по документам.
Посмотрим на пример правильной реализации:
// Перед началом обхода строк данных обнуляем счетчик
НомерПП = 0;
// Начинаем цикл по строкам (например, по таблице значений или выборке из запроса)
Для Каждого СтрокаТЗ Из ТЗДанныеСтрок Цикл
// Увеличиваем номер на 1 при каждой итерации
НомерПП = НомерПП + 1;
// Получаем область строки из макета
ОбластьМакета = Макет.ПолучитьОбласть("ОбластьСтрока");
// Заполняем параметры области данными из строки
ОбластьМакета.Параметры.Заполнить(СтрокаТЗ);
// Явно передаем значение нашего счетчика в параметр макета
ОбластьМакета.Параметры.НомерПП = НомерПП;
// Выводим готовую область в итоговый табличный документ
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЦикла;
Проанализируем ситуацию, описанную автором темы. Если в коде используется иерархический обход (например, сначала по номенклатуре, потом по характеристикам), и переменная НомерПП = 0 стоит во внутреннем цикле, то при переходе к следующей группе товаров нумерация будет сбрасываться. Чтобы этого избежать, выносите объявление счетчика за пределы вложенных циклов.
Пример ошибочного размещения:
Пока ВыборкаПоГруппам.Следующий() Цикл
// ОШИБКА: Если поставить обнуление здесь, нумерация внутри каждой группы начнется с 1
// НомерПП = 0;
Пока ВыборкаСтрок.Следующий() Цикл
НомерПП = НомерПП + 1;
// ... вывод области ...
КонецЦикла;
КонецЦикла;
Чтобы нумерация была сквозной по всему документу, переменную нужно инициализировать перед первым (самым верхним) циклом обхода строк данных этого документа.
Платформа «1С:Предприятие» позволяет выводить номер строки автоматически, без использования программных счетчиков. Это особенно удобно, если вы не хотите менять логику программного модуля.
Разберем, как это настроить в макете:
№ПоПорядку.Теперь при каждом вызове метода Вывести() для данной области, платформа будет автоматически инкрементировать число в этой ячейке в рамках текущего сеанса формирования табличного документа. Важно: если вы выводите несколько разных таблиц в один документ, проверьте, не требуется ли вам сброс этого значения (хотя для простых печатных форм этот метод работает безупречно).
Если ваша печатная форма строится на основе табличной части документа (например, «Товары»), мы можем использовать уже имеющееся свойство НомерСтроки. Это гарантирует соответствие номеров в печатной форме и в самом документе 1С.
Проанализируем фрагмент запроса:
ВЫБРАТЬ
РеализацияТоваровУслугТовары.НомерСтроки КАК НомерПП,
РеализацияТоваровУслугТовары.Номенклатура.Наименование КАК Товар,
РеализацияТоваровУслугТовары.Количество КАК Количество
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
РеализацияТоваровУслугТовары.Ссылка = &Ссылка
В этом случае в коде вам вообще не нужно создавать дополнительные переменные. При выполнении ОбластьМакета.Параметры.Заполнить(ВыборкаЗапроса), параметр НомерПП заполнится автоматически из результата запроса.
Рассмотрим несколько приемов, которые сделают вашу печатную форму более профессиональной:
1. Форматирование номера. Если требуется вывести номер с точкой (например, «1.»), можно использовать функцию Формат() или простую конкатенацию:
ОбластьМакета.Параметры.НомерПП = Строка(НомерПП) + ".";
2. Проверка вывода. При нумерации строк важно следить, чтобы строка не «оторвалась» от заголовка таблицы или итогов. Используйте метод ПроверитьВывод(), как это показано в коде автора темы. Если строка с номером не помещается на страницу, 1С перенесет её вместе с шапкой (если настроено «Повторять при печати»).
3. Использование в иерархии. Если вам нужна многоуровневая нумерация (1, 1.1, 1.2), используйте структуру из нескольких переменных. Например, СчетчикГруппы и СчетчикСтроки. При начале новой группы СчетчикСтроки обнуляется, а СчетчикГруппы увеличивается.
Мы выяснили, что наиболее надежным способом для программиста является использование переменной-счетчика с корректным позиционированием её инициализации (НомерПП = 0). Это позволяет полностью контролировать процесс вывода, особенно в сложных отчетах с группировками, итогами и вложенными таблицами. Выбирайте тот метод, который лучше всего подходит под вашу текущую задачу, и всегда проверяйте корректность нумерации на документах с большим количеством строк.