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

Как добавить услови...
 

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


Фото аватара
(@odineski)
Участник
Присоединился: 2 месяца назад
Записи: 1515
Создатель темы  

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



   
Цитата
(@odin)
Участник
Присоединился: 2 месяца назад
Записи: 1470
 

Для динамического добавления условия в текст запроса 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/



   
ОтветитьЦитата