К статье
Практический материал

Отчеты и Аналитика · 11 мин

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

Разбираем, как в СКД 1С сделать параметр необязательным: настройка доступности, включение в выражения, фильтрация по условию и типичные ошибки разработчиков.

Необязательный параметр в системе компоновки данных (СКД) 1С — это параметр, который пользователь может заполнить, а может оставить пустым, и отчет в обоих случаях сформируется корректно. Типичная ситуация: отчет по продажам, где менеджер хочет иногда фильтровать по контрагенту, а иногда смотреть всех сразу. Если параметр объявлен жестко, пустое значение либо вызовет ошибку, либо отфильтрует все данные в ноль.

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

Ниже разобраны рабочие способы: через конструкцию с условием в запросе, через отбор с признаком необязательности, через расширение языка запросов СКД, а также проверка результата и типичные ошибки, из-за которых отчет «молча» возвращает пустой результат.

Как СКД обрабатывает параметры и почему пустое значение ломает отчет

Когда в тексте запроса вы пишете условие ГДЕ Контрагент = &Контрагент, компоновщик при формировании отчета подставляет значение параметра буквально. Если пользователь не заполнил параметр, в запрос уходит пустая ссылка, и условие превращается в «Контрагент = пустая ссылка». Таких записей в базе обычно нет — отчет возвращает пустую таблицу без всяких ошибок, что сбивает с толку и пользователя, и разработчика.

Второй механизм — флажок «Ограничение доступности» на закладке «Параметры». Если он установлен, параметр считается обязательным: платформа требует его заполнения и блокирует формирование отчета до тех пор, пока значение не введено. Для необязательного параметра это ограничение нужно снять, но одного этого мало — логику «параметр пуст, значит фильтр не применяется» нужно описать явно.

Способ 1. Условие в запросе через проверку на пустое значение

Самый универсальный прием — переписать условие так, чтобы пустой параметр означал «пропустить фильтр». В тексте запроса набора данных условие выглядит следующим образом:

ГДЕ

(&Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)

ИЛИ Продажи.Контрагент = &Контрагент)

Логика проста: если параметр не заполнен, первая часть условия истинна для всех строк, и фильтр фактически отключен. Если заполнен — срабатывает вторая часть, и отбираются только записи по указанному контрагенту. Для параметров примитивных типов (строка, число, дата) вместо пустой ссылки сравнивают с пустой строкой, нулем или используют проверку через ЕСТЬ NULL либо служебное значение.

Альтернативный вариант для дат — использовать функцию СКД или сравнение с «заведомо пустой» датой ДАТАВРЕМЯ(1,1,1). Важно следить, чтобы тип параметра на закладке «Параметры» точно совпадал с типом сравниваемого поля, иначе автозаполнение параметров из запроса может создать дубли или неверный тип.

Способ 2. Необязательный отбор в настройках компоновки

Если фильтрация не зашита в текст запроса, её можно вынести в отбор настроек. На закладке «Настройки» → «Отбор» добавьте условие Контрагент = &Контрагент (или сравнение с полем напрямую) и снимите у элемента отбора флажок использования. СКД формирует запрос динамически: неактивный элемент отбора просто не попадает в итоговый текст запроса, и данные не фильтруются.

Этот способ предпочтительнее для типовых отчетов, потому что пользователь сам управляет фильтром через стандартную панель настроек: включил отбор и указал значение — получил фильтрацию, отключил — получил все данные. Чтобы отбор был виден пользователю, параметру на закладке «Параметры» нужно снять «Ограничение доступности» и установить режим редактирования «Быстрый доступ» или включить его в пользовательские настройки.

Сравнение подходов

Условие в тексте запроса

Подходит, когда фильтр жестко связан с логикой запроса или виртуальными таблицами. Минус: условие с ИЛИ может замедлять выполнение на больших таблицах.

Необязательный отбор в настройках

Подходит для пользовательских фильтров. Неактивный отбор не попадает в запрос, поэтому производительность выше. Минус: требует аккуратной настройки пользовательского интерфейса.

Расширение языка запросов СКД

Инструкции в фигурных скобках {ГДЕ ...} применяются только при использовании отбора. Гибко, но требует понимания синтаксиса расширения.

Способ 3. Расширение языка запросов: условие в фигурных скобках

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

{ГДЕ

(Продажи.Контрагент = &Контрагент)}

Если пользователь не задал отбор по контрагенту и параметр не используется, фрагмент в скобках исключается из запроса целиком — без конструкций с ИЛИ и без лишних сравнений. Это самый «чистый» с точки зрения производительности вариант, но он требует, чтобы параметр был связан с отбором, а не подставлялся напрямую.

Учтите ограничение: расширение языка запросов работает только внутри СКД. Если тот же запрос выполняется вне компоновки (например, программно через объект «Запрос»), фигурные скобки не обрабатываются и вызовут ошибку синтаксиса.

Порядок настройки необязательного параметра
  1. 1
    Откройте схему компоновки данных и перейдите на закладку «Параметры»
  2. 2
    Снимите у параметра флажок «Ограничение доступности»
  3. 3
    Установите «Использование» — «Всегда» или оставьте «Авто» в зависимости от сценария
  4. 4
    Добавьте в запрос условие с проверкой на пустое значение либо вынесите фильтр в отбор настроек
  5. 5
    Включите параметр в пользовательские настройки (режим «Быстрый доступ»), чтобы пользователь видел его на форме
  6. 6
    Сформируйте отчет с пустым и с заполненным параметром, сравните результаты

Настройка видимости параметра для пользователя

Чтобы пользователь мог заполнять необязательный параметр, его нужно вывести на форму отчета. На закладке «Настройки» в ветке «Параметры данных» найдите нужный параметр, откройте его свойства и установите «Включать в пользовательские настройки» с режимом отображения «Быстрый доступ». Тогда поле появится прямо на форме отчета рядом с кнопкой «Сформировать».

Для значения по умолчанию используйте колонку «Значение» на закладке «Параметры» или выражение на встроенном языке (колонка «Выражение»). Например, для периода удобно задавать начало текущего месяца, чтобы отчет открывался с осмысленными данными, но при этом параметр оставался редактируемым и необязательным.

Если отчет выводится в управляемой форме через программный код, убедитесь, что значение параметра не перезаписывается принудительно при открытии — частая причина «неотключаемого» фильтра кроется именно в коде формы, а не в схеме компоновки.

Контрольные точки

Как проверить результат

Отчет с пустым параметром
Норма

Формируется и показывает все записи без фильтрации по этому условию

Тревожный признак

Пустой результат или сообщение о незаполненном обязательном параметре

Отчет с заполненным параметром
Норма

Показываются только записи, соответствующие значению

Тревожный признак

Фильтр игнорируется или отбираются неверные записи

Панель настроек пользователя
Норма

Параметр виден, его можно очистить и снова заполнить

Тревожный признак

Параметр скрыт или заблокирован для редактирования

Типичные ошибки и ограничения

Самая распространенная ошибка — снять «Ограничение доступности», но оставить в запросе прямое условие Поле = &Параметр. Отчет формально работает, но при пустом параметре возвращает ноль строк, и пользователь считает, что данных нет. Вторая частая проблема — несовпадение типов: параметр объявлен как строка, а сравнивается со ссылочным полем, из-за чего сравнение с пустым значением никогда не срабатывает.

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

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

Типичные ошибки
01
Прямое условие Поле = &Параметр без проверки на пустое значение — отчет возвращает пустой результат
02
Несовпадение типа параметра и поля — сравнение с пустым значением не срабатывает
03
Оставленное ограничение доступности — платформа требует обязательного заполнения
04
Программная установка значения параметра в коде формы перекрывает пользовательские настройки
05
Использование фигурных скобок расширения СКД в запросе, выполняемом вне компоновки, — ошибка синтаксиса

Проверка результата и FAQ

Итоговая проверка сводится к трем сценариям: отчет с пустым параметром должен вернуть полный набор данных, с заполненным — отфильтрованный, а пользователь должен иметь возможность свободно очищать и заполнять поле на форме. Если хотя бы один сценарий не работает, возвращайтесь к типу параметра и к тому, где именно задано условие — в запросе или в отборе.

Итог

Что важно запомнить

Необязательный параметр = снятое ограничение доступности плюс логика «пустое значение отключает фильтр». Реализуется условием с ИЛИ в запросе, необязательным отбором или расширением языка запросов СКД. Всегда проверяйте отчет в обоих режимах: с пустым и с заполненным параметром.

Чем необязательный параметр отличается от отбора в СКД?

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

Почему отчет пустой, хотя параметр не заполнен?

Скорее всего, в запросе стоит прямое условие вида Поле = &Параметр. Пустой параметр превращается в пустую ссылку или пустую строку, и под условие не попадает ни одна запись. Добавьте проверку на пустое значение через ИЛИ или перенесите условие в отбор настроек.

Как задать значение параметра по умолчанию?

На закладке «Параметры» заполните колонку «Значение» конкретным значением или колонку «Выражение» формулой на встроенном языке, например вычислением начала текущего месяца. Значение по умолчанию не делает параметр обязательным — пользователь может его изменить или очистить.

Можно ли сделать необязательным параметр «Период» виртуальной таблицы?

Напрямую — нет, параметры виртуальных таблиц регистров обрабатываются платформой особо и подчиняются собственным правилам. Альтернатива — убрать условие из параметров виртуальной таблицы и фильтровать по периоду через отбор СКД поверх основного запроса.

Что лучше для производительности: условие с ИЛИ или необязательный отбор?

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

Как вывести необязательный параметр на форму отчета?

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