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

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

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

Анализ механизма параметров в виртуальных таблицах

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

Рассмотрим пример запроса:


ВЫБРАТЬ
    ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
    ТоварыНаСкладахОстаткиИОбороты.ВНаличииНачальныйОстаток КАК НачальныйОстаток,
    ТоварыНаСкладахОстаткиИОбороты.ВНаличииПриход КАК Приход,
    ТоварыНаСкладахОстаткиИОбороты.ВНаличииРасход КАК Расход,
    ТоварыНаСкладахОстаткиИОбороты.ВНаличииКонечныйОстаток КАК КонечныйОстаток
ИЗ
    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&ДатаН, &ДатаК, Авто, , ) КАК ТоварыНаСкладахОстаткиИОбороты

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

Синхронизация имен параметров

Самое простое и надежное решение — использовать стандартные имена параметров, которые СКД распознает автоматически. Посмотрим на правильный вариант написания запроса:


ИЗ
    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , ) КАК ТоварыНаСкладахОстаткиИОбороты

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

Настройка активности параметров в компоновщике

Даже если имена параметров указаны верно, отчет может не работать из-за настроек на уровне компоновки. Разберем основные моменты:

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

Использование типа СтандартныйПериод

Для удобства пользователей в 1С принято использовать тип СтандартныйПериод, который позволяет выбирать "Этот месяц", "Прошлый квартал" и т.д. одним кликом. Однако виртуальные таблицы регистров требуют две отдельные даты. Рассмотрим, как правильно связать их:

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

Важный нюанс: при использовании &ПериодОтчета.ДатаОкончания время часто устанавливается на 00:00:00. Чтобы данные за последний день периода (например, продажи за сегодня) корректно попадали в отчет, рекомендуется использовать функцию конца периода. Пропишем в выражении для окончания периода:

КонецПериода(&ПериодОтчета.ДатаОкончания, "День")

Расширение языка запросов и фигурные скобки

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

Рассмотрим пример:


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

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

Проблема кэширования настроек

Бывает так, что разработчик исправил все ошибки в конфигураторе, но в режиме "1С:Предприятие" отчет по-прежнему "глючит". Это происходит потому, что система сохраняет пользовательские настройки в системных хранилищах. Проанализируем решение:

В пользовательском режиме в форме отчета необходимо нажать Еще — Установить стандартные настройки. Это принудительно обновит структуру параметров из актуальной схемы компоновки, которую вы только что изменили. Это действие часто является "целительным" после внесения правок в состав параметров.

Итоги и рекомендации

Подводя итог, проверим чек-лист для исправления проблемы с периодом:

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

Соблюдение этих правил гарантирует, что ваши отчеты будут всегда выводить актуальные данные в строгом соответствии с выбранным пользователем интервалом времени.

← На главную