Часто возникает задача сформировать отчет за период, где дата начала является фиксированной (например, начало года), а дату окончания должен выбирать пользователь. При этом в форме настроек отчета поле для ввода начальной даты должно отсутствовать, чтобы не путать пользователя. Рассмотрим, как реализовать такую функциональность с помощью системы компоновки данных (СКД).
Основная идея заключается в том, чтобы отказаться от использования стандартного параметра Период или пары НачалоПериода и КонецПериода в пользовательских настройках. Вместо этого мы создадим собственный параметр только для даты окончания, а дату начала зададим жестко в тексте запроса или программно.
Этот метод является наиболее простым, гибким и универсальным. Он позволяет полностью контролировать параметры, видимые пользователю, без сложного программирования.
Разберем процесс по шагам.
Изменение текста запроса
Первый шаг — это адаптация запроса в наборе данных СКД. Вместо стандартной конструкции, использующей параметры &НачалоПериода и &КонецПериода, необходимо прописать условие с фиксированной датой начала и новым, пользовательским параметром для даты окончания.
Предположим, в запросе было условие:
ГДЕ
РеализацииТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода
Заменим его на новую конструкцию. Дату начала можно задать явно с помощью функции ДАТАВРЕМЯ, а для даты окончания введем новый параметр, например, &ДатаОкончания.
ГДЕ
РеализацииТоваровУслуг.Дата МЕЖДУ ДАТАВРЕМЯ(2020, 1, 1) И &ДатаОкончания
Если дата начала должна быть началом того же года, что и дата окончания, можно использовать функцию НАЧАЛОПЕРИОДА:
ГДЕ
РеализацииТоваровУслуг.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаОкончания, ГОД) И &ДатаОкончания
Важный момент: Чтобы избежать ошибок, если пользователь не заполнит дату окончания, рекомендуется заключать условие в фигурные скобки {}. В этом случае, если параметр &ДатаОкончания останется пустым, условие по дате просто не будет применяться при формировании отчета.
{ГДЕ
РеализацииТоваровУслуг.Дата МЕЖДУ ДАТАВРЕМЯ(2020, 1, 1) И &ДатаОкончания}
Настройка параметров в СКД
Теперь перейдем в конструктор схемы компоновки данных на вкладку "Параметры".
ДатаОкончания, который мы использовали в запросе. Убедитесь, что для него указан тип данных "Дата".НачалоПериода и КонецПериода, их можно удалить, так как они больше не используются в запросе.НачалоПериода, КонецПериода). Это позволит избежать автоматической обработки их платформой как стандартного периода. Например, можно использовать имена ДатаНачалаОтчета и ДатаКонцаОтчета.Настройка пользовательского интерфейса
Последний шаг — настроить видимость параметров для пользователя. Перейдем на вкладку "Настройки".
ДатаОкончания. В колонке "Пользовательские настройки" установите для него флажок. Это сделает поле для ввода даты окончания видимым на форме отчета.НачалоПериода и КонецПериода) флажок "Включать в пользовательские настройки" снят. Это скроет их из формы.После выполнения этих действий в форме отчета будет отображаться только одно поле для ввода даты — "Дата окончания", а данные будут отбираться с 1 января 2020 года.
Этот подход более сложный, но может быть полезен в отчетах, где объект СтандартныйПериод используется для других вычислений или в связанных механизмах. Суть метода в том, чтобы скрыть стандартные параметры от пользователя и установить их значения программно перед формированием отчета.
Настройка параметров в СКД
На вкладке "Параметры" выполним следующие действия:
ДатаКонца. Укажем для него тип "Дата".НачалоПериода и КонецПериода. Для каждого из них установим свойство "Ограничение доступности". Это скроет их из формы пользовательских настроек.Включение пользовательского параметра в настройки
На вкладке "Настройки" включим наш новый параметр ДатаКонца в пользовательские настройки, установив соответствующий флажок.
Программная установка значений
В модуле объекта отчета необходимо создать обработчик события ПриКомпоновкеРезультата. В нем мы получим значение, введенное пользователем, и на его основе установим значения для скрытых стандартных параметров периода.
Посмотрим на пример кода:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Получаем текущие настройки компоновщика
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// Находим значение параметра, который видит пользователь
ПараметрДатаКонца = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ДатаКонца"));
// Если пользователь заполнил дату, устанавливаем скрытые параметры
Если ПараметрДатаКонца <> Неопределено Тогда
ДатаКонцаПользовательская = ПараметрДатаКонца.Значение;
// Устанавливаем значения для стандартных параметров периода
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода", ДАТАВРЕМЯ(2020, 1, 1));
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("КонецПериода", КонецДня(ДатаКонцаПользовательская));
КонецЕсли;
КонецПроцедуры
В этом коде мы получаем доступ к настройкам отчета, считываем значение из видимого пользователю поля ДатаКонца и затем принудительно устанавливаем значения для скрытых параметров НачалоПериода и КонецПериода, которые будут использоваться запросом.
В результате пользователь будет видеть и редактировать только дату окончания, а отчет будет формироваться за нужный, частично фиксированный, период.