При разработке отчетов на Системе компоновки данных (СКД) часто возникает задача упростить интерфейс для пользователя. Стандартный выбор даты через календарь не всегда удобен, если отчет предполагает анализ данных строго по месяцам. Пользователю гораздо привычнее выбрать «Январь 2024», чем указывать «01.01.2024». Рассмотрим подробнее, какими способами можно реализовать выбор месяца, сохраняя при этом корректную работу запроса.
Это один из самых простых и «чистых» способов с точки зрения интерфейса. Он позволяет подменить техническую дату на понятное человеку текстовое представление. Разберем этот метод по шагам:
&МесяцОтчета) установим тип Дата.Проанализируем ситуацию: теперь при формировании отчета пользователь увидит выпадающий список с названиями месяцев. В сам же запрос СКД передаст реальное значение даты, которое мы указали в первой колонке. Главный минус этого способа — необходимость ежегодно обновлять список доступных значений.
Если нам не критично ограничение выбора именно первым числом, но мы хотим, чтобы в поле ввода отображался только месяц и год, воспользуемся визуальной настройкой. Посмотрим на настройку Параметры редактирования:
ДФ='MMMM yyyy'.В этом случае при выборе даты все равно откроется стандартный календарь, но после выбора числа в поле параметра будет отображаться только название месяца и год. Это улучшает визуальное восприятие отчета, хотя и не избавляет от выбора конкретного дня в календаре.
Рассмотрим более продвинутый метод, который автоматизирует вычисления и избавляет от ручного заполнения дат. Мы создадим два параметра: один для выбора пользователем, второй — скрытый — для расчетов в запросе.
Шаг 1. Создаем параметр &ВыбранныйМесяц с типом Число. В доступных значениях прописываем числа от 1 до 12 с представлениями «Январь», «Февраль» и так далее.
Шаг 2. Создаем параметр &НачалоПериода. Устанавливаем ему ограничение доступности (чтобы пользователь его не видел). В поле Выражение пропишем формулу:
ДатаВремя(Год(ТекущаяДата()), &ВыбранныйМесяц, 1)
Таким образом, СКД автоматически сконструирует дату начала месяца текущего года на основании выбора пользователя. Если требуется выбор и года, можно добавить третий параметр &Год и использовать его в функции ДатаВремя.
В платформе 1С существует системный тип данных СтандартныйПериод. Он удобен тем, что уже содержит готовые механизмы выбора месяцев, кварталов и лет. Чтобы гарантировать, что отчет будет строиться именно по границам месяца, даже если пользователь выбрал произвольные даты, в тексте запроса или в выражениях параметров следует использовать функции приведения периода.
Например, в выражении параметра &ДатаНачала (если он используется в виртуальных таблицах) можно написать:
НАЧАЛОПЕРИОДА(&СтандартныйПериод.ДатаНачала, "МЕСЯЦ")
Это позволит «нормализовать» ввод пользователя. Даже если будет выбрано 15 января, система подставит 1 января.
Если в вашей конфигурации уже есть перечисление МесяцыГода, вы можете использовать его в качестве типа параметра. Для получения даты из значения перечисления в СКД можно использовать функцию ДобавитьКДате, опираясь на порядок элемента в перечислении. Выясним причину, почему это удобно: такой подход исключает ошибки ввода и жестко фиксирует возможные варианты выбора.
Пример выражения для скрытого параметра даты:
ДобавитьКДате(ДатаВремя(Год(ТекущаяДата()), 1, 1), "Месяц", Число(Порядок(&ВыбранныйМесяц)) - 1)
Если стандартных средств СКД недостаточно и требуется специфическое поведение, можно прибегнуть к написанию небольшого кода в модуле формы отчета. Рассмотрим пример вызова немодального окна выбора из списка значений:
&НаКлиенте
Процедура ВыбратьМесяц(Команда)
СписокМесяцев = Новый СписокЗначений;
СписокМесяцев.Добавить(1, "Январь");
СписокМесяцев.Добавить(2, "Февраль");
// ... заполнение остальных месяцев
Оповещение = Новый ОписаниеОповещения("ПослеВыбораМесяца", ЭтотОбъект);
СписокМесяцев.ПоказатьВыборЭлемента(Оповещение, "Выберите месяц отчета");
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораМесяца(Элемент, Параметры) Экспорт
Если Элемент <> Неопределено Тогда
// Установка параметра в компоновщик настроек
ЗначениеПараметра = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Месяц");
ЗначениеПараметра.Значение = Элемент.Значение;
ЗначениеПараметра.Использование = Истина;
КонецЕсли;
КонецПроцедуры
Этот метод дает максимальную гибкость, но требует создания формы отчета и понимания объектной модели компоновщика настроек. Однако для большинства задач достаточно первых трех способов, реализуемых чисто средствами Конструктора схемы компоновки данных. Для удобной связи пользовательского интерфейса с параметрами отчета подойдет способ стыковки элементов управляемой формы и настроек СКД.
Важный нюанс: при использовании ролей полей в СКД (вкладка «Наборы данных»), если пометить поле даты как Период с дополнительным типом Месяц, система предоставит дополнительные возможности по группировке и дополнению периодов в самом отчете, что также упрощает работу с «месячными» данными. При необходимости можно использовать пример настройки группировки периодов в отчете СКД.