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

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

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

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

        ////////////////////////////////////////////////////////////////////////////////
        ВЫБРАТЬ
        НАЧАЛОПЕРИОДА(ТоварыНаСкладах.Период, ДЕНЬ) КАК День,
        ТоварыНаСкладах.Номенклатура,
        МАКСИМУМ(ТоварыНаСкладах.Регистратор) КАК Регистратор
        ПОМЕСТИТЬ втМаксРегПоДню
        ИЗ
        РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
        ГДЕ
        ((ТоварыНаСкладах.Номенклатура, НАЧАЛОПЕРИОДА(ТоварыНаСкладах.Период, ДЕНЬ)) В
        (ВЫБРАТЬ
        втПоДню.Номенклатура,
        втПоДню.День
        ИЗ
        втПоДню)
        И ТИПЗНАЧЕНИЯ(ТоварыНаСкладах.Регистратор) = ТИП(Документ.РеализацияТоваровУслуг)
        Или НЕ ТоварыНаСкладах.Регистратор.Комментарий ПОДОБНО «%#Оформлен операцией%»
        ИЛИ НЕ ТоварыНаСкладах.Регистратор ЕСТЬ NULL)

        СГРУППИРОВАТЬ ПО
        ТоварыНаСкладах.Номенклатура,
        НАЧАЛОПЕРИОДА(ТоварыНаСкладах.Период, ДЕНЬ)
        ;

        ////////////////////////////////////////////////////////////////////////////////
        ВЫБРАТЬ
        втПоДню.День,
        втПоДню.Номенклатура,
        втМаксРегПоДню.Регистратор,
        втПоДню.КоличествоОборот,
        втПоДню.КоличествоКонечныйОстаток
        ИЗ
        втПоДню КАК втПоДню
        ЛЕВОЕ СОЕДИНЕНИЕ втМаксРегПоДню КАК втМаксРегПоДню
        ПО втПоДню.Номенклатура = втМаксРегПоДню.Номенклатура
        И втПоДню.День = втМаксРегПоДню.День

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

          В вашем запросе есть ошибка в условии WHERE во втором блоке — неверное использование логических операторов И, ИЛИ без скобок, из-за чего условие работает неправильно.

          Вот правильный вариант с расстановкой скобок и исправлением логики:

          |ВЫБРАТЬ
          | НАЧАЛОПЕРИОДА(ТоварыНаСкладахОстаткиИОбороты.Период, ДЕНЬ) КАК День,
          | ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
          | ТоварыНаСкладахОстаткиИОбороты.КоличествоОборот,
          | ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток
          |ПОМЕСТИТЬ втПоДню
          |ИЗ
          | РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, , ) КАК ТоварыНаСкладахОстаткиИОбороты
          |ГДЕ
          | ТоварыНаСкладахОстаткиИОбороты.Номенклатура В ИЕРАРХИИ(&НоменклатураГр)
          |;
          |
          |////////////////////////////////////////////////////////////////////////////////
          |
          |ВЫБРАТЬ
          | НАЧАЛОПЕРИОДА(ТоварыНаСкладах.Период, ДЕНЬ) КАК День,
          | ТоварыНаСкладах.Номенклатура,
          | МАКСИМУМ(ТоварыНаСкладах.Регистратор) КАК Регистратор
          |ПОМЕСТИТЬ втМаксРегПоДню
          |ИЗ
          | РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
          |ГДЕ
          | (
          | (ТоварыНаСкладах.Номенклатура, НАЧАЛОПЕРИОДА(ТоварыНаСкладах.Период, ДЕНЬ)) В
          | (ВЫБРАТЬ
          | втПоДню.Номенклатура,
          | втПоДню.День
          | ИЗ
          | втПоДню)
          | )
          | И
          | (
          | ТИПЗНАЧЕНИЯ(ТоварыНаСкладах.Регистратор) = ТИП(Документ.РеализацияТоваровУслуг)
          | ИЛИ НЕ ТоварыНаСкладах.Регистратор.Комментарий ПОДОБНО «%#Оформлен операцией%»
          | ИЛИ ТоварыНаСкладах.Регистратор ЕСТЬ NULL
          | )
          |СГРУППИРОВАТЬ ПО
          | ТоварыНаСкладах.Номенклатура,
          | НАЧАЛОПЕРИОДА(ТоварыНаСкладах.Период, ДЕНЬ)
          |;
          |
          |////////////////////////////////////////////////////////////////////////////////
          |
          |ВЫБРАТЬ
          | втПоДню.День,
          | втПоДню.Номенклатура,
          | втМаксРегПоДню.Регистратор,
          | втПоДню.КоличествоОборот,
          | втПоДню.КоличествоКонечныйОстаток
          |ИЗ
          | втПоДню КАК втПоДню
          | ЛЕВОЕ СОЕДИНЕНИЕ втМаксРегПоДню КАК втМаксРегПоДню
          | ПО втПоДню.Номенклатура = втМаксРегПоДню.Номенклатура
          | И втПоДню.День = втМаксРегПоДню.День
          ;

          Объяснение:

          — В условии WHERE во втором запросе скобки вокруг логического выражения обязательны, чтобы правильно объединить условия с И и ИЛИ.

          — Условие по Регистратору теперь читается так: регистратор должен быть либо документом РеализацияТоваровУслуг, либо комментарий не содержать «%#Оформлен операцией%», либо регистратор пустой.

          — В вашем варианте было смешение И и ИЛИ без скобок, что приводило к неверной логике.

          — В последнем запросе добавлен точный синтаксис для соединения.

          Если нужно, могу помочь с оптимизацией или разъяснением.

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