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

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

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

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

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

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

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

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

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

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

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

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

    3. В выборке:

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

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

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

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

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

    Объяснение:

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

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

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

    База знаний 1С