Как исправить запрос, чтобы отбирать документы без движения в регистре?

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

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

        поправить запрос не отбирает доки без регистра товары на складах ВЫБРАТЬ
        РеализацияТоваровУслуг.Ссылка,
        РеализацияТоваровУслугТовары.Номенклатура
        ПОМЕСТИТЬ ВТ_Доки
        ИЗ
        Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ПО (РеализацияТоваровУслугТовары.Ссылка = РеализацияТоваровУслуг.Ссылка)
        ГДЕ
        РеализацияТоваровУслуг.Проведен
        И РеализацияТоваровУслуг.Дата >= &НачалоПериода
        И РеализацияТоваровУслуг.Дата <= &КонецПериода

        ;

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

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

          В вашем запросе ошибка в том, что вы пытаетесь отобрать документы, у которых нет движений в регистре «ТоварыНаСкладах», но при этом делаете соединение по табличной части с внутренним соединением, а потом в выборке по регистру используете левое соединение, но условие «ТоварыНаСкладах.Регистратор ЕСТЬ NULL» не сработает, потому что в первой части вы уже отобрали только те документы, у которых есть строки в табличной части.

          Чтобы исправить запрос и получить документы реализации, которые проведены, попадают в период, и по которым нет движений в регистре «ТоварыНаСкладах», сделайте так:

          1. Сначала выберите все проведённые документы реализации за период (без привязки к табличной части).
          2. Затем сделайте левое соединение с регистром «ТоварыНаСкладах» по регистратору.
          3. Отберите только те документы, у которых в регистре нет записей (т.е. регистратор NULL).

          Пример исправленного запроса:

          |ВЫБРАТЬ
          | Реализация.Ссылка КАК Ссылка,
          | Реализация.Дата КАК ДатаДокумента,
          | Реализация.Номер КАК НомерДокумента
          |ИЗ
          | Документ.РеализацияТоваровУслуг КАК Реализация
          |ГДЕ
          | Реализация.Проведен
          | И Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода
          | И НЕ СУЩЕСТВУЕТ (
          | ВЫБРАТЬ
          | 1
          | ИЗ
          | РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
          | ГДЕ
          | ТоварыНаСкладах.Регистратор = Реализация.Ссылка
          | )

          Если нужно по конкретным номенклатурам из табличной части, то можно сделать так:

          |ВЫБРАТЬ
          | Реализация.Ссылка КАК Ссылка,
          | Реализация.Дата КАК ДатаДокумента,
          | Реализация.Номер КАК НомерДокумента
          |ИЗ
          | Документ.РеализацияТоваровУслуг КАК Реализация
          |ГДЕ
          | Реализация.Проведен
          | И Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода
          | И НЕ СУЩЕСТВУЕТ (
          | ВЫБРАТЬ
          | 1
          | ИЗ
          | РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
          | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Товары
          | ПО Товары.Ссылка = ТоварыНаСкладах.Регистратор
          | ГДЕ
          | Товары.Ссылка = Реализация.Ссылка
          | )

          Почему так?

          — Левое соединение с условием «ТоварыНаСкладах.Регистратор ЕСТЬ NULL» в вашем варианте не работает, потому что вы сначала берёте только те документы, у которых есть табличная часть (внутреннее соединение), а потом пытаетесь найти отсутствие движений — это логически конфликт.

          — Использование подзапроса с НЕ СУЩЕСТВУЕТ — самый простой и надёжный способ проверить отсутствие движений по регистру.

          Если хотите именно через временную таблицу и соединения, то нужно:

          1. В первую временную таблицу положить все проведённые документы реализации за период (без соединения с табличной частью).

          2. Во второй выборке сделать левое соединение с регистром «ТоварыНаСкладах» по регистратору.

          3. Отобрать записи, где регистратор NULL.

          Пример:

          |ВЫБРАТЬ
          | Реализация.Ссылка КАК Ссылка
          |ПОМЕСТИТЬ ВТ_Доки
          |ИЗ
          | Документ.РеализацияТоваровУслуг КАК Реализация
          |ГДЕ
          | Реализация.Проведен
          | И Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода
          |;
          |
          |ВЫБРАТЬ
          | ВТ_Доки.Ссылка КАК Ссылка
          |ИЗ
          | ВТ_Доки КАК ВТ_Доки
          | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
          | ПО ВТ_Доки.Ссылка = ТоварыНаСкладах.Регистратор
          |ГДЕ
          | ТоварыНаСкладах.Регистратор ЕСТЬ NULL

          Так запрос будет работать корректно и покажет документы реализации без движений в регистре «ТоварыНаСкладах».

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