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