При разработке аналитических отчетов в системе компоновки данных (СКД) часто возникает задача не просто вывести данные за определенный час, а предоставить пользователю возможность «провалиться» в произвольный или предопределенный временной интервал. Например, видя продажи за конкретный час, руководитель хочет одним кликом увидеть аналитику за весь утренний блок (с 9:00 до 12:00). Рассмотрим подробнее, какими способами можно реализовать такую функциональность в 1С.
Самый простой и эффективный метод без написания сложного программного кода — это создание дополнительного аналитического разреза прямо в схеме компоновки данных. Если заказчику требуются фиксированные интервалы (утро, день, вечер), мы можем добавить вычисляемое поле.
Разберем по шагам, как это сделать:
ВременнойИнтервал.Пример выражения для поля ВременнойИнтервал:
ВЫБОР
КОГДА ЧАС(Период) >= 9 И ЧАС(Период) < 12 ТОГДА "Утренний пик (9-12)"
КОГДА ЧАС(Период) >= 12 И ЧАС(Период) < 15 ТОГДА "Обеденное время (12-15)"
КОГДА ЧАС(Период) >= 15 И ЧАС(Период) < 18 ТОГДА "Дневное время (15-18)"
ИНАЧЕ "Прочее время"
КОНЕЦ
Теперь, если добавить это поле в группировки отчета выше поля Час, пользователь сможет увидеть общие суммы по интервалам и при необходимости развернуть их до конкретных часов или категорий товаров. СКД автоматически применит отбор по этому значению при расшифровке.
Иногда пользователю нужно самостоятельно задавать интервал «на лету». Как было предложено в обсуждении, мы можем добавить технические поля, которые будут участвовать только в отборах. Выясним причину, почему это удобно: это не перегружает визуальную часть отчета, но дает гибкость.
Для этого в запросе СКД можно выделить час как отдельное числовое поле:
ВЫБРАТЬ
ЧЕК.Склад,
ЧЕК.Сумма,
ЧАС(ЧЕК.Дата) КАК ЧасСобытия,
ЧЕК.Товар.Родитель КАК ГруппаТоваров
ИЗ
Документ.ЧекККМ КАК ЧЕК
После этого на закладке «Настройки» в пользовательские настройки можно вынести отбор по полю ЧасСобытия с видом сравнения В интервале или Между. Пользователь сможет указать «с 9 по 12», и отчет перестроится. Однако это не решает задачу «проваливания» через клик по ячейке. Для реализации именно «клика» перейдем к следующему методу.
Если требуется интерактивность, как в примере из обсуждения (выбор из меню по нажатию правой кнопки мыши), нам придется задействовать возможности встроенного языка. Рассмотрим, как программно перехватить действие пользователя в форме отчета.
В форме отчета существует обработчик события РезультатОбработкаРасшифровки. Мы можем проанализировать, по какому значению нажал пользователь, и предложить ему список действий.
Пример алгоритма обработки:
ДанныеРасшифровки.Примерный код для обработчика:
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отключаем типовое меню
// Получаем значение часа из данных расшифровки
ЗначениеЧаса = ПолучитьЗначениеЧаса(Расшифровка);
СписокВыбора = Новый СписокЗначений;
СписокВыбора.Добавить("Интервал_3", "Детализация за 3 часа (с " + Строка(ЗначениеЧаса) + ":00)");
СписокВыбора.Добавить("Интервал_День", "Детализация до конца дня");
ВыбранныйВариант = ВыбратьИзМеню(СписокВыбора, Элемент);
Если ВыбранныйВариант <> Неопределено Тогда
ВыполнитьПереоткрытиеОтчетаСОтбором(ЗначениеЧаса, ВыбранныйВариант.Значение);
КонецЕсли;
КонецПроцедуры
Это архитектурно правильный подход в системе 1С. Мы создаем два варианта отчета или два разных отчета: «Общий по часам» и «Детальный по категориям». В основном отчете для поля Час настраиваем свойство «Связи параметров компоновки данных».
Проанализируем преимущества: при двойном клике на час «9» система может открыть второй отчет и передать туда параметр НачалоПериода. Чтобы захватить интервал до 12:00, во втором (детальном) отчете в тексте запроса или в параметрах СКД можно прописать выражение:
&КонецПериодаДетализации = ДобавитьКДате(&НачалоПериода, "Час", 3)
Важно помнить, что если поле Час в вашем отчете имеет тип Дата (начало часа), то расшифровка будет работать стандартно по конкретному моменту времени. Чтобы «захватить» диапазон, нужно либо передавать во второй отчет структуру параметров, либо использовать в основном отчете поле типа Число (от 0 до 23).
При использовании числового представления часа (например, 9, 10, 11), стандартный механизм расшифровки СКД по умолчанию будет предлагать отбор «Равно», что не позволит сразу увидеть интервал. Именно поэтому использование Вычисляемых полей (Способ 1) с заранее прописанными строковыми названиями интервалов является наиболее стабильным и понятным для пользователя решением без модификации программного кода формы.
Для решения задачи «проваливания» в промежуток времени мы рекомендуем: