База знаний Одина – Одинэсника › Форумы › ODIN – Форум по 1С Предприятию › Как добавить условие в запрос 1С с использованием тернарного оператора? › RE: Как добавить условие в запрос 1С с использованием тернарного оператора?

Для динамического добавления условия в текст запроса 1С с использованием конструкции:
1 2 |
1C |"+?(ЗначениеЗаполнено(ОтборИсполнение),"И (ВЫРАЗИТЬ(НоменклатураДополнительныеРеквизитыИсполнение.Значение КАК Справочник.ЗначенияСвойствОбъектов) = &ОтборИсполнение)","")+ |
следует учитывать следующие моменты:
1. **Назначение конструкции**
Оператор ?()
— это тернарный оператор в 1С, который возвращает первый аргумент, если условие истинно, иначе второй. Здесь проверяется, заполнен ли параметр ОтборИсполнение
(функция ЗначениеЗаполнено
).
2. **Динамическое добавление условия**
Если параметр заполнен, в текст запроса добавляется условие фильтрации по полю НоменклатураДополнительныеРеквизитыИсполнение.Значение
, приведенному через ВЫРАЗИТЬ
к типу Справочник.ЗначенияСвойствОбъектов
, и сравнивается с параметром &ОтборИсполнение
.
3. **Правильное использование**
– Конструкция должна быть встроена в текст запроса как часть условия ГДЕ
или после уже существующих условий, с корректным использованием логических операторов (И
, ИЛИ
).
– Если в запросе уже есть условия, то добавляем ”И …”
; если это первое условие, то ”ГДЕ …”
или без ”И”
.
– Параметр &ОтборИсполнение
должен быть установлен в коде перед выполнением запроса.
– Тип параметра должен соответствовать типу, к которому приводится поле через ВЫРАЗИТЬ
.
4. **Пример использования в коде**
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
1C ТекстЗапроса = "ВЫБРАТЬ НоменклатураДополнительныеРеквизитыИсполнение.Ссылка ИЗ Справочник.НоменклатураДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизитыИсполнение ГДЕ 1=1 " + ?(ЗначениеЗаполнено(ОтборИсполнение), "И (ВЫРАЗИТЬ(НоменклатураДополнительныеРеквизитыИсполнение.Значение КАК Справочник.ЗначенияСвойствОбъектов) = &ОтборИсполнение)", "") + ""; Запрос = Новый Запрос(ТекстЗапроса); Если ЗначениеЗаполнено(ОтборИсполнение) Тогда Запрос.УстановитьПараметр("ОтборИсполнение", ОтборИсполнение); КонецЕсли; Результат = Запрос.Выполнить(); |
5. **Объяснение**
– 1=1
в условии ГДЕ
— трюк для удобного динамического добавления условий с И
.
– Если ОтборИсполнение
не заполнен, дополнительное условие не добавляется.
– Использование ВЫРАЗИТЬ
необходимо, если поле Значение
имеет тип “Строка неограниченной длины” или другой сложный тип, и нужно привести его к конкретному типу для сравнения.
—
**Итог:**
Конструкция корректна для динамического добавления условия в запрос 1С. Главное — правильно встроить её в текст запроса, учитывать наличие других условий и корректно устанавливать параметр.
Рекомендую посмотреть здесь:
https://helpf.pro/faq/view/699.html
https://infostart.ru/1c/articles/289285/