Почему пропадает поле выбора периода в СКД при использовании СрезПоследних и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

При разработке отчетов на Системе Компоновки Данных (СКД) начинающие разработчики часто сталкиваются с неочевидным поведением платформы. Вы пишете запрос, используете виртуальную таблицу, например, СрезПоследних, и хотите получить данные на конкретную дату. Как только вы явно указываете параметр внутри функции, из настроек отчета исчезает привычный выбор периода (стандартный интервал дат). Разберем подробно, почему так происходит и как правильно настроить параметры, чтобы пользователь мог удобно выбирать период.

Суть проблемы

В СКД существует механизм автоматического определения параметров. Рассмотрим, как он работает:

  1. Если вы пишете в запросе просто РегистрСведений.Название.СрезПоследних (без параметров), компоновщик автоматически создает системный параметр Период. Это позволяет пользователю выбирать дату, на которую строится срез.
  2. Если же вы пишете РегистрСведений.Название.СрезПоследних(&КонецПериода), система понимает это так: "Разработчик сам решил управлять датой среза через параметр &КонецПериода". Следовательно, автоматический системный параметр Период удаляется за ненадобностью.

В результате, пользовательский интерфейс для выбора стандартного периода пропадает, и отчет перестает работать так, как ожидалось. Для эргономичного вывода и связывания параметров на форме можно использовать механизм стыковки элементов управляемой формы и пользовательских настроек СКД.

Правильная настройка параметров в СКД

Чтобы вернуть пользователю возможность выбора удобного периода (например, "Этот месяц", "Прошлый год") и при этом корректно передать дату в запрос, нам необходимо выполнить настройку параметров вручную. Рассмотрим этот процесс по шагам.

1. Создание пользовательского параметра

На вкладке Параметры в схеме компоновки данных нам нужно добавить новый параметр. Важно не называть его зарезервированным именем "Период", чтобы избежать конфликтов с внутренними механизмами платформы.

Назовем его, например, ПериодОтчета. Установим для него следующие свойства:

2. Настройка связей через выражения

В вашем запросе, скорее всего, используются параметры типа Дата, например, &НачалоПериода и &КонецПериода (или один параметр, если это только срез). Нам нужно сказать системе, чтобы она брала значения для этих дат из нашего ПериодОтчета.

Для параметров-дат в колонке Выражение пропишем следующее:

Важное замечание про Конец Периода:
Тип СтандартныйПериод возвращает конец дня (время 23:59:59) в свойстве ДатаОкончания. Для виртуальной таблицы СрезПоследних этого обычно достаточно. Однако, если бы мы работали с остатками (регистры накопления), иногда требуется использовать функцию КонецПериода() для гарантии включения границы времени.

3. Ограничение доступности

Теперь у нас есть три параметра: два технических (даты) и один пользовательский (стандартный период). Чтобы не путать пользователя, технические параметры нужно скрыть.

Для параметров &НачалоПериода и &КонецПериода установим галочку Ограничение доступности. Теперь они не будут видны в настройках отчета, но будут неявно заполняться данными из выбранного пользователем периода.

4. Вывод параметра в пользовательские настройки

Последний шаг — сделать наш ПериодОтчета доступным для редактирования пользователем.

  1. Перейдите на вкладку Настройки.
  2. В нижней части окна выберите вкладку Параметры.
  3. Найдите параметр ПериодОтчета.
  4. В правой части свойств параметра установите галочку Включать в пользовательские настройки (или нажмите кнопку свойств пользовательских настроек справа снизу).

Использование расширений языка запросов

В обсуждении также упоминались фигурные скобки {}. Это расширение языка запросов для СКД. Рассмотрим, как это влияет на параметры.

Если в запросе написать:

РегистрСведений.ВоинскийУчет.СрезПоследних({(&КонецПериода)}, )

То параметр &КонецПериода станет необязательным. Если пользователь его не заполнит, условие просто исчезнет из запроса (получим срез на текущий момент или на самую последнюю дату в базе). Однако, описанная выше методика с созданием параметра СтандартныйПериод является более надежной для построения отчетов за конкретный интервал времени.

Резюме

Если при указании параметра в СрезПоследних у вас пропадает поле выбора периода:

  1. Не пытайтесь вернуть системный параметр "Период".
  2. Создайте свой параметр с типом СтандартныйПериод (назовите его ПериодОтчета).
  3. В выражениях параметров-дат запроса сошлитесь на свойства этого периода (.ДатаНачала, .ДатаОкончания).
  4. Скройте одиночные даты и выведите в настройки только ПериодОтчета.
← На главную