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

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

При работе с Системой Компоновки Данных (СКД) в 1С, многие разработчики сталкиваются с ситуацией, когда параметр выбора периода отчета неожиданно исчезает из пользовательских настроек, особенно после того, как в запросе виртуальной таблицы СрезПоследних явно указывается параметр для даты среза, например, РегистрСведений.ВоинскийУчет.СрезПоследних({(&КонецПериода)}, ). Давайте подробно разберем, почему это происходит и как правильно настроить параметры отчета, чтобы избежать этой проблемы и обеспечить корректный выбор диапазона дат.

Понимание проблемы: почему исчезает параметр "Период"?

Изначально, когда мы используем виртуальные таблицы регистров (такие как СрезПоследних или Остатки) без явного указания параметра даты, СКД достаточно умна, чтобы автоматически создать и отобразить параметр "Период" с типом СтандартныйПериод. Это удобное поведение, которое позволяет нам быстро создавать простые отчеты с выбором дат.

Однако, как только мы явно указываем параметр для даты среза внутри фигурных скобок, например, РегистрСведений.ИмяРегистра.СрезПоследних({(&МойПараметрДаты)}, ), мы перехватываем инициативу у СКД. Теперь СКД ожидает, что мы сами предоставим значение для &МойПараметрДаты. Если мы не настроим этот параметр должным образом и не свяжем его с основным параметром типа СтандартныйПериод, то СКД не будет знать, откуда брать значение для даты среза, и как следствие, не сможет отобразить никакого механизма выбора периода для пользователя.

Таким образом, основная причина исчезновения параметра "Период" заключается в том, что мы, явно указав параметр в запросе, взяли на себя ответственность за его заполнение, но не завершили цепочку связей до пользовательского интерфейса выбора периода.

Детальная настройка параметров в СКД для корректной работы

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

Шаг 1: Создание основного параметра типа "СтандартныйПериод"

  1. Перейдем на вкладку "Параметры" в схеме компоновки данных.
  2. Создадим новый параметр. Назовем его, например, ПериодОтчета.
  3. Важно: Установим тип данных для этого параметра как СтандартныйПериод. Это специальный тип 1С, который предоставляет удобный интерфейс для выбора диапазона дат.
  4. Убедимся, что для этого параметра установлен флажок "Включать в пользовательские настройки". Без этого флажка пользователь не увидит этот параметр на форме отчета, и, соответственно, не сможет выбрать период.
  5. Также убедимся, что для него установлен флажок "Доступен".

Этот параметр будет служить основным пользовательским элементом для выбора периода. Он не будет напрямую использоваться в запросе СрезаПоследних, но будет источником значений для других, вспомогательных параметров.

Шаг 2: Создание вспомогательных параметров типа "Дата"

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

  1. Создадим первый вспомогательный параметр. Назовем его НачалоПериода.
  2. Установим тип данных для него как Дата.
  3. В поле "Выражение" укажем &ПериодОтчета.ДатаНачала. Это свяжет наш новый параметр с началом выбранного пользователем периода.
  4. Важно: Установим флажок "Ограничение доступности" для этого параметра. Это сделает его невидимым для пользователя в настройках отчета, так как пользователь будет взаимодействовать только с основным параметром ПериодОтчета. Однако СКД будет использовать его значение для запросов.
  5. Создадим второй вспомогательный параметр. Назовем его КонецПериода.
  6. Установим тип данных для него как Дата.
  7. В поле "Выражение" укажем &ПериодОтчета.ДатаОкончания. Это свяжет наш новый параметр с окончанием выбранного пользователем периода.
  8. Важно: Аналогично, установим флажок "Ограничение доступности" для этого параметра.

Мы создали два промежуточных параметра, которые автоматически получают значения из основного параметра ПериодОтчета. Они будут невидимы для пользователя, но критически важны для формирования запроса.

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

Шаг 3: Использование параметра в запросе для "СрезаПоследних"

Теперь, когда у нас есть все необходимые параметры, мы можем корректно использовать их в запросе к виртуальной таблице СрезПоследних.

Перейдем на вкладку "Наборы данных" и откроем наш запрос. В разделе, где мы обращаемся к виртуальной таблице, используем созданный нами параметр КонецПериода:


ВЫБРАТЬ
    ВоинскийУчетСрезПоследних.Сотрудник,
    ВоинскийУчетСрезПоследних.ДатаПриемаНаУчет,
    ВоинскийУчетСрезПоследних.КатегорияУчета,
    // ... другие поля
ИЗ
    РегистрСведений.ВоинскийУчет.СрезПоследних({(&КонецПериода)}, ) КАК ВоинскийУчетСрезПоследних

Обратите внимание на синтаксис {(&КонецПериода)}. Фигурные скобки {} указывают СКД на необходимость автоматического заполнения параметра виртуальной таблицы значением из параметра схемы компоновки данных. Круглые скобки () вокруг &КонецПериода — это стандартный синтаксис для передачи параметра в функции или виртуальные таблицы. Таким образом, СКД автоматически свяжет параметр КонецПериода из настроек СКД с параметром даты, ожидаемым виртуальной таблицей СрезПоследних.

В некоторых случаях, для большей явности или обхода возможных конфликтов имен, можно использовать явное алиасирование параметра в фигурных скобках, как было подсказано в сообщении 22:


ВЫБРАТЬ
    ВоинскийУчетСрезПоследних.Сотрудник,
    ВоинскийУчетСрезПоследних.ДатаПриемаНаУчет,
    ВоинскийУчетСрезПоследних.КатегорияУчета,
    // ... другие поля
ИЗ
    РегистрСведений.ВоинскийУчет.СрезПоследних({(&КонецПериода) КАК КонецПериодаВТ}, ) КАК ВоинскийУчетСрезПоследних

Здесь КонецПериодаВТ – это произвольное имя, которое будет использоваться как параметр внутри виртуальной таблицы, и оно будет получать значение из нашего параметра СКД &КонецПериода. Хотя часто достаточно и первого варианта, знание этой возможности полезно для сложных случаев.

Проверка и отладка

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

Если поле выбора периода все еще не отображается, мы можем проверить следующее:

  1. Убедитесь, что для параметра ПериодОтчета (типа СтандартныйПериод) установлен флажок "Включать в пользовательские настройки" на вкладке "Параметры" СКД. Это наиболее частая причина "исчезновения" периода.
  2. Проверьте выражения для НачалоПериода и КонецПериода. Убедитесь, что они правильно ссылаются на &ПериодОтчета.ДатаНачала и &ПериодОтчета.ДатаОкончания соответственно.
  3. Убедитесь, что в запросе к виртуальной таблице СрезПоследних используется именно параметр &КонецПериода, обернутый в фигурные скобки {(&КонецПериода)}.
  4. Перейдите в пользовательские настройки отчета (через кнопку "Настройки" на форме отчета) и на вкладке "Параметры" убедитесь, что параметр ПериодОтчета (или как вы его назвали) не отключен и не имеет фиксированного значения. Возможно, вы или другой пользователь случайно его отключили или задали статическое значение, что скрывает возможность выбора. В этом случае просто установите для него флажок "Включить".

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

← На главную