При разработке отчетов на Системе Компоновки Данных (СКД) начинающие разработчики часто сталкиваются с неочевидным поведением платформы. Вы пишете запрос, используете виртуальную таблицу, например, СрезПоследних, и хотите получить данные на конкретную дату. Как только вы явно указываете параметр внутри функции, из настроек отчета исчезает привычный выбор периода (стандартный интервал дат). Разберем подробно, почему так происходит и как правильно настроить параметры, чтобы пользователь мог удобно выбирать период.
В СКД существует механизм автоматического определения параметров. Рассмотрим, как он работает:
РегистрСведений.Название.СрезПоследних (без параметров), компоновщик автоматически создает системный параметр Период. Это позволяет пользователю выбирать дату, на которую строится срез.РегистрСведений.Название.СрезПоследних(&КонецПериода), система понимает это так: "Разработчик сам решил управлять датой среза через параметр &КонецПериода". Следовательно, автоматический системный параметр Период удаляется за ненадобностью.В результате, пользовательский интерфейс для выбора стандартного периода пропадает, и отчет перестает работать так, как ожидалось. Для эргономичного вывода и связывания параметров на форме можно использовать механизм стыковки элементов управляемой формы и пользовательских настроек СКД.
Чтобы вернуть пользователю возможность выбора удобного периода (например, "Этот месяц", "Прошлый год") и при этом корректно передать дату в запрос, нам необходимо выполнить настройку параметров вручную. Рассмотрим этот процесс по шагам.
На вкладке Параметры в схеме компоновки данных нам нужно добавить новый параметр. Важно не называть его зарезервированным именем "Период", чтобы избежать конфликтов с внутренними механизмами платформы.
Назовем его, например, ПериодОтчета. Установим для него следующие свойства:
ПериодОтчета (или ПериодВыборки).СтандартныйПериод.В вашем запросе, скорее всего, используются параметры типа Дата, например, &НачалоПериода и &КонецПериода (или один параметр, если это только срез). Нам нужно сказать системе, чтобы она брала значения для этих дат из нашего ПериодОтчета.
Для параметров-дат в колонке Выражение пропишем следующее:
&НачалоПериода выражение: &ПериодОтчета.ДатаНачала&КонецПериода выражение: &ПериодОтчета.ДатаОкончанияВажное замечание про Конец Периода:
Тип СтандартныйПериод возвращает конец дня (время 23:59:59) в свойстве ДатаОкончания. Для виртуальной таблицы СрезПоследних этого обычно достаточно. Однако, если бы мы работали с остатками (регистры накопления), иногда требуется использовать функцию КонецПериода() для гарантии включения границы времени.
Теперь у нас есть три параметра: два технических (даты) и один пользовательский (стандартный период). Чтобы не путать пользователя, технические параметры нужно скрыть.
Для параметров &НачалоПериода и &КонецПериода установим галочку Ограничение доступности. Теперь они не будут видны в настройках отчета, но будут неявно заполняться данными из выбранного пользователем периода.
Последний шаг — сделать наш ПериодОтчета доступным для редактирования пользователем.
ПериодОтчета.В обсуждении также упоминались фигурные скобки {}. Это расширение языка запросов для СКД. Рассмотрим, как это влияет на параметры.
Если в запросе написать:
РегистрСведений.ВоинскийУчет.СрезПоследних({(&КонецПериода)}, )
То параметр &КонецПериода станет необязательным. Если пользователь его не заполнит, условие просто исчезнет из запроса (получим срез на текущий момент или на самую последнюю дату в базе). Однако, описанная выше методика с созданием параметра СтандартныйПериод является более надежной для построения отчетов за конкретный интервал времени.
Если при указании параметра в СрезПоследних у вас пропадает поле выбора периода:
СтандартныйПериод (назовите его ПериодОтчета)..ДатаНачала, .ДатаОкончания).ПериодОтчета.