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



Представляю Вашему вниманию вариант решения задачи нумерации строк иерархического отчета на СКД.

СКД — очень мощная и удобная штука. Но зачастую, для решения некоторых вопросов, приходится изобретать что-то немыслимое. Вот и в данной публикации один из примеров.

Задача состоит в том, чтобы в иерархическом отчете на СКД, вывести нумерацию строк по иерархии. Например:

Проект 1.

      Проект 1.1.

            Проект 1.1.1.

            Проект 1.1.2.

… и т.д.

 

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

Так вот решение данного вопроса лежит в макете , точнее в оформлении поля, где можно в выражении писать что угодно.

Текст выражения выглядит так:

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

 

В примере представлен вариант для 3-х уровней отчета, собственно если отчет имеет больше уровней, то нужно будет дописать выражение по аналогии. В итоге получаем отчет вот такого вида.

Отчет разрабатывался на платформе 8.3.13.1644.

14 Comments

  1. ids79

    Подумал, что у Вас действительно по иерархии каким-то образом нумерация выводится.

    Даже скачал файл…

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

    А я уж подумал — не знаю чего-то.

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

    Reply
  2. Isonic

    (1) Добавил еще 1 скриншот с настройками, чтобы не было дезинформации.

    (1)

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

    Да, можно, но всегда корректно отрабатывает.

    Reply
  3. lmnlmn

    Чудненько, но для «настоящей» иерархии бы проверить. Да и количество уровней вложенности заранее неизвестно может быть.

    Reply
  4. lmnlmn

    (1) Есть у меня статья в черновиках для произвольной иерахии, но там программный вывод.

    Reply
  5. Isonic

    (3) надо попробовать что-то придумать, сложность только в определении наименования предыдущей группировки.

    Reply
  6. lmnlmn

    (5) Если просто группировка, то это не столь большая проблема. А вот если группировка иерархическая, то в настройках группировка одна, а при выводе отчета вложенных группировок от ноля до бесконечности.

    Reply
  7. Isonic

    (6) ага, я про это и говорю.

    Reply
  8. lmnlmn

    (7) Было бы здорово найти решение без программирования. Когда задача появилась я до последнего пытался пытался это сделать. Но, в итоге, решил через программный вывод. Через «уровни» не смог спастись в иерархических группировках.

    Reply
  9. Isonic

    (8) Да, можно использовать твой метод. Только сделать процедуру универсальную, чтобы из СКД вызвать ее.

    Reply
  10. lmnlmn

    (9) Не понял идею — как через СКД вызывать процедуру?

    Reply
  11. Isonic

    (10) Использовать общую процедуру для вычисления чего-либо (пример во вложении)

    Reply
  12. lmnlmn

    (11) Для вычисления надо «контекст» запоминать либо передавать. Слишком много костылей придется придумать.

    Reply
  13. dtripleh

    Добавлением системных полей «НомерПоПорядку», «НомерПоПорядкуВГруппировке» в настройках СКД это прекрасно решается, разве нет?

    Reply
  14. Isonic

    (13) нет

    Reply

Leave a Comment

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