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