RE: Как добавить условие в запрос 1С с использованием тернарного оператора?

#33628
bot_avaOdin — Одинэсник
Участник

    Для динамического добавления условия в текст запроса 1С с использованием конструкции:

    1C
    |"+?(ЗначениеЗаполнено(ОтборИсполнение),"И (ВЫРАЗИТЬ(НоменклатураДополнительныеРеквизитыИсполнение.Значение КАК Справочник.ЗначенияСвойствОбъектов) = &ОтборИсполнение)","")+
    

    следует учитывать следующие моменты:

    1. **Назначение конструкции**
    Оператор `?()` — это тернарный оператор в 1С, который возвращает первый аргумент, если условие истинно, иначе второй. Здесь проверяется, заполнен ли параметр `ОтборИсполнение` (функция `ЗначениеЗаполнено`).

    2. **Динамическое добавление условия**
    Если параметр заполнен, в текст запроса добавляется условие фильтрации по полю `НоменклатураДополнительныеРеквизитыИсполнение.Значение`, приведенному через `ВЫРАЗИТЬ` к типу `Справочник.ЗначенияСвойствОбъектов`, и сравнивается с параметром `&ОтборИсполнение`.

    3. **Правильное использование**
    — Конструкция должна быть встроена в текст запроса как часть условия `ГДЕ` или после уже существующих условий, с корректным использованием логических операторов (`И`, `ИЛИ`).
    — Если в запросе уже есть условия, то добавляем `»И …»`; если это первое условие, то `»ГДЕ …»` или без `»И»`.
    — Параметр `&ОтборИсполнение` должен быть установлен в коде перед выполнением запроса.
    — Тип параметра должен соответствовать типу, к которому приводится поле через `ВЫРАЗИТЬ`.

    4. **Пример использования в коде**

    1C
    ТекстЗапроса = 
    "ВЫБРАТЬ
        НоменклатураДополнительныеРеквизитыИсполнение.Ссылка
    ИЗ
        Справочник.НоменклатураДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизитыИсполнение
    ГДЕ
        1=1 " + 
        ?(ЗначениеЗаполнено(ОтборИсполнение),
          "И (ВЫРАЗИТЬ(НоменклатураДополнительныеРеквизитыИсполнение.Значение КАК Справочник.ЗначенияСвойствОбъектов) = &ОтборИсполнение)",
          "") + 
    "";
    
    Запрос = Новый Запрос(ТекстЗапроса);
    
    Если ЗначениеЗаполнено(ОтборИсполнение) Тогда
        Запрос.УстановитьПараметр("ОтборИсполнение", ОтборИсполнение);
    КонецЕсли;
    
    Результат = Запрос.Выполнить();
    

    5. **Объяснение**
    — `1=1` в условии `ГДЕ` — трюк для удобного динамического добавления условий с `И`.
    — Если `ОтборИсполнение` не заполнен, дополнительное условие не добавляется.
    — Использование `ВЫРАЗИТЬ` необходимо, если поле `Значение` имеет тип «Строка неограниченной длины» или другой сложный тип, и нужно привести его к конкретному типу для сравнения.

    **Итог:**
    Конструкция корректна для динамического добавления условия в запрос 1С. Главное — правильно встроить её в текст запроса, учитывать наличие других условий и корректно устанавливать параметр.

    Рекомендую посмотреть здесь:
    https://helpf.pro/faq/view/699.html
    https://infostart.ru/1c/articles/289285/

    База знаний 1С