Странно, что никто до сих пор об этом не написал, а может, я просто плохо искал. Как бы то ни было, решил поделиться простым способом сделать график более наглядным.
Началось с того, что есть у меня табличка с данными за несколько лет. И вот захотелось приделать к этой табличке отчет в виде графиков по месяцам. Сказано – сделано.
Вид, честно говоря, не очень. Как-то тесновато графику в рамках, отведенных платформой.
Не скажу, что я большой мастер рисования графиков в 1С. Как раз наоборот. И наверняка внешний вид можно улучшить, если залезть в код и сделать все самому. Но что-то не хочется мне туда лезть.
Ладно, что тут можно сделать из простого? А добавлю-ка я группировку диаграмм по годам:
И, соответственно, строчку в запрос:
ГОД(ВТОтчет.Месяц) КАК Год
Здесь Месяц – это дата начала месяца, так что все нормально.
В целом гораздо лучше. Но не совсем. Если бы нынешний год близился к завершению, было бы нормально. Однако ж, он только начался, так что самая свежая часть графика получилась какой-то куцей. В январе вообще не на что было бы смотреть.
И тут пришла в голову идея – почему бы не нарезать график не по календарным годам, а просто по периодам в год, но только отсчитывать их назад от текущего момента?
Сейчас на дворе апрель – вот пусть и режет на куски с мая по апрель.
Пришлось еще сильнее удлинить запрос. Только не спрашивайте, зачем столько временных таблиц. Причина скрыта за многоточием.
…
ГОД(ВТОтчет.Месяц) КАК Год
ПОМЕСТИТЬ ВТсГодом
ИЗ
ВТОтчет КАК ВТОтчет
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТсГодом.Месяц,
ВТсГодом.Приход,
ВТсГодом.Расход,
ВТсГодом.Год,
ВЫБОР
КОГДА МЕСЯЦ(ВТсГодом.Месяц) > ВЗМесяц.ПоследнийМесяц
ТОГДА ВТсГодом.Год + 1
ИНАЧЕ ВТсГодом.Год
КОНЕЦ КАК Период
ИЗ
ВТсГодом КАК ВТсГодом,
(ВЫБРАТЬ
МЕСЯЦ(МАКСИМУМ(ВТсГодом.Месяц)) КАК ПоследнийМесяц
ИЗ
ВТсГодом КАК ВТсГодом) КАК ВЗМесяц
Напоминаю, Месяц – дата начала месяца. А вот ПоследнийМесяц – это номер месяца в году. И Период – это номер года, в котором заканчивается соответствующий период длиной в год.
Соответственно, делаю группировку по периоду:
Результат просто восхитительный:
Однако ж есть еще одно соображение: всякому графику – свое время. Надо бы сделать переключатель на три позиции, да и выбирать подходящую нарезку на ходу.
Как сделать переключатель, все и так знают. А вот что с ним дальше делать – над этим пришлось задуматься. Программно перестраивать дерево отчета – не-не-не, чур меня. Сами как-нибудь, если очень хочется. Посмотрю-ка лучше, что еще можно применить из арсенала СКД.
И в итоге сообразил сделать вот такой хитрый финт ушами:
Примечательно, что здесь все три диаграммы – на самом деле одно и то же. Они ведь принадлежат одному и тому же варианту отчета. А значит, все, что прописано в закладках под структурой, относится ко всем трем сразу.
Теперь остается лишь в процедуре ПриКомпоновкеРезультата() программно переставлять галочки в начале основных ветвей:
…
НастройкиКомпоновки = КомпоновщикНастроек.ПолучитьНастройки();
// Выбор ветви структуры отчета
Если ГруппировкаДиаграмм = Перечисления.ГруппировкаДиаграмм.ГруппироватьПоГодам Тогда
НастройкиКомпоновки.Структура[0].Использование = Ложь;
НастройкиКомпоновки.Структура[1].Использование = Истина;
НастройкиКомпоновки.Структура[2].Использование = Ложь;
ИначеЕсли ГруппировкаДиаграмм = Перечисления.ГруппировкаДиаграмм.ГруппироватьПоПериодам Тогда
НастройкиКомпоновки.Структура[0].Использование = Ложь;
НастройкиКомпоновки.Структура[1].Использование = Ложь;
НастройкиКомпоновки.Структура[2].Использование = Истина;
Иначе
НастройкиКомпоновки.Структура[0].Использование = Истина;
НастройкиКомпоновки.Структура[1].Использование = Ложь;
НастройкиКомпоновки.Структура[2].Использование = Ложь;
КонецЕсли;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,
НастройкиКомпоновки,ДанныеРасшифровки);
…
Вот и все. Комментарии приветствуются.