Каталог решений - Почти динамическая группировка по периоду в СКД

Почти динамическая группировка по периоду в СКД

Почти динамическая группировка по периоду в СКД

В наличии

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

Категория:

Описание

 

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

 

Я же хочу показать, как это сделать для пользователя максимально наглядно и максимально очевидно для программиста.

Покажу 2 варианта, но существуют, конечно же, и другие. Можно, к примеру, в процедуре

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) 	
// тут можно проанализировать какие-то параметры 
// и в структуре СКД сделать необходимые перестановки, но 
// это не true way потому что не интересно. КонецПроцедуры

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

Для начала создадим параметр, естественно, можно добавить или удалить какую-то свою периодичность.

Создание параметра

Вариант 1.

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

 

ВЫБРАТЬ

//какие-то поля,

ВЫБОР
    КОГДА &Периодичность = 1
        ТОГДА НачалоПериода(Дата, МЕСЯЦ)
    КОГДА &Периодичность = 2
        ТОГДА НачалоПериода(Дата, КВАРТАЛ)
    КОГДА &Периодичность = 3
        ТОГДА НачалоПериода(Дата, ПОЛУГОДИЕ)
    КОГДА &Периодичность = 4
        ТОГДА НачалоПериода(Дата, ГОД)
КОНЕЦ КАК Период

 

 

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

 Выражение упорядочивания

 

ВЫБОР 
    КОГДА &Периодичность = 1  
        ТОГДА Формат(Дата, "ДФ='ММММ гггг ""г.""' ") 
    КОГДА &Периодичность = 2  
        ТОГДА Формат(Дата,"ДФ='к ""квартал"" гггг ""г.""'" ) 
    КОГДА &Периодичность = 3 
        ТОГДА 
        ВЫБОР 
            КОГДА Квартал(Дата) < 3 
                ТОГДА "1" ИНАЧЕ "2"
        КОНЕЦ + Формат(Дата, "ДФ=' ""полугодие"" гггг ""г."" '")
    КОГДА &Периодичность = 4 
        ТОГДА Формат(Дата,"ДФ='гггг ""г.""'")
КОНЕЦ

Естественно, можно настроить формат так, как хотите. Можно и не настраивать.

 

Осталось только добавить наше поле в структуру варианта и вынести параметр Периодичность в быстрые настройки, для удобства.

Группировка

В общем-то, всё, почти динамическая группировка готова. Почему почти? Ну мы же должны заранее задать и описать необходимые периоды!

 

Вариант 2.

Этот вариант очень похож на первый, я тут просто покажу пару возможностей СКД. Тут мы, вместо одного поля Период, сделаем несколько полей. Месяц, Квартал, Полугодие, Год и т.д.

 

В запросе опишем эти поля вот таким образом

ВЫБОР
    КОГДА &Периодичность = 1
        ТОГДА НАЧАЛОПЕРИОДА(ВТ_Данные.Месяц, МЕСЯЦ)
    ИНАЧЕ NULL
КОНЕЦ КАК Месяц,
ВЫБОР
    КОГДА &Периодичность = 2
        ТОГДА НАЧАЛОПЕРИОДА(ВТ_Данные.Месяц, Квартал)
    ИНАЧЕ NULL
КОНЕЦ КАК Квартал,
ВЫБОР
    КОГДА &Периодичность = 3
        ТОГДА НАЧАЛОПЕРИОДА(ВТ_Данные.Месяц, Полугодие)
    ИНАЧЕ NULL
КОНЕЦ КАК Полугодие,
ВЫБОР
    КОГДА &Периодичность = 4
        ТОГДА НАЧАЛОПЕРИОДА(ВТ_Данные.Месяц, Год)
    ИНАЧЕ NULL
КОНЕЦ КАК Год,

 

NULL обязателен, чтобы использовать одну из настроек СКД — «Игнорировать NULL». Если не хотите использовать NULL, то никто не мешает для каждой из 4 группировок создать свой собственный отбор на параметр Периодичность. Я это описывать не буду, думаю и так всё очевидно.

Настройка поля

 

И создаем 4 группировки с этими полями.

 Мы так описали поля, что все, кроме одного периода, нужного нам, будут иметь значение NULL, и из-за настройки Игнорировать NULL они будут просто, внезапно, проигнорированы.

 Результат запроса

Так что в СКД избавляться от NULL нужно с умом 🙂 иногда оно бывает полезно.

 

 

На самом деле такой подход работает далеко не только для периода. Я подобным подходом пользуюсь в разных отчетах довольно часто

has been added to your cart:
Оформление заказа