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

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

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

        ВЫБРАТЬ ПЕРВЫЕ 100
        РеализацияТоваровУслуг.ЗаказКлиента.Договор КАК ЗаказДоговор,
        РеализацияТоваровУслуг.ЗаказКлиента.Ссылка КАК ЗаказСсылка,
        РеализацияТоваровУслуг.Ссылка КАК РеализацияСсылка,
        РеализацияТоваровУслуг.ЗаказКлиента.Ссылка КАК РеализацияЗаказСсылка,
        РасчетыСКлиентами.Сумма КАК Сумма,
        РасчетыСКлиентами.КОплате КАК КОплате,
        РасчетыСКлиентами.Оплачивается КАК Оплачивается,
        РасчетыСКлиентами.КОтгрузке КАК КОтгрузке,
        РасчетыСКлиентами.Отгружается КАК Отгружается,
        РасчетыСКлиентами.ОбъектРасчетов.Ссылка КАК ОбъектРасчетовСсылка
        ИЗ
        РегистрНакопления.РасчетыСКлиентами КАК РасчетыСКлиентами
        ПРАВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента КАК Заказ
        ПО РеализацияТоваровУслуг.ЗаказКлиента.Ссылка = Заказ.Ссылка
        ПО (РеализацияТоваровУслуг.Договор = РасчетыСКлиентами.ОбъектРасчетов.Ссылка)

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

          В вашем запросе есть несколько ошибок и некорректных конструкций:

          1. В конструкции соединений вы используете:

          | РегистрНакопления.РасчетыСКлиентами КАК РасчетыСКлиентами
          | ПРАВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
          | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента КАК Заказ
          | ПО РеализацияТоваровУслуг.ЗаказКлиента.Ссылка = Заказ.Ссылка
          | ПО (РеализацияТоваровУслуг.Договор = РасчетыСКлиентами.ОбъектРасчетов.Ссылка)

          Такой синтаксис неверен, потому что:

          — В 1С запросах JOINы строятся последовательно, а не вложенно в условии другого JOIN.
          — Условие соединения ПРАВОГО СОЕДИНЕНИЯ должно быть после ключевого слова ПО, а не после вложенного ЛЕВОГО СОЕДИНЕНИЯ.
          — Вложенный JOIN (ЛЕВОЕ СОЕДИНЕНИЕ) должен быть отдельным элементом в списке соединений, а не внутри условия другого JOIN.

          2. В условии соединения:

          | РеализацияТоваровУслуг.Договор = РасчетыСКлиентами.ОбъектРасчетов.Ссылка

          Проверяйте, что:

          — РеализацияТоваровУслуг.Договор — это ссылка на договор (справочник ДоговорыКонтрагентов).
          — РасчетыСКлиентами.ОбъектРасчетов — это ссылка на документ или договор. Если это ссылка на договор, то сравнение корректно.

          3. В выборке:

          | РасчетыСКлиентами.ОбъектРасчетов.Ссылка

          Если ОбъектРасчетов — это ссылка, то достаточно писать:

          | РасчетыСКлиентами.ОбъектРасчетов КАК ОбъектРасчетовСсылка

          Правильный вариант запроса с последовательными соединениями:

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

          Объяснение:

          — Сначала из регистра берем обороты за период.
          — ПРАВОЕ СОЕДИНЕНИЕ с Реализацией по договору.
          — ЛЕВОЕ СОЕДИНЕНИЕ с Заказом по ссылке ЗаказКлиента.
          — Условия фильтрации по дате Заказа.

          Если хотите, чтобы соединения были в другом порядке, то можно перестроить, но главное — не вкладывать JOIN внутрь условия другого JOIN.

          Если нужна помощь с конкретной структурой базы, уточните, что именно хранит РасчетыСКлиентами.ОбъектРасчетов — договор или заказ, и какие реквизиты есть в Реализации и Заказе.

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