1с условие в запросе если параметр заполнен
Условия в запросе
Условия в запросе
Условия в запросе могут быть расположены в 4 местах:
Особенности использования условных операторов:
Эти операторы возможно использовать во всех 4 ситуациях, но контекст (окружаемые переменные у них отличаются).
В первых двух случаях условия накладываются на поля выборки, например:
ВЫБРАТЬ Ссылка ИЗ Справочник.Контрагенты КАК СпрКонтрагенты ГДЕ СпрКонтрагенты.ИНН<>«»
Обращение идет через имя таблицы (в простых запросах может опускаться, но в сложных может вызывать неоднозначность поля).
Данное условие вызывает ограничение выборки (обычно уменьшает ее)
В конструкторе запроса находятся на вкладке условия:
В произвольном варианте пишется текстом, в обычном выбирается поле, оператор сравнения и значение:
ВЫБОР КОГДА
Этот условный оператор используется для преобразования значения, ограничивает же выборку только когда расположен после служебного слова ГДЕ.
Допустимо несколько подчиненных условий. Может находится в полях выборки, полях условий ГДЕ, группировок, итогов (универсальный оператор для сложных условий)
Например, так выглядит вариант преобразования:
ВЫБРАТЬ
ВЫБОР
КОГДА 1 = 2
ТОГДА «Никогда не будет истиной»
КОГДА 1 = 1
ТОГДА «Всегда будет истиной»
ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1)
КОНЕЦ КАК ПолеПредставленияЗначения
Вариант использования в условии ГДЕ, результат выборки должен возвращать булево значение либо сравниваться с чем-то еще
Пример № 1
ВЫБРАТЬ Ссылка ИЗ Справочник.Контрагенты КАК К ГДЕ ВЫБОР КОГДА К.ИНН = «» ТОГДА ЛОЖЬ ИНАЧЕ ИСТИНА КОНЕЦ
Пример № 2:
ВЫБРАТЬ Ссылка ИЗ Справочник.Контрагенты КАК К ГДЕ ВЫБОР КОГДА К.ИНН = «» ТОГДА «» ИНАЧЕ «Заполнено» КОНЕЦ = «Заполнено»
Параметры виртуальных таблиц
В данном случае оперирование идет с полями таблиц, например ресурсами, измерениями, реквизитами. В этих условиях обращение идет без точки (контекст этого не требует).
ВЫБРАТЬ * ИЗ РегистрСведений.КурсыВалют.СрезПоследних(, Валюта.Код = «RUR»)
В конструкторе запроса они находятся вот здесь:
Стоит отметить, что обычно используется ограничение над измерениями, так как иначе условие отнесется к выборке для получения, а не на сам результат (на ресурсы ограничения следует наложить в операторе ГДЕ, чтобы получить ожидаемый результат).
Накладывание условия в запросе на измерения, если нет обращения через точку (как в примере выше), ускоряет выборку: на больших таблицах, это будет визуально заметно; на небольших можно использовать как удобно.
ИМЕЮЩИЕ
Для наложения отбора для результата «группировочных» функции
ВЫБРАТЬ
Контрагенты.ИНН,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Контрагенты.Ссылка) КАК Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
СГРУППИРОВАТЬ ПО
Контрагенты.ИНН
ИМЕЮЩИЕ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Контрагенты.Ссылка) > 1 И
Контрагенты.ИНН <> «»
В данную выборку попадут дубли ИНН, когда оно вообще заполнено.
В конструкторе запроса также находится на вкладке условия
Реклама — самый дешевый способ продажи товара, особенно если товар не имеет никакой ценности.
Как сделать условие в запросе.
В запросе контрагент получается таким образом:
ВЫБРАТЬ
ВЫБОР
КОГДА ЗаказИзделия.Ссылка.ДокументОснование = &ПустойЗамер
ТОГДА ЗаказИзделия.Ссылка.Контрагент
ИНАЧЕ ВЫБОР
КОГДА ЗаказИзделия.Ссылка.ДокументОснование.Контрагент = &ПустойКонтрагент
ТОГДА ВЫРАЗИТЬ(ЗаказИзделия.Ссылка.ДокументОснование.Контрагент КАК СТРОКА(100))
ИНАЧЕ ЗаказИзделия.Ссылка.ДокументОснование.Контрагент
КОНЕЦ
КОНЕЦ КАК Контрагент,
Контрагент, в итоге, либо ссылка на справочник либо просто строка
Мне надо написать в запросе условие подобное
ГДЕ ЗаказИзделия.Ссылка.Контрагент = &Контрагент
но для обоих случаев (ссылка и строка)
Маленькое уточнение:
Логика документов такова:
(4) я не очень силен в запросах..
можно подробней?
Теперь надо отфильтровать все ЗаказИзделия на определнного контрагента.
Можешь что-то подобное привести сюда?
Я сам запрос осилил, а вот как условие к нему прикрутить не знаю 🙁
(5) нужно просто обернуть его другим запросом, и условие тогда можно наложить просто как на поле
В структуру не охота вникать запрос покажи
ВЫБРАТЬ
ЗаказИзделия.Контрагент, ЗаказИзделия.Ссылка
ИЗ
Есть бухгалтерия, которая хочет, чтобы все частные лица во всех документах как контрагент «ЧАСТНОЕ ЛИЦО», и есть менеджеры, которым надо отслеживать документы пофамильно.
(13) сделай все строкой.
(11)+ это лишняя ненужная проверка.
(16) Нельзя. Потому что результат запроса выводиться в ТЗ на форме. А там контрагента надо «просматривать».
(20) понятно. и когда же тип строка = типу ссылка.
Синтаксически возможно так и более правильно, но мне было удобнее так.
Я проверял свой, частный, случай. Реквизит Контрагент в документе ЗамерУстановка имеет составной тип данных: Строка и Справочник.Контрагент.
Проверка в запросе показала, что это условие работает. Работает и для ЗамерУстановка.Контрагент и для второго реквизита. Что я и использовал в своем запросе в условии.
Ладно, думаю что всё это уже не по теме.
Думаю, что уместно закрыть тему.
(37)
бредишь.
ЗаказИзделия.Ссылка.ДокументОснование.Контрагент может быть
ССЫЛКА
СТРОКА
НЕОПРЕДЕЛЕНО
ну и NULL.
если НЕОПРЕДЕЛЕНО то, естественно Выразить как строка даст NULL.
(45)(46)
Почему тип составной я уже ответил в (15).
(48)
1. У тебя во всем условии при всех вариантах возвращается строка, а мне надо чтобы ссылкой, если он ссылка в ЗаказИзделия или ЗаказИзделие.ДокументОснование) и строкой если он строка. Его дальше из ТЗ будут открывать.
2. С группами можно конечно было сделать. Но далеко не на каждый документ «Замер» (он же является ЗаказИзделия.ДокументОснование) будет создан ЗаказИзделия. т.е. очень много замеров с такими контрагентами, которые будут только 1 раз и больше никогда. Руководство решило, что все такие будут проходит в бухгалтерии как «Частное лицо», чтобы справочник контрагентов не рос как на дрожжах, ну а менеджерам естественно нужно пофамильно, чтобы замеры найти. вот и извращаюсь теперь 🙁
(50) И так я тоже делал. Причем с самого начала.
всегда истина, проверено. именно поэтому я стал проверять на пустую ссылку, а не на тип.



