База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как исправить ошибки в 1С запросе с правым и левым соединением? › Ответ в теме: Как исправить ошибки в 1С запросе с правым и левым соединением?
В вашем запросе есть несколько ошибок и некорректных конструкций:
1. В конструкции соединений вы используете:
| РегистрНакопления.РасчетыСКлиентами КАК РасчетыСКлиентами
| ПРАВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента КАК Заказ
| ПО РеализацияТоваровУслуг.ЗаказКлиента.Ссылка = Заказ.Ссылка
| ПО (РеализацияТоваровУслуг.Договор = РасчетыСКлиентами.ОбъектРасчетов.Ссылка)
Такой синтаксис неверен, потому что:
— В 1С запросах JOINы строятся последовательно, а не вложенно в условии другого JOIN.
— Условие соединения ПРАВОГО СОЕДИНЕНИЯ должно быть после ключевого слова ПО, а не после вложенного ЛЕВОГО СОЕДИНЕНИЯ.
— Вложенный JOIN (ЛЕВОЕ СОЕДИНЕНИЕ) должен быть отдельным элементом в списке соединений, а не внутри условия другого JOIN.
2. В условии соединения:
| РеализацияТоваровУслуг.Договор = РасчетыСКлиентами.ОбъектРасчетов.Ссылка
Проверяйте, что:
— РеализацияТоваровУслуг.Договор — это ссылка на договор (справочник ДоговорыКонтрагентов).
— РасчетыСКлиентами.ОбъектРасчетов — это ссылка на документ или договор. Если это ссылка на договор, то сравнение корректно.
3. В выборке:
| РасчетыСКлиентами.ОбъектРасчетов.Ссылка
Если ОбъектРасчетов — это ссылка, то достаточно писать:
| РасчетыСКлиентами.ОбъектРасчетов КАК ОбъектРасчетовСсылка
—
Правильный вариант запроса с последовательными соединениями:
|ВЫБРАТЬ ПЕРВЫЕ 100
| Реализация.ЗаказКлиента.Договор КАК ЗаказДоговор,
| Реализация.ЗаказКлиента ССЫЛКА КАК ЗаказСсылка,
| Реализация.Ссылка КАК РеализацияСсылка,
| Расчеты.Сумма,
| Расчеты.КОплате,
| Расчеты.Оплачивается,
| Расчеты.КОтгрузке,
| Расчеты.Отгружается,
| Расчеты.ОбъектРасчетов КАК ОбъектРасчетовСсылка
|ИЗ
| РегистрНакопления.РасчетыСКлиентами.Обороты(&ДатаНачала, &ДатаКонца) КАК Расчеты
| ПРАВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК Реализация
| ПО Реализация.Договор = Расчеты.ОбъектРасчетов
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента КАК Заказ
| ПО Реализация.ЗаказКлиента = Заказ.Ссылка
|ГДЕ
| Заказ.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
—
Объяснение:
— Сначала из регистра берем обороты за период.
— ПРАВОЕ СОЕДИНЕНИЕ с Реализацией по договору.
— ЛЕВОЕ СОЕДИНЕНИЕ с Заказом по ссылке ЗаказКлиента.
— Условия фильтрации по дате Заказа.
—
Если хотите, чтобы соединения были в другом порядке, то можно перестроить, но главное — не вкладывать JOIN внутрь условия другого JOIN.
—
Если нужна помощь с конкретной структурой базы, уточните, что именно хранит РасчетыСКлиентами.ОбъектРасчетов — договор или заказ, и какие реквизиты есть в Реализации и Заказе.