Отчеты и Аналитика · 9 мин
Как сделать параметр необязательным в СКД 1С
Пошаговая инструкция, как сделать параметр необязательным в СКД 1С: снятие ограничения доступности, выражения в запросе, отборы и типичные ошибки настройки.
По умолчанию система компоновки данных считает параметры обязательными: пока пользователь не заполнит значение, отчёт либо не сформируется, либо выдаст ошибку. Для отчётов, где часть фильтров нужна лишь иногда, это неудобно — приходится вводить лишние данные или создавать отдельные варианты отчёта. Правильная настройка необязательных параметров решает задачу без дублирования схем.
Необязательным параметр можно сделать двумя путями: через настройки самого параметра на закладке «Параметры» схемы компоновки и через конструкции запроса, где параметр используется. На практике почти всегда требуется комбинация обоих подходов: снять флаг обязательности в настройках и одновременно написать условие в запросе так, чтобы пустое значение не отсекало данные.
Материал рассчитан на разработчиков и внедренцев, работающих с консолью СКД или конфигуратором. Все действия описаны для типового редактора схемы компоновки данных, доступного в любой конфигурации на управляемых формах.
Где СКД хранит настройки обязательности параметра
В схеме компоновки данных у каждого параметра есть несколько свойств, влияющих на обязательность. Основное — флаг «Ограничение доступности»: если он установлен, параметр обязан быть заполнен, иначе платформа не даст сформировать отчёт. Снятие этого флага — первый шаг к необязательному параметру.
Дополнительно на поведение влияет свойство «Включать в доступные поля» и настройка «Использование» (Всегда / Авто). Если у параметра установлено использование «Всегда», он принудительно попадает в пользовательские настройки. Для необязательного параметра обычно оставляют режим «Авто», чтобы пользователь сам решал, нужен ли ему этот фильтр.
Отдельно проверьте поле «Значение» — если там задано значение по умолчанию, параметр фактически всегда заполнен, и вопрос обязательности теряет смысл. Для необязательных параметров значение по умолчанию либо очищают, либо задают осознанно, понимая, что оно будет подставляться всегда.
Как снять обязательность параметра пошагово
Базовая настройка выполняется в редакторе схемы компоновки данных, без изменения запроса. Этого достаточно, если параметр используется только в отборах, добавленных через настройки, а не жёстко прописан в тексте запроса.
- 1Откройте схему компоновки данных и перейдите на закладку «Параметры».
- 2Найдите нужный параметр в списке и снимите флаг «Ограничение доступности».
- 3Убедитесь, что в колонке «Использование» установлено «Авто», а не «Всегда».
- 4Очистите колонку «Значение», если параметр не должен иметь значения по умолчанию.
- 5Перейдите на закладку «Настройки», откройте параметры в пользовательских настройках и снимите признак обязательности там же.
- 6Сохраните схему и сформируйте отчёт с пустым параметром для проверки.
После этих действий платформа перестанет требовать заполнение параметра. Однако если параметр фигурирует в тексте запроса, отчёт может вернуть пустой результат или ошибку — запрос нужно адаптировать отдельно.
Как адаптировать запрос под необязательный параметр
Если параметр используется в секции ГДЕ напрямую, например ГДЕ Продажи.Контрагент = &Контрагент, то пустое значение отфильтрует все строки — ни одна запись не равна пустой ссылке. Запрос необходимо переписать так, чтобы условие срабатывало только при заполненном параметре.
Классический приём — проверка на незаполненное значение в самом условии:
ГДЕ (&Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
ИЛИ Продажи.Контрагент = &Контрагент)
Для параметров без фиксированного типа удобнее универсальная форма через проверку на НЕОПРЕДЕЛЕНО или пустую строку, в зависимости от типа параметра. Альтернативный подход — расширение языка запросов СКД: условие, заключённое в фигурные скобки {ГДЕ (Продажи.Контрагент = &Контрагент)}, применяется только когда параметр реально задействован в настройках отчёта.
Необязательный параметр через отборы вместо запроса
Часто параметр в запросе вообще не нужен: достаточно вывести поле в отборы схемы компоновки и позволить пользователю фильтровать по нему через стандартные настройки. В этом случае обязательность снимается автоматически — отбор либо включён пользователем, либо нет.
Чтобы связать отбор с параметром (например, для выбора сложного значения), используют закладку «Параметры» совместно с выражением на закладке «Наборы данных». Но в большинстве сценариев проще перенести фильтрацию из текста запроса в секцию отборов СКД: это снижает связанность схемы и упрощает поддержку.
Выбор подхода зависит от задачи:
Сравнение вариантов
Подходит, когда фильтрация должна происходить на уровне СУБД до соединений. Ограничение: усложняет текст запроса и требует аккуратности с типами.
Оптимально для необязательных фильтров: условие включается только при использовании параметра. Ограничение: не работает при режиме «Всегда».
Самый гибкий вариант для пользователя: вид сравнения, списки значений, комбинации. Ограничение: фильтрация идёт после выполнения запроса, что может быть медленнее на больших выборках.
Особые случаи: периоды и списки значений
Необязательные даты начала и окончания
Параметры типа «Дата» нельзя оставить совсем пустыми — у даты нет «пустого» состояния в привычном смысле, платформа подставит дату 01.01.0001. Для необязательного периода используют проверку границ в запросе:
ГДЕ (&ДатаНачала = ДАТАВРЕМЯ(1,1,1)
ИЛИ Продажи.Период >= &ДатаНачала)
Удобная альтернатива — стандартный параметр «Период» типа «СтандартныйПериод»: пользователь может очистить его в настройках, а в запросе условие оборачивается в фигурные скобки.
Необязательный список значений
Если параметр — список значений с флагом «Доступен список значений», пустой список в условии В (&Список) отсекает все данные. Проверяйте количество элементов через выражение на встроенном языке в событии «ПриКомпоновкеРезультата» либо переносите такой фильтр в отборы СКД, где пустой список обрабатывается корректно.
Как проверить, что настройка работает
Проверка выполняется в три приёма. Сначала сформируйте отчёт с пустым параметром: результат должен содержать полный набор данных без фильтрации по этому критерию. Затем заполните параметр и убедитесь, что данные отфильтровались. Наконец, проверьте вариант с сохранёнными настройками пользователя — старые настройки могли запомнить обязательность.
Как проверить результат
Отчёт строится и содержит все данные
Ошибка «Параметр не заполнен» или пустая таблица
Данные отфильтрованы по значению
Фильтр игнорируется или отсекает всё
Параметр остаётся необязательным в настройках
Старые пользовательские настройки возвращают обязательность
Если отчёт встраивается в конфигурацию программно, очистите кэш настроек в хранилище пользовательских настроек — устаревший вариант настроек может переопределять новую схему.
Ответы на частые вопросы
Почему после снятия флага «Ограничение доступности» отчёт всё равно требует параметр?
Скорее всего, обязательность зафиксирована в пользовательских настройках на закладке «Настройки» схемы: у параметра в режиме «Пользовательские настройки» стоит признак обязательного использования. Откройте настройки отчёта в режиме предприятия и снимите флаг использования у параметра, либо исправьте это в схеме.
Можно ли сделать необязательным параметр типа «Дата»?
Да, но пустой даты не существует — используйте проверку на ДАТАВРЕМЯ(1,1,1) в условии запроса или замените параметр на стандартный период, который пользователь может очистить. Условие с периодом при этом помещайте в фигурные скобки расширения языка запросов.
Чем фигурные скобки в запросе лучше проверки на пустое значение?
Условие в фигурных скобках полностью исключается из итогового запроса, когда параметр не используется, — СУБД выполняет более простой запрос. Проверка «ИЛИ параметр пустой» остаётся в тексте запроса всегда и может ухудшать план выполнения на больших таблицах.
Как сделать необязательным параметр, заданный программно?
При программной компоновке через объект НастройкиКомпоновкиДанных установите для элемента параметра свойство Использование = Ложь, когда значение не задано. Само значение присваивайте только если оно заполнено — тогда СКД не будет передавать пустой параметр в запрос.
Почему отчёт с необязательным параметром стал работать медленнее?
Условия вида «ИЛИ параметр пустой» мешают оптимизатору СУБД использовать индексы по полю фильтра. Если выборки большие, перенесите фильтр в отборы СКД или в конструкцию с фигурными скобками — тогда при неиспользуемом параметре условие физически отсутствует в запросе.
Что важно запомнить
Необязательный параметр в СКД — это всегда два действия: снятие обязательности на закладке «Параметры» и адаптация запроса через проверку пустого значения, фигурные скобки или перенос фильтра в отборы. Проверяйте отчёт в трёх режимах: с пустым параметром, с заполненным и с сохранёнными пользовательскими настройками.