На самом деле все мы помним замечательный Универсальный отчет, который легким движением руки позволял пользователю самому выбрать период развертки. В СКД пользователь тоже может это сделать сам, но для этого ему надо изменять вариант отчета, а, к сожалению, пользователи редко хотят и умеют это делать. Да и всё равно для этого необходимо создать список необходимых полей периодов.
Я же хочу показать, как это сделать для пользователя максимально наглядно и максимально очевидно для программиста.
Покажу 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 нужно с умом :) иногда оно бывает полезно.
На самом деле такой подход работает далеко не только для периода. Я подобным подходом пользуюсь в разных отчетах довольно часто