К статье
Практический материал

Отчеты и Аналитика · 9 мин

Как пронумеровать строки в СКД 1С

Способы нумерации строк в СКД 1С: функция НомерПоПорядку(), АВТОНОМЕРЗАПИСИ() в запросе, вычисляемые поля и нумерация по группировкам. Примеры, ошибки, FAQ.

Нумерация строк в отчёте на системе компоновки данных (СКД) — частая задача: печатные формы требуют колонку «№ п/п», пользователи просят видеть порядковый номер записи, а в выгрузках для контролирующих органов нумерация обязательна. При этом в СКД нет очевидной галочки «пронумеровать строки», и начинающие разработчики тратят время на поиск решения.

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

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

Способ 1. Функция НомерПоПорядку() в вычисляемом поле СКД

В механизм компоновки данных встроена функция НомерПоПорядку(), доступная в выражениях вычисляемых полей. Она возвращает порядковый номер записи в выборке, начиная с единицы. Это самый «правильный» способ, потому что нумерация считается самим механизмом СКД уже после применения отборов и сортировок.

Порядок настройки: откройте схему компоновки данных, перейдите на закладку «Вычисляемые поля» и добавьте новое поле. В колонке «Путь к данным» укажите имя, например НомерСтроки, в колонке «Выражение» — НомерПоПорядку(). Заголовок можно задать сразу: «№ п/п».

Порядок действий
  1. 1
    Откройте СКД, закладка «Вычисляемые поля», добавьте поле НомерСтроки с выражением НомерПоПорядку()
  2. 2
    На закладке «Настройки» добавьте поле НомерСтроки первым в список выбранных полей
  3. 3
    Убедитесь, что в ресурсах для поля задано выражение Максимум(НомерСтроки), если есть группировки
  4. 4
    Сформируйте отчёт и проверьте, что нумерация идёт с 1 и без пропусков

Затем перейдите на закладку «Настройки» и добавьте поле НомерСтроки в выбранные поля отчёта — обычно его ставят первым в списке. После формирования отчёта каждая строка детальных записей получит порядковый номер.

Способ 2. АВТОНОМЕРЗАПИСИ() в тексте запроса

Если номер строки нужен уже на уровне набора данных — например, для дальнейших вычислений или соединений — используйте функцию языка запросов АВТОНОМЕРЗАПИСИ(). Она присваивает каждой записи результата запроса уникальный последовательный номер.

bsl
ВЫБРАТЬ
	АВТОНОМЕРЗАПИСИ() КАК НомерСтроки,
	Товары.Номенклатура КАК Номенклатура,
	Товары.Количество КАК Количество
ИЗ
	Документ.РеализацияТоваровУслуг.Товары КАК Товары

УПОРЯДОЧИТЬ ПО
	Номенклатура

Критически важный момент: без предложения УПОРЯДОЧИТЬ ПО порядок записей в результате запроса не гарантирован, и номера могут присваиваться в произвольной последовательности. Всегда добавляйте сортировку, иначе нумерация будет «прыгать» от запуска к запуску.

У способа есть ограничение: нумерация выполняется до применения отборов и группировок СКД. Если пользователь наложит отбор в настройках отчёта, в номерах появятся пропуски (1, 2, 5, 9...). Поэтому АВТОНОМЕРЗАПИСИ() подходит, когда отборы жёстко заданы в самом запросе, а не вынесены в настройки.

Способ 3. Нумерация через ресурсы и итоги

Когда в отчёте есть группировки, простое выведение вычисляемого поля в детальные записи не всегда даёт нужный результат: в строках группировок номер либо пуст, либо показывает непонятное значение. Здесь помогает настройка ресурсов.

На закладке «Ресурсы» добавьте поле НомерСтроки и укажите выражение Максимум(НомерСтроки). Тогда в строках группировок будет отображаться последний номер из входящих в группу записей, а в детальных записях — собственный номер строки.

Если нужно показать в группировке количество строк внутри неё, используйте выражение Количество(НомерСтроки) или добавьте отдельный ресурс с выражением Количество(Различные Ссылка) по ключевому полю набора данных.

Нумерация внутри каждой группировки отдельно

Частое требование: чтобы нумерация начиналась заново в каждой группе — например, внутри каждого контрагента товары нумеруются с 1. Стандартная НомерПоПорядку() такого не умеет напрямую: она считает сквозную нумерацию всей выборки.

Маршрут решения

Как выбрать подход

Нужна сквозная нумерация всех строк отчётаИспользуйте вычисляемое поле НомерПоПорядку()
Нумерация нужна заново в каждой группировкеСчитайте номер в запросе с группировкой или используйте собственную функцию в выражении вычисляемого поля
Номер нужен для соединений и вычислений в наборе данныхПрименяйте АВТОНОМЕРЗАПИСИ() с обязательным УПОРЯДОЧИТЬ ПО
Отборы задаёт пользователь в настройках отчётаНе используйте нумерацию в запросе — будут пропуски, берите НомерПоПорядку()

Практический обходной путь — собственная функция в общем модуле, вызываемая из выражения вычисляемого поля. В выражении указываете что-то вроде ОбщегоНазначенияОтчеты.НомерВГруппе(Контрагент), а в функции через статическую структуру (например, параметр сеанса или переменную модуля) накапливаете счётчики по значениям группировки. Решение рабочее, но требует аккуратности: при повторном формировании отчёта счётчики нужно сбрасывать.

Оформление колонки с номером

После того как номер появился в данных, его стоит правильно оформить. На закладке «Настройки» выделите поле НомерСтроки, откройте его параметры вывода и задайте ширину колонки — обычно достаточно 4–6 символов. Заголовок «№ п/п» задаётся либо в вычисляемом поле, либо в настройках выбранного поля.

Если отчёт выводится в табличный документ для печати, проверьте выравнивание: числовой номер по умолчанию прижимается вправо, для узкой колонки удобнее центрирование. Настраивается через условное оформление или параметры вывода поля.

Для печатных форм, где номер строки обязателен по формату документа, убедитесь, что колонка не отключается пользователем: в настройках СКД поле можно добавить на уровне всего отчёта, а не только в пользовательские настройки, и при необходимости ограничить доступность его отключения.

Проверка результата и типичные ошибки

Контрольные точки

Как проверить результат

Первый номер в отчёте
Норма

Нумерация начинается с 1

Тревожный признак

Начинается с 0 или произвольного числа — проверьте выражение

Непрерывность номеров
Норма

Номера идут подряд без пропусков

Тревожный признак

Пропуски (1, 2, 5) — номер посчитан в запросе до отбора СКД

Номера после смены сортировки
Норма

Пересчитываются в новом порядке

Тревожный признак

Остаются привязаны к старым строкам — нумерация зашита в запрос

Строки группировок
Норма

Показывают Максимум/Количество по ресурсу или пустые

Тревожный признак

Дублируют номера детальных записей

Первая типичная ошибка — пропуски в номерах. Причина почти всегда одна: нумерация выполнена в запросе через АВТОНОМЕРЗАПИСИ(), а потом СКД отфильтровала часть записей. Лечится переносом нумерации в вычисляемое поле с НомерПоПорядку().

Вторая ошибка — пустые номера в итоговых строках группировок или, наоборот, «мусорные» значения. Это признак того, что поле не добавлено в ресурсы. Добавьте ресурс с агрегатной функцией, и поведение станет предсказуемым.

Типичные ошибки
01
АВТОНОМЕРЗАПИСИ() без УПОРЯДОЧИТЬ ПО — номера присваиваются в случайном порядке и меняются между запусками
02
Нумерация в запросе при пользовательских отборах в СКД — появляются пропуски в номерах
03
Поле НомерСтроки не добавлено в ресурсы — в группировках пусто или выводится не то значение
04
Вычисляемое поле создано, но не добавлено в выбранные поля настроек — колонки нет в отчёте вообще

Третья группа проблем — производительность. На очень больших выборках дополнительное вычисляемое поле практически не влияет на скорость, а вот собственные функции в выражениях, вызываемые для каждой строки, могут заметно замедлить формирование. Если отчёт формируется дольше нескольких секунд после добавления нумерации, проверьте, нет ли в выражении вызова серверных функций с запросами внутри.

Итог

Что важно запомнить

Для нумерации строк в СКД используйте вычисляемое поле с НомерПоПорядку() — оно корректно работает с отборами и сортировками. АВТОНОМЕРЗАПИСИ() подходит только при жёстких отборах в запросе и требует УПОРЯДОЧИТЬ ПО. Для группировок добавьте поле в ресурсы с Максимум() или Количество().

Частые вопросы

Почему НомерПоПорядку() не отображается в списке функций конструктора?

Конструктор выражений СКД не всегда показывает полный список доступных функций. Функцию можно просто вписать в поле выражения вручную — компоновка её распознает. Убедитесь, что нет опечаток и используются круглые скобки без аргументов.

Можно ли начать нумерацию не с единицы?

Да, добавьте смещение прямо в выражение вычисляемого поля: НомерПоПорядку() + 100 даст нумерацию со 101. Для АВТОНОМЕРЗАПИСИ() аналогично — прибавьте константу в запросе.

Как пронумеровать строки в макете СКД для печатной формы?

В макете компоновки поле с номером выводится так же, как любое другое: создайте вычисляемое поле НомерПоПорядку(), добавьте его в ресурсы и разместите параметр в нужной ячейке макета. Нумерация заполнится при выводе.

Почему после отбора в настройках отчёта номера идут с пропусками?

Значит, номер вычисляется в запросе (АВТОНОМЕРЗАПИСИ()) до применения отборов СКД. Перенесите нумерацию в вычисляемое поле с НомерПоПорядку() — тогда номера пересчитаются уже для отфильтрованных записей.

Работает ли НомерПоПорядку() в иерархических группировках?

Функция нумерует записи выборки последовательно, включая строки иерархии. Если нужны номера только для детальных записей без учёта строк-родителей, проще выводить номер как ресурс и очищать его для групповых строк настройками вывода.

Можно ли пронумеровать строки без изменения схемы, прямо в режиме предприятия?

Если отчёт открывает настройки пользователю, можно добавить пользовательское поле с выражением НомерПоПорядку() через «Расширенную» настройку — раздел «Пользовательские поля». Это работает без изменения конфигурации, если в отчёте доступен режим редактирования выражений.