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