Top.Mail.Ru

Как в СКД сделать иерархическую нумерацию строк

В этом рецепте рассмотрим пару способов, как сделать нумерацию строк в отчетах на СКД с учетом нумерации родительской группировки. Речь идет о нумерации вида:
1. Родительская группировка
    1.1 Вложенная группировка
    1.2 Вложенная группировка
2. Родительская группировка
    2.1 Вложенная…
Итак, если у вас стоит задача сделать отчет с такой вот «иерархической» нумерацией, ниже шпаргалка, как это сделать.

Тестовый пример

Для демонстрации рассмотрим такой пример. У нас есть справочник Склады, справочник Номенклатура, и независимый регистр сведений МинимальныеОстатки, в котором мы фиксируем данные о минимальных остатках в разрезе складов и товаров.

Общий подход

Для решения нам понадобится использовать выражения языка компоновки данных Уровень() и НомерПоПорядкуВГруппировке(). Сама по себе 1С не умеет делать сложную нумерацию через точку, и наша задача — ее этому научить.
Собственно, все просто — мы проверяем, для какого уровня мы выводим поле, и если это самый верхний уровень — просто выводим обычный номер по порядку. А если это вложенная группировка — то определяем номер по порядку для вышележащей группировки, и через точку от него — выводим текущий. Звучит сложно, на деле все не так страшно. Например, у нас есть отчет, который выводит данные с группировками
Склад
    Номенклатура,
Для строк по складам мы хотим видеть нумерацию: 1,2,3,4, и т.д.
А для строк подчиненной группировки: 1.1, 1.2, 2.1, 2.2,… и т.д.
В этом случае формула будет такая:

Выбор Когда Уровень()= 0 Тогда
Строка(НомерПоПорядкуВГруппировке())
Когда Уровень() = 1 Тогда
Строка(ВычислитьВыражение("НомерПоПорядкуВГруппировке()","Склад"))
+ "." + Строка(ВычислитьВыражение("НомерПоПорядкуВГруппировке()"))
Конец

Ниже показана структура такого отчета

Разумеется, можно прописывать и более сложные формулы, например, если у нас три уровня группировок — Раздел отчета, Склад и Номенклатура — формула может быть вот такой:

Выбор Когда Уровень() = 0 Тогда
Строка(НомерПоПорядкуВГруппировке())
Когда Уровень() = 1 Тогда
Строка(ВычислитьВыражение("НомерПоПорядкуВГруппировке()","РазделОтчета")) + "." + Строка(ВычислитьВыражение("НомерПоПорядкуВГруппировке()"))
Когда Уровень() = 2 Тогда
Строка(ВычислитьВыражение("НомерПоПорядкуВГруппировке()","РазделОтчета")) + "." + Строка(ВычислитьВыражение("НомерПоПорядкуВГруппировке()","Склад")) 
+ "." + Строка(ВычислитьВыражение("НомерПоПорядкуВГруппировке()"))
Конец

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

Два варианта реализации - через макет поля и через ресурс

В любом случае нам понадобится вычисляемое поле, для которого мы будем прописывать формулу. И как водится, возможны варианты. Первое что приходит в голову — это сделать поле ресурсом, и прописать формулу для ресурса и для детальных записей.

Но тут есть подводный камень в виде авто положения ресурсов. И нам придется либо рисовать полностью макет группировки, чтобы колонки выводились в нужном порядке, либо установить свойство «Авто позиция ресурсов» — «Не использовать», но и тут мы можем получить ситуацию, когда колонки будут выводиться «криво»:

Второй вариант — это сделать макет поля, и уже в нем указать нужную формулу. Но и тут может вылезти побочный эффект — «авто» поля не будут выводить наше поле, и нам придется вывести его отдельно в каждую нужную группировку.

Рассмотрим пример более сложной структуры отчета, и как следствие, более сложной формулы для вычисляемого поля Нумерация:

В результате в шапке мы получим несколько одинаковых заголовков один под одним, что не очень красиво. Но это достаточно просто исправить, программно объединив нужную ячейку (о постобработке табличного документа поговорим как-нибудь в другой раз, там тоже много чего интересного можно сделать).

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

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *