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