Отчеты и Аналитика · 9 мин
Как пронумеровать строки в СКД 1С
Способы нумерации строк в СКД 1С: функция НомерПоПорядку(), АВТОНОМЕРЗАПИСИ() в запросе, вычисляемые поля и нумерация по группировкам. Примеры, ошибки, FAQ.
Нумерация строк в отчёте на системе компоновки данных (СКД) — частая задача: печатные формы требуют колонку «№ п/п», пользователи просят видеть порядковый номер записи, а в выгрузках для контролирующих органов нумерация обязательна. При этом в СКД нет очевидной галочки «пронумеровать строки», и начинающие разработчики тратят время на поиск решения.
На практике существует три рабочих подхода: встроенная функция НомерПоПорядку() в выражениях СКД, функция АВТОНОМЕРЗАПИСИ() в тексте запроса и вычисляемое поле с обработкой на языке 1С. Каждый из них имеет свои условия применения, ограничения и подводные камни.
Ниже разобраны все три способа с конкретными настройками, а также нумерация внутри группировок, типичные ошибки и способы проверить корректность результата.
Способ 1. Функция НомерПоПорядку() в вычисляемом поле СКД
В механизм компоновки данных встроена функция НомерПоПорядку(), доступная в выражениях вычисляемых полей. Она возвращает порядковый номер записи в выборке, начиная с единицы. Это самый «правильный» способ, потому что нумерация считается самим механизмом СКД уже после применения отборов и сортировок.
Порядок настройки: откройте схему компоновки данных, перейдите на закладку «Вычисляемые поля» и добавьте новое поле. В колонке «Путь к данным» укажите имя, например НомерСтроки, в колонке «Выражение» — НомерПоПорядку(). Заголовок можно задать сразу: «№ п/п».
- 1Откройте СКД, закладка «Вычисляемые поля», добавьте поле НомерСтроки с выражением НомерПоПорядку()
- 2На закладке «Настройки» добавьте поле НомерСтроки первым в список выбранных полей
- 3Убедитесь, что в ресурсах для поля задано выражение Максимум(НомерСтроки), если есть группировки
- 4Сформируйте отчёт и проверьте, что нумерация идёт с 1 и без пропусков
Затем перейдите на закладку «Настройки» и добавьте поле НомерСтроки в выбранные поля отчёта — обычно его ставят первым в списке. После формирования отчёта каждая строка детальных записей получит порядковый номер.
Способ 2. АВТОНОМЕРЗАПИСИ() в тексте запроса
Если номер строки нужен уже на уровне набора данных — например, для дальнейших вычислений или соединений — используйте функцию языка запросов АВТОНОМЕРЗАПИСИ(). Она присваивает каждой записи результата запроса уникальный последовательный номер.
ВЫБРАТЬ
АВТОНОМЕРЗАПИСИ() КАК НомерСтроки,
Товары.Номенклатура КАК Номенклатура,
Товары.Количество КАК Количество
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Товары
УПОРЯДОЧИТЬ ПО
НоменклатураКритически важный момент: без предложения УПОРЯДОЧИТЬ ПО порядок записей в результате запроса не гарантирован, и номера могут присваиваться в произвольной последовательности. Всегда добавляйте сортировку, иначе нумерация будет «прыгать» от запуска к запуску.
У способа есть ограничение: нумерация выполняется до применения отборов и группировок СКД. Если пользователь наложит отбор в настройках отчёта, в номерах появятся пропуски (1, 2, 5, 9...). Поэтому АВТОНОМЕРЗАПИСИ() подходит, когда отборы жёстко заданы в самом запросе, а не вынесены в настройки.
Способ 3. Нумерация через ресурсы и итоги
Когда в отчёте есть группировки, простое выведение вычисляемого поля в детальные записи не всегда даёт нужный результат: в строках группировок номер либо пуст, либо показывает непонятное значение. Здесь помогает настройка ресурсов.
На закладке «Ресурсы» добавьте поле НомерСтроки и укажите выражение Максимум(НомерСтроки). Тогда в строках группировок будет отображаться последний номер из входящих в группу записей, а в детальных записях — собственный номер строки.
Если нужно показать в группировке количество строк внутри неё, используйте выражение Количество(НомерСтроки) или добавьте отдельный ресурс с выражением Количество(Различные Ссылка) по ключевому полю набора данных.
Нумерация внутри каждой группировки отдельно
Частое требование: чтобы нумерация начиналась заново в каждой группе — например, внутри каждого контрагента товары нумеруются с 1. Стандартная НомерПоПорядку() такого не умеет напрямую: она считает сквозную нумерацию всей выборки.
Как выбрать подход
Практический обходной путь — собственная функция в общем модуле, вызываемая из выражения вычисляемого поля. В выражении указываете что-то вроде ОбщегоНазначенияОтчеты.НомерВГруппе(Контрагент), а в функции через статическую структуру (например, параметр сеанса или переменную модуля) накапливаете счётчики по значениям группировки. Решение рабочее, но требует аккуратности: при повторном формировании отчёта счётчики нужно сбрасывать.
Оформление колонки с номером
После того как номер появился в данных, его стоит правильно оформить. На закладке «Настройки» выделите поле НомерСтроки, откройте его параметры вывода и задайте ширину колонки — обычно достаточно 4–6 символов. Заголовок «№ п/п» задаётся либо в вычисляемом поле, либо в настройках выбранного поля.
Если отчёт выводится в табличный документ для печати, проверьте выравнивание: числовой номер по умолчанию прижимается вправо, для узкой колонки удобнее центрирование. Настраивается через условное оформление или параметры вывода поля.
Для печатных форм, где номер строки обязателен по формату документа, убедитесь, что колонка не отключается пользователем: в настройках СКД поле можно добавить на уровне всего отчёта, а не только в пользовательские настройки, и при необходимости ограничить доступность его отключения.
Проверка результата и типичные ошибки
Как проверить результат
Нумерация начинается с 1
Начинается с 0 или произвольного числа — проверьте выражение
Номера идут подряд без пропусков
Пропуски (1, 2, 5) — номер посчитан в запросе до отбора СКД
Пересчитываются в новом порядке
Остаются привязаны к старым строкам — нумерация зашита в запрос
Показывают Максимум/Количество по ресурсу или пустые
Дублируют номера детальных записей
Первая типичная ошибка — пропуски в номерах. Причина почти всегда одна: нумерация выполнена в запросе через АВТОНОМЕРЗАПИСИ(), а потом СКД отфильтровала часть записей. Лечится переносом нумерации в вычисляемое поле с НомерПоПорядку().
Вторая ошибка — пустые номера в итоговых строках группировок или, наоборот, «мусорные» значения. Это признак того, что поле не добавлено в ресурсы. Добавьте ресурс с агрегатной функцией, и поведение станет предсказуемым.
Третья группа проблем — производительность. На очень больших выборках дополнительное вычисляемое поле практически не влияет на скорость, а вот собственные функции в выражениях, вызываемые для каждой строки, могут заметно замедлить формирование. Если отчёт формируется дольше нескольких секунд после добавления нумерации, проверьте, нет ли в выражении вызова серверных функций с запросами внутри.
Что важно запомнить
Для нумерации строк в СКД используйте вычисляемое поле с НомерПоПорядку() — оно корректно работает с отборами и сортировками. АВТОНОМЕРЗАПИСИ() подходит только при жёстких отборах в запросе и требует УПОРЯДОЧИТЬ ПО. Для группировок добавьте поле в ресурсы с Максимум() или Количество().
Частые вопросы
Почему НомерПоПорядку() не отображается в списке функций конструктора?
Конструктор выражений СКД не всегда показывает полный список доступных функций. Функцию можно просто вписать в поле выражения вручную — компоновка её распознает. Убедитесь, что нет опечаток и используются круглые скобки без аргументов.
Можно ли начать нумерацию не с единицы?
Да, добавьте смещение прямо в выражение вычисляемого поля: НомерПоПорядку() + 100 даст нумерацию со 101. Для АВТОНОМЕРЗАПИСИ() аналогично — прибавьте константу в запросе.
Как пронумеровать строки в макете СКД для печатной формы?
В макете компоновки поле с номером выводится так же, как любое другое: создайте вычисляемое поле НомерПоПорядку(), добавьте его в ресурсы и разместите параметр в нужной ячейке макета. Нумерация заполнится при выводе.
Почему после отбора в настройках отчёта номера идут с пропусками?
Значит, номер вычисляется в запросе (АВТОНОМЕРЗАПИСИ()) до применения отборов СКД. Перенесите нумерацию в вычисляемое поле с НомерПоПорядку() — тогда номера пересчитаются уже для отфильтрованных записей.
Работает ли НомерПоПорядку() в иерархических группировках?
Функция нумерует записи выборки последовательно, включая строки иерархии. Если нужны номера только для детальных записей без учёта строк-родителей, проще выводить номер как ресурс и очищать его для групповых строк настройками вывода.
Можно ли пронумеровать строки без изменения схемы, прямо в режиме предприятия?
Если отчёт открывает настройки пользователю, можно добавить пользовательское поле с выражением НомерПоПорядку() через «Расширенную» настройку — раздел «Пользовательские поля». Это работает без изменения конфигурации, если в отчёте доступен режим редактирования выражений.