База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как в запросе указать два разных склада в условиях выбора?
- В этой теме 1 ответ, 2 участника, последнее обновление 9 часов, 10 минут назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
3 апреля 2026 в 14:45 #36285
во внешнем отчете , как в запросе в условии указать 2 одинаковых параметра чтобы они работали. к примеру есть номенклатура и я хочу выбирать 2 склада, но каждый раз разные . он не показывает когда я либо 2 склад не указываю или другой ставлю
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
Номенклатура.Родитель КАК НоменклатураРодитель
ПОМЕСТИТЬ ВТ_НоменклатураПоРодителю
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Родитель = &Родитель
И Номенклатура.Наименование ПОДОБНО &НаименованиеЧасть
;////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_НоменклатураПоРодителю.Номенклатура КАК Номенклатура,
ПартииТоваровНаСкладахОстатки.Склад КАК Склад,
ПартииТоваровНаСкладахОстатки.Организация КАК Организация,
ПартииТоваровНаСкладахОстатки.СерияНоменклатуры КАК СерияНоменклатуры,
ПартииТоваровНаСкладахОстатки.КоличествоОстаток КАК КонечныйОстаток
ПОМЕСТИТЬ ВТ_НахождениеОстаткаКонецПериода
ИЗ
ВТ_НоменклатураПоРодителю КАК ВТ_НоменклатураПоРодителю
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки(&ДатаКонец, ) КАК ПартииТоваровНаСкладахОстатки
ПО ВТ_НоменклатураПоРодителю.Номенклатура.Ссылка = ПартииТоваровНаСкладахОстатки.Номенклатура.Ссылка
ГДЕ
ПартииТоваровНаСкладахОстатки.Склад = &Склад
И ПартииТоваровНаСкладахОстатки.Организация = &Организация
И ПартииТоваровНаСкладахОстатки.Склад = &Склад2
; -
3 апреля 2026 в 14:45 #36286
В 1С в запросах нельзя просто указать два одинаковых параметра для одного поля, например:
MySQL123ГДЕПартииТоваровНаСкладахОстатки.Склад = &СкладИ ПартииТоваровНаСкладахОстатки.Склад = &Склад2Потому что условие одновременно требует, чтобы склад был равен двум разным значениям, что невозможно.
Правильный способ — использовать условие с оператором ИЛИ, и при этом учитывать, что параметры могут быть не заданы (например, пустые или NULL), чтобы фильтрация работала корректно.
Пример правильного условия с двумя параметрами склада:
MySQL1234ГДЕ(&Склад = NULL ИЛИ ПартииТоваровНаСкладахОстатки.Склад = &Склад)И(&Склад2 = NULL ИЛИ ПартииТоваровНаСкладахОстатки.Склад = &Склад2)Но это условие не выберет записи, где склад равен либо Склад, либо Склад2, а только те, где склад одновременно равен обоим (что невозможно).
Поэтому нужно использовать ИЛИ:
MySQL123456ГДЕ((&Склад = NULL ИЛИ ПартииТоваровНаСкладахОстатки.Склад = &Склад)ИЛИ(&Склад2 = NULL ИЛИ ПартииТоваровНаСкладахОстатки.Склад = &Склад2))Но тогда, если оба параметра NULL, условие будет всегда истинно (т.е. фильтрация по складам не применяется).
Если нужно, чтобы при отсутствии параметров фильтрация не применялась, а при указании одного или двух складов — фильтровала по ним, то лучше сделать так:
1. В коде 1С формировать параметр-массив складов, например, &Склады, куда добавлять 0 или пустое значение, если фильтр не задан, или один/два склада.
2. В запросе использовать оператор В:
MySQL12ГДЕПартииТоваровНаСкладахОстатки.Склад В (&Склады)3. В коде 1С перед выполнением запроса:
1С (Код)123456789101112Если ЗначениеЗаполнено(Склад1) ТогдаСклады = Новый Массив;Склады.Добавить(Склад1);Если ЗначениеЗаполнено(Склад2) ТогдаСклады.Добавить(Склад2);КонецЕсли;Иначе// Если ни один склад не указан, можно не задавать фильтр или задать все складыСклады = Неопределено; // или пустой массив, в зависимости от логикиКонецЕсли;Запрос.УстановитьПараметр("Склады", Склады);4. В запросе условие:
MySQL12ГДЕ(&Склады IS NULL ИЛИ ПартииТоваровНаСкладахОстатки.Склад В (&Склады))Это позволит:
— Если параметр &Склады не задан (NULL) — фильтрация по складам не применяется.
— Если задан один или два склада — фильтрация по ним.
Если по каким-то причинам нельзя использовать массивы, то можно сделать условие с ИЛИ и проверкой на NULL, например:
MySQL12345678ГДЕ((&Склад IS NULL И &Склад2 IS NULL)ИЛИ(ПартииТоваровНаСкладахОстатки.Склад = &Склад)ИЛИ(ПартииТоваровНаСкладахОстатки.Склад = &Склад2))Но это менее удобно и менее читаемо.
—
Итог: для выбора двух разных складов с возможностью не указывать один или оба параметра, лучше использовать параметр-массив и оператор В, либо условие с ИЛИ и проверкой на NULL.
Пример кода запроса с параметром-массивом:
1С (Код)123456789Запрос = Новый Запрос;Запрос.Текст ="ВЫБРАТЬ| ...|ИЗ| ...|ГДЕ| (&Склады IS NULL ИЛИ ПартииТоваровНаСкладахОстатки.Склад В (&Склады))";В коде 1С:
1С (Код)12345678910111213Склады = Новый Массив;Если ЗначениеЗаполнено(Склад1) ТогдаСклады.Добавить(Склад1);КонецЕсли;Если ЗначениеЗаполнено(Склад2) ТогдаСклады.Добавить(Склад2);КонецЕсли;Если Склады.Количество() = 0 ТогдаЗапрос.УстановитьПараметр("Склады", Неопределено);ИначеЗапрос.УстановитьПараметр("Склады", Склады);КонецЕсли;—
https://infostart.ru/public/1222835/
https://infostart.ru/public/1223314/
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.