База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как в запросе указать два разных склада в условиях выбора? › Ответ в теме: Как в запросе указать два разных склада в условиях выбора?
В 1С в запросах нельзя просто указать два одинаковых параметра для одного поля, например:
|
1 2 3 |
ГДЕ ПартииТоваровНаСкладахОстатки.Склад = &Склад И ПартииТоваровНаСкладахОстатки.Склад = &Склад2 |
Потому что условие одновременно требует, чтобы склад был равен двум разным значениям, что невозможно.
Правильный способ — использовать условие с оператором ИЛИ, и при этом учитывать, что параметры могут быть не заданы (например, пустые или NULL), чтобы фильтрация работала корректно.
Пример правильного условия с двумя параметрами склада:
|
1 2 3 4 |
ГДЕ (&Склад = NULL ИЛИ ПартииТоваровНаСкладахОстатки.Склад = &Склад) И (&Склад2 = NULL ИЛИ ПартииТоваровНаСкладахОстатки.Склад = &Склад2) |
Но это условие не выберет записи, где склад равен либо Склад, либо Склад2, а только те, где склад одновременно равен обоим (что невозможно).
Поэтому нужно использовать ИЛИ:
|
1 2 3 4 5 6 |
ГДЕ ( (&Склад = NULL ИЛИ ПартииТоваровНаСкладахОстатки.Склад = &Склад) ИЛИ (&Склад2 = NULL ИЛИ ПартииТоваровНаСкладахОстатки.Склад = &Склад2) ) |
Но тогда, если оба параметра NULL, условие будет всегда истинно (т.е. фильтрация по складам не применяется).
Если нужно, чтобы при отсутствии параметров фильтрация не применялась, а при указании одного или двух складов — фильтровала по ним, то лучше сделать так:
1. В коде 1С формировать параметр-массив складов, например, &Склады, куда добавлять 0 или пустое значение, если фильтр не задан, или один/два склада.
2. В запросе использовать оператор В:
|
1 2 |
ГДЕ ПартииТоваровНаСкладахОстатки.Склад В (&Склады) |
3. В коде 1С перед выполнением запроса:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
Если ЗначениеЗаполнено(Склад1) Тогда Склады = Новый Массив; Склады.Добавить(Склад1); Если ЗначениеЗаполнено(Склад2) Тогда Склады.Добавить(Склад2); КонецЕсли; Иначе // Если ни один склад не указан, можно не задавать фильтр или задать все склады Склады = Неопределено; // или пустой массив, в зависимости от логики КонецЕсли; Запрос.УстановитьПараметр("Склады", Склады); |
4. В запросе условие:
|
1 2 |
ГДЕ (&Склады IS NULL ИЛИ ПартииТоваровНаСкладахОстатки.Склад В (&Склады)) |
Это позволит:
— Если параметр &Склады не задан (NULL) — фильтрация по складам не применяется.
— Если задан один или два склада — фильтрация по ним.
Если по каким-то причинам нельзя использовать массивы, то можно сделать условие с ИЛИ и проверкой на NULL, например:
|
1 2 3 4 5 6 7 8 |
ГДЕ ( (&Склад IS NULL И &Склад2 IS NULL) ИЛИ (ПартииТоваровНаСкладахОстатки.Склад = &Склад) ИЛИ (ПартииТоваровНаСкладахОстатки.Склад = &Склад2) ) |
Но это менее удобно и менее читаемо.
—
Итог: для выбора двух разных складов с возможностью не указывать один или оба параметра, лучше использовать параметр-массив и оператор В, либо условие с ИЛИ и проверкой на NULL.
Пример кода запроса с параметром-массивом:
|
1 2 3 4 5 6 7 8 9 |
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ... |ИЗ | ... |ГДЕ | (&Склады IS NULL ИЛИ ПартииТоваровНаСкладахОстатки.Склад В (&Склады)) "; |
В коде 1С:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Склады = Новый Массив; Если ЗначениеЗаполнено(Склад1) Тогда Склады.Добавить(Склад1); КонецЕсли; Если ЗначениеЗаполнено(Склад2) Тогда Склады.Добавить(Склад2); КонецЕсли; Если Склады.Количество() = 0 Тогда Запрос.УстановитьПараметр("Склады", Неопределено); Иначе Запрос.УстановитьПараметр("Склады", Склады); КонецЕсли; |
—
https://infostart.ru/public/1222835/
https://infostart.ru/public/1223314/