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

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

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

Рассмотрим ситуацию: у нас есть запрос к таблице товаров, и нам нужно получить список товаров, где поле «Артикул» либо заполнено, либо пусто. При этом условие отбора (заполнен или не заполнен) должно задаваться булевым параметром. Жестко прописать условие ГДЕ Товар.Артикул = "" или ГДЕ Товар.Артикул <> "" не является проблемой, но как сделать это условие изменяемым через параметр, чтобы оно срабатывало в зависимости от его значения?

Мы предлагаем два элегантных и эффективных способа решения этой задачи с использованием языка запросов 1С.

Решение 1: Использование конструкции ВЫБОР КОГДА в условии запроса

Одним из наиболее гибких подходов является применение конструкции ВЫБОР КОГДА непосредственно в секции ГДЕ вашего запроса. Этот метод позволяет явно задать различные условия в зависимости от значения переданного параметра.

Рассмотрим пример запроса, который выбирает товары и фильтрует их по заполненности реквизита Артикул в зависимости от значения булева параметра &АртикулЗаполнен:


ВЫБРАТЬ
    Товар.Ссылка,
    Товар.Артикул,
    Товар.Наименование
ИЗ
    Справочник.Товары КАК Товар
ГДЕ
    ВЫБОР
        КОГДА &АртикулЗаполнен = ИСТИНА
            ТОГДА Товар.Артикул <> ""
        ИНАЧЕ
            Товар.Артикул = ""
    КОНЕЦ

Разберем этот запрос подробнее:

  1. Параметр &АртикулЗаполнен: Мы объявляем булевый параметр &АртикулЗаполнен. Перед выполнением запроса мы должны установить его значение. Если вы хотите отобрать товары с заполненным артикулом, установите его в Истина. Если с незаполненным – в Ложь.

  2. Конструкция ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ: Эта конструкция позволяет создавать условную логику прямо внутри запроса. Она работает аналогично оператору Если Тогда Иначе КонецЕсли в коде 1С.

  3. Условие КОГДА &АртикулЗаполнен = ИСТИНА: Если переданный параметр &АртикулЗаполнен имеет значение Истина, то будет применяться первое условие отбора.

  4. Ветка ТОГДА Товар.Артикул <> "": Это условие выполняется, когда &АртикулЗаполнен равен Истина. Оно отбирает все товары, у которых реквизит Артикул не пустой. Символы "" в запросе 1С обозначают пустую строку.

  5. Ветка ИНАЧЕ Товар.Артикул = "": Если параметр &АртикулЗаполнен не равен Истина (то есть он равен Ложь), то применяется это условие. Оно отбирает все товары, у которых реквизит Артикул пустой.

Таким образом, один и тот же запрос, в зависимости от значения параметра &АртикулЗаполнен, будет динамически переключаться между отбором заполненных и незаполненных артикулов.

Решение 2: Более компактный вариант с прямым сравнением булевых выражений

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

Посмотрим на альтернативный вариант условия в секции ГДЕ:


ВЫБРАТЬ
    Товар.Ссылка,
    Товар.Артикул,
    Товар.Наименование
ИЗ
    Справочник.Товары КАК Товар
ГДЕ
    &АртикулЗаполнен = (Товар.Артикул <> "")

Разберем, как работает этот вариант:

  1. Выражение (Товар.Артикул <> ""): Внутри скобок мы имеем булево выражение, которое проверяет, является ли Артикул непустым. Это выражение вернет Истина, если Артикул заполнен, и Ложь, если Артикул пуст.

  2. Сравнение &АртикулЗаполнен = ...: Мы сравниваем значение нашего булева параметра &АртикулЗаполнен с результатом булева выражения (Товар.Артикул <> "").

Это означает:

Этот вариант является более компактным и часто предпочтительным из-за своей выразительности и простоты.

Практические аспекты использования параметров в запросах

Для того чтобы эти запросы работали, необходимо правильно создать и установить значение параметра &АртикулЗаполнен в коде 1С.

  1. Создание объекта запроса: Сначала создайте объект запроса и установите его текст.

    
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    Товар.Ссылка,
    |    Товар.Артикул,
    |    Товар.Наименование
    |ИЗ
    |    Справочник.Товары КАК Товар
    |ГДЕ
    |    &АртикулЗаполнен = (Товар.Артикул <> "")"; // Или используйте вариант с ВЫБОР КОГДА
    
  2. Установка значения параметра: Далее, в зависимости от логики вашего алгоритма (например, по нажатию кнопки на форме или из настроек отчета), установите значение для параметра &АртикулЗаполнен.

    
    // Пример 1: Отбираем товары с ЗАПОЛНЕННЫМ артикулом
    Запрос.УстановитьПараметр("АртикулЗаполнен", Истина);
    
    // Пример 2: Отбираем товары с НЕЗАПОЛНЕННЫМ артикулом
    // Запрос.УстановитьПараметр("АртикулЗаполнен", Ложь);
    

    Для отчета, где пользователь может выбрать вариант отбора, этот параметр обычно связывается с элементом формы типа "Флажок" или "Переключатель", а его значение передается в запрос при формировании отчета.

  3. Выполнение запроса и получение результата:

    
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    
    Пока Выборка.Следующий() Цикл
        Сообщить("Товар: " + Выборка.Наименование + ", Артикул: " + Выборка.Артикул);
    КонецЦикла;
    

Дополнительные аспекты работы со строковыми реквизитами в запросах 1С

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

1. Проверка на пустую строку против NULL

В языке запросов 1С "" (пустая строка) и NULL (неопределенное значение поля, часто встречающееся для реквизитов ссылочного типа, если ссылка не установлена) – это разные вещи. Для строковых реквизитов, как правило, проверка на "" является достаточной, поскольку строковое поле всегда инициализируется пустой строкой, а не NULL. Однако, если вы работаете с составными типами или внешними данными, где могут быть NULL значения, может потребоваться дополнительная проверка на ИС NULL.

2. Работа со строками неограниченной длины

Если строковый реквизит в конфигурации имеет неограниченную длину (например, реквизит объекта типа "Строка (неограниченная длина)"), его нельзя напрямую сравнивать в запросе. В таких случаях необходимо использовать функцию ВЫРАЗИТЬ для приведения строки к фиксированной длине перед сравнением. Например:

ГДЕ ВЫРАЗИТЬ(Товар.Комментарий КАК Строка(100)) <> ""

В этом примере мы приводим комментарий к строке длиной 100 символов, что позволяет его сравнить. Если строка может быть длиннее, выберите подходящую длину. При возникновении ошибок сравнения несовместимых типов и полей неограниченной длины поможет методика сравнения строки с представлением ссылки в запросе.

3. Динамическое формирование запроса

В некоторых сложных сценариях, когда логика отбора зависит от очень большого числа условий или они меняются очень сильно, может быть оправдано динамическое формирование текста запроса в коде 1С. Это означает, что вы буквально собираете строку запроса по частям, добавляя или исключая секции ГДЕ или И в зависимости от значений параметров. Однако для задачи фильтрации по заполненности строкового реквизита, предложенные выше варианты с ВЫБОР КОГДА или прямым сравнением, как правило, являются более предпочтительными из-за их читаемости и простоты поддержки.

4. Проверка заполнения реквизитов на форме и в конфигурации

Важно помнить, что проверка заполнения реквизитов в запросе – это лишь один из инструментов работы с данными. На уровне конфигурации можно настроить свойство «Проверка заполнения» для реквизитов объекта, установив его в «Выдавать ошибку». Это предотвратит сохранение объекта с незаполненным обязательным реквизитом еще до того, как данные попадут в базу и будут запрашиваться. Такой подход помогает поддерживать чистоту данных.

5. Оптимизация запросов в динамических списках

При работе с динамическими списками, которые часто используются для отображения данных на управляемых формах, рекомендуется проектировать максимально простые запросы. Сложные условия ВЫБОР КОГДА или динамические запросы могут замедлять работу динамического списка. Если запрос динамического списка становится слишком сложным, рассмотрите возможность изменения его текста "на лету" или использования механизма расширения запроса СКД для добавления дополнительных полей или условий.

Заключение

Мы рассмотрели эффективные методы динамического отбора данных в запросах 1С на основе заполненности строковых реквизитов с использованием булевого параметра. Применение конструкции ВЫБОР КОГДА или более компактного сравнения булевых выражений позволяет создавать гибкие и переиспользуемые запросы, которые легко адаптируются к меняющимся условиям фильтрации без необходимости переписывать сам текст запроса. Эти подходы значительно упрощают разработку отчетов и обработок, где требуется динамический контроль над отбором данных.

← На главную