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

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

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #33627
      Телеграм группа https://t.me/odineskiOdineski
      Участник

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

      • #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 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С