Как в отчете СКД реализовать расшифровку по произвольному временному интервалу?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

При разработке аналитических отчетов в системе компоновки данных (СКД) часто возникает задача не просто вывести данные за определенный час, а предоставить пользователю возможность «провалиться» в произвольный или предопределенный временной интервал. Например, видя продажи за конкретный час, руководитель хочет одним кликом увидеть аналитику за весь утренний блок (с 9:00 до 12:00). Рассмотрим подробнее, какими способами можно реализовать такую функциональность в 1С.

Способ 1. Использование вычисляемых полей для создания интервалов

Самый простой и эффективный метод без написания сложного программного кода — это создание дополнительного аналитического разреза прямо в схеме компоновки данных. Если заказчику требуются фиксированные интервалы (утро, день, вечер), мы можем добавить вычисляемое поле.

Разберем по шагам, как это сделать:

  1. Откроем схему компоновки данных на закладке «Вычисляемые поля».
  2. Добавим новое поле, например, ВременнойИнтервал.
  3. В выражении поля пропишем логику классификации часов. Проанализируем ситуацию: нам нужно сгруппировать часы в блоки.

Пример выражения для поля ВременнойИнтервал:


ВЫБОР 
    КОГДА ЧАС(Период) >= 9 И ЧАС(Период) < 12 ТОГДА "Утренний пик (9-12)"
    КОГДА ЧАС(Период) >= 12 И ЧАС(Период) < 15 ТОГДА "Обеденное время (12-15)"
    КОГДА ЧАС(Период) >= 15 И ЧАС(Период) < 18 ТОГДА "Дневное время (15-18)"
    ИНАЧЕ "Прочее время"
КОНЕЦ

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

Способ 2. Добавление полей отбора в настройки

Иногда пользователю нужно самостоятельно задавать интервал «на лету». Как было предложено в обсуждении, мы можем добавить технические поля, которые будут участвовать только в отборах. Выясним причину, почему это удобно: это не перегружает визуальную часть отчета, но дает гибкость.

Для этого в запросе СКД можно выделить час как отдельное числовое поле:


ВЫБРАТЬ
    ЧЕК.Склад,
    ЧЕК.Сумма,
    ЧАС(ЧЕК.Дата) КАК ЧасСобытия,
    ЧЕК.Товар.Родитель КАК ГруппаТоваров
ИЗ
    Документ.ЧекККМ КАК ЧЕК

После этого на закладке «Настройки» в пользовательские настройки можно вынести отбор по полю ЧасСобытия с видом сравнения В интервале или Между. Пользователь сможет указать «с 9 по 12», и отчет перестроится. Однако это не решает задачу «проваливания» через клик по ячейке. Для реализации именно «клика» перейдем к следующему методу.

Способ 3. Программная обработка расшифровки (событие ПКМ)

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

В форме отчета существует обработчик события РезультатОбработкаРасшифровки. Мы можем проанализировать, по какому значению нажал пользователь, и предложить ему список действий.

Пример алгоритма обработки:

  1. Получаем данные текущей ячейки через ДанныеРасшифровки.
  2. Если пользователь нажал на значение часа (например, «9»), формируем список команд: «Показать интервал 9-12», «Показать интервал 9-18».
  3. При выборе пункта меню программно открываем этот же отчет с установленным отбором.

Примерный код для обработчика:


&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь; // Отключаем типовое меню
    
    // Получаем значение часа из данных расшифровки
    ЗначениеЧаса = ПолучитьЗначениеЧаса(Расшифровка); 
    
    СписокВыбора = Новый СписокЗначений;
    СписокВыбора.Добавить("Интервал_3", "Детализация за 3 часа (с " + Строка(ЗначениеЧаса) + ":00)");
    СписокВыбора.Добавить("Интервал_День", "Детализация до конца дня");
    
    ВыбранныйВариант = ВыбратьИзМеню(СписокВыбора, Элемент);
    
    Если ВыбранныйВариант <> Неопределено Тогда
        ВыполнитьПереоткрытиеОтчетаСОтбором(ЗначениеЧаса, ВыбранныйВариант.Значение);
    КонецЕсли;

КонецПроцедуры

Способ 4. Использование связанных отчетов

Это архитектурно правильный подход в системе 1С. Мы создаем два варианта отчета или два разных отчета: «Общий по часам» и «Детальный по категориям». В основном отчете для поля Час настраиваем свойство «Связи параметров компоновки данных».

Проанализируем преимущества: при двойном клике на час «9» система может открыть второй отчет и передать туда параметр НачалоПериода. Чтобы захватить интервал до 12:00, во втором (детальном) отчете в тексте запроса или в параметрах СКД можно прописать выражение:

&КонецПериодаДетализации = ДобавитьКДате(&НачалоПериода, "Час", 3)

Особенности работы с типами данных в СКД

Важно помнить, что если поле Час в вашем отчете имеет тип Дата (начало часа), то расшифровка будет работать стандартно по конкретному моменту времени. Чтобы «захватить» диапазон, нужно либо передавать во второй отчет структуру параметров, либо использовать в основном отчете поле типа Число (от 0 до 23).

При использовании числового представления часа (например, 9, 10, 11), стандартный механизм расшифровки СКД по умолчанию будет предлагать отбор «Равно», что не позволит сразу увидеть интервал. Именно поэтому использование Вычисляемых полей (Способ 1) с заранее прописанными строковыми названиями интервалов является наиболее стабильным и понятным для пользователя решением без модификации программного кода формы.

Резюме

Для решения задачи «проваливания» в промежуток времени мы рекомендуем:

← На главную