Параметр Периодичность в СКД
Поиски в интернете удобных решений для задания в СКД пользовательского параметра Периодичность у меня успехом не увенчались. Поэтому когда в голову пришло такое решение, решил выложить.
- Описание
- Подробнее
Описание
Итак, задача состоит в том, чтобы для оборотного регистра накопления через выбор пользователем значения параметра Периодичность задавалась соответствующая периодичность регистра.
Очевидный способ вроде «РегистрНакопления.ЗаказыПокупателей.Обороты(, , День {(&Периодичность)}, )» не работает — СКД ругается на наличие параметра в этом месте.
Вариант «РегистрНакопления.ЗаказыПокупателей.Обороты(, , Авто, )» имеет такой недостаток, что пользователю приходится в настройках вывода отчета во всех местах, где он хочет отобразить период, изменять поле с ПериодДень на ПериодНеделя (или другие). Неудобно, некрасиво, раздражает. Но все же работает.
Еще вариант, красивый но для больших объемов данных не выигрышный. Используем в запросе периодичность День (или мельче вплоть до Регистратор). Создаем вычисляемое поле ПериодНовый с выражением вроде НачалоПериода(, &Периодичность). Параметры оформляем так же, как в итоговом решении (см. рисунок Параметры). Минус в том, что запрос, независимо от выбора Периодичности, выполняется с периодом День (или какой мы указали в запросе), а потом поле периода еще и пересчитывается. То есть такой отчет не только не оптимизирует отчет, но и содержит дополнительные вычисления.
Я предлагаю промежуточный вариант. Заводим следующие параметры (см. соответствующий рисунок). Видим 2 параметра Периодичность — один доступен пользователю, второй задан таким образом, что существует всегда. независимо от того, выбрал пользователь параметр или нет. Параметрам задан список допустимых значений «День», «Неделя», и т.д.
В запросе встречается параметр &Периодичность следующим образом:
ВЫБРАТЬ
ВЫБОР
КОГДА &Периодичность = "Неделя" ТОГДА ЗаказыПокупателейОбороты.ПериодНеделя
КОГДА &Периодичность = "Месяц" ТОГДА ЗаказыПокупателейОбороты.ПериодМесяц
КОГДА &Периодичность = "Кварта" ТОГДА ЗаказыПокупателейОбороты.ПериодКвартал
КОГДА &Периодичность = "Год" ТОГДА ЗаказыПокупателейОбороты.ПериодГод
ИНАЧЕ ЗаказыПокупателейОбороты.ПериодДень КОНЕЦ КАК Период
ИЗ РегистрНакопления.ЗаказыПокупателей.Обороты(, , Авто, ) КАК ЗаказыПокупателейОбороты
Затем поле период используем там, где нам надо. параметр Периодичность пользователь видит в списке параметров.
P.S. Я не знаю точно, считает ли СКД при запросе все поля периодДень, ПериодНеделя и т.д. или все же сама выбирает только нужное. Если кто знает, буду рад конкретному ответу. К сожалению, если она вычисляет их все, то данный способ становится не лучше, чем третий из упомянутых в начале.
