Как в запросе указать два разных склада в условиях выбора?

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

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #36285
      Фото аватараOdineski
      Участник

        во внешнем отчете , как в запросе в условии указать 2 одинаковых параметра чтобы они работали. к примеру есть номенклатура и я хочу выбирать 2 склада, но каждый раз разные . он не показывает когда я либо 2 склад не указываю или другой ставлю
        ВЫБРАТЬ
        Номенклатура.Ссылка КАК Номенклатура,
        Номенклатура.Родитель КАК НоменклатураРодитель
        ПОМЕСТИТЬ ВТ_НоменклатураПоРодителю
        ИЗ
        Справочник.Номенклатура КАК Номенклатура
        ГДЕ
        Номенклатура.Родитель = &Родитель
        И Номенклатура.Наименование ПОДОБНО &НаименованиеЧасть
        ;

        ////////////////////////////////////////////////////////////////////////////////
        ВЫБРАТЬ
        ВТ_НоменклатураПоРодителю.Номенклатура КАК Номенклатура,
        ПартииТоваровНаСкладахОстатки.Склад КАК Склад,
        ПартииТоваровНаСкладахОстатки.Организация КАК Организация,
        ПартииТоваровНаСкладахОстатки.СерияНоменклатуры КАК СерияНоменклатуры,
        ПартииТоваровНаСкладахОстатки.КоличествоОстаток КАК КонечныйОстаток
        ПОМЕСТИТЬ ВТ_НахождениеОстаткаКонецПериода
        ИЗ
        ВТ_НоменклатураПоРодителю КАК ВТ_НоменклатураПоРодителю
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки(&ДатаКонец, ) КАК ПартииТоваровНаСкладахОстатки
        ПО ВТ_НоменклатураПоРодителю.Номенклатура.Ссылка = ПартииТоваровНаСкладахОстатки.Номенклатура.Ссылка
        ГДЕ
        ПартииТоваровНаСкладахОстатки.Склад = &Склад
        И ПартииТоваровНаСкладахОстатки.Организация = &Организация
        И ПартииТоваровНаСкладахОстатки.Склад = &Склад2
        ;

      • #36286
        bot_avaOdin — Одинэсник
        Участник

          В 1С в запросах нельзя просто указать два одинаковых параметра для одного поля, например:

          Потому что условие одновременно требует, чтобы склад был равен двум разным значениям, что невозможно.

          Правильный способ — использовать условие с оператором ИЛИ, и при этом учитывать, что параметры могут быть не заданы (например, пустые или NULL), чтобы фильтрация работала корректно.

          Пример правильного условия с двумя параметрами склада:

          Но это условие не выберет записи, где склад равен либо Склад, либо Склад2, а только те, где склад одновременно равен обоим (что невозможно).

          Поэтому нужно использовать ИЛИ:

          Но тогда, если оба параметра NULL, условие будет всегда истинно (т.е. фильтрация по складам не применяется).

          Если нужно, чтобы при отсутствии параметров фильтрация не применялась, а при указании одного или двух складов — фильтровала по ним, то лучше сделать так:

          1. В коде 1С формировать параметр-массив складов, например, &Склады, куда добавлять 0 или пустое значение, если фильтр не задан, или один/два склада.

          2. В запросе использовать оператор В:

          3. В коде 1С перед выполнением запроса:

          4. В запросе условие:

          Это позволит:

          — Если параметр &Склады не задан (NULL) — фильтрация по складам не применяется.

          — Если задан один или два склада — фильтрация по ним.

          Если по каким-то причинам нельзя использовать массивы, то можно сделать условие с ИЛИ и проверкой на NULL, например:

          Но это менее удобно и менее читаемо.

          Итог: для выбора двух разных складов с возможностью не указывать один или оба параметра, лучше использовать параметр-массив и оператор В, либо условие с ИЛИ и проверкой на NULL.

          Пример кода запроса с параметром-массивом:

          В коде 1С:


          https://infostart.ru/public/1222835/
          https://infostart.ru/public/1223314/

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С