База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Какие ошибки в запросе 1С могут вызывать неправильные остатки товаров?
- В этой теме 1 ответ, 2 участника, последнее обновление 16 минут назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
26 августа 2026 в 12:55 #38478
ВЫБРАТЬ
0 КАК Р
ПОМЕСТИТЬ РазрядыОБЪЕДИНИТЬ
ВЫБРАТЬ
1ОБЪЕДИНИТЬ
ВЫБРАТЬ
2ОБЪЕДИНИТЬ
ВЫБРАТЬ
3ОБЪЕДИНИТЬ
ВЫБРАТЬ
4ОБЪЕДИНИТЬ
ВЫБРАТЬ
5ОБЪЕДИНИТЬ
ВЫБРАТЬ
6ОБЪЕДИНИТЬ
ВЫБРАТЬ
7ОБЪЕДИНИТЬ
ВЫБРАТЬ
8ОБЪЕДИНИТЬ
ВЫБРАТЬ
9
;////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ), ДЕНЬ, Единицы.Р + Десятки.Р * 10 + Сотни.Р * 100 + Тысячи.Р * 1000) КАК Период
ПОМЕСТИТЬ ТаблицаДат
ИЗ
Разряды КАК Единицы,
Разряды КАК Десятки,
Разряды КАК Сотни,
Разряды КАК Тысячи
ГДЕ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ), ДЕНЬ, Единицы.Р + Десятки.Р * 10 + Сотни.Р * 100 + Тысячи.Р * 1000) <= &ДатаОкончания
;////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТоварыНаСкладахОстаткиИОбороты.Период,
ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток
ПОМЕСТИТЬ ВТ_Остатки
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , День, Движения, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОстаткиИОбороты
;////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТаблицаДат.Период КАК ТДПериод,
МАКСИМУМ(ВТ_Остатки.Период) КАК ПериодРО,
ВТ_Остатки.Номенклатура
ПОМЕСТИТЬ ВТ_БлижайшиеДатыОстатков
ИЗ
ТаблицаДат КАК ТаблицаДат
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
ПО ТаблицаДат.Период >= ВТ_Остатки.ПериодСГРУППИРОВАТЬ ПО
ТаблицаДат.Период,
ВТ_Остатки.Номенклатура
;//////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_БлижайшиеДатыОстатков.ТДПериод КАК ТДПериод,
ВТ_Остатки.Номенклатура,
ВЫБОР
КОГДА ТДПериод = ВТ_Остатки.Период
ТОГДА ВТ_Остатки.КоличествоНачальныйОстаток
ИНАЧЕ КоличествоКонечныйОстаток
КОНЕЦ КАК КоличествоНачальныйОстаток,
ВЫБОР
КОГДА ТДПериод = ВТ_Остатки.Период
ТОГДА ВТ_Остатки.КоличествоПриход
ИНАЧЕ 0
КОНЕЦ КАК КоличествоПриход
ВЫБОР
КОГДА ТДПериод = ВТ_Остатки.Период
ТОГДА ВТ_Остатки.КоличествоРасход
ИНАЧЕ 0
КОНЕЦ КАК КоличествоРасход, ВТ_Остатки.КоличествоКонечныйОстаток,
ТоварыНаСкладахОбороты.Регистратор
ИЗ
ВТ_БлижайшиеДатыОстатков КАК ВТ_БлижайшиеДатыОстатков
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Обороты(&ДатаНачала, &ДатаОкончания, Регистратор, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОбороты
ПО ВТ_Остатки.Период = НАЧАЛОПЕРИОДА(ТоварыНаСкладахОбороты.Период, ДЕНЬ)
ПО ВТ_БлижайшиеДатыОстатков.ПериодРО = ВТ_Остатки.Период
И ВТ_БлижайшиеДатыОстатков.Номенклатура = ВТ_Остатки.Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
ПО ВТ_БлижайшиеДатыОстатков.ПериодРО = ВТ_Остатки.Период
И ВТ_БлижайшиеДатыОстатков.Номенклатура = ВТ_Остатки.Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Обороты(&ДатаНачала, &ДатаОкончания, Регистратор, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОбороты
ПО ВТ_Остатки.Период = НАЧАЛОПЕРИОДА(ТоварыНаСкладахОбороты.Период, ДЕНЬ)
УПОРЯДОЧИТЬ ПО
ТДПериод -
26 августа 2026 в 12:55 #38479
В вашем запросе есть несколько ошибок синтаксиса и логики, которые мешают корректному выполнению:
1. Дублирование соединений (ПО) подряд
В блоке с соединениями:|ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Обороты(…) КАК ТоварыНаСкладахОбороты
|ПО ВТ_Остатки.Период = НАЧАЛОПЕРИОДА(ТоварыНаСкладахОбороты.Период, ДЕНЬ)
|ПО ВТ_БлижайшиеДатыОстатков.ПериодРО = ВТ_Остатки.Период
|И ВТ_БлижайшиеДатыОстатков.Номенклатура = ВТ_Остатки.НоменклатураЗдесь два оператора ПО подряд — это ошибка. В 1С запросах после каждого соединения должен быть только один оператор ПО.
Правильно:
|ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
|ПО ВТ_БлижайшиеДатыОстатков.ПериодРО = ВТ_Остатки.Период
|И ВТ_БлижайшиеДатыОстатков.Номенклатура = ВТ_Остатки.Номенклатура
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Обороты(&ДатаНачала, &ДатаОкончания, Регистратор, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОбороты
|ПО ВТ_Остатки.Период = НАЧАЛОПЕРИОДА(ТоварыНаСкладахОбороты.Период, ДЕНЬ)2. Отсутствие запятых между полями в выборке
В блоке выбора полей:|ВЫБОР … КОНЕЦ КАК КоличествоРасход,
|ВТ_Остатки.КоличествоКонечныйОстаток
|ТоварыНаСкладахОбороты.РегистраторМежду
КоличествоКонечныйОстатокиТоварыНаСкладахОбороты.Регистраторотсутствует запятая.Добавьте запятую:
|ВЫБОР … КОНЕЦ КАК КоличествоРасход,
|ВТ_Остатки.КоличествоКонечныйОстаток,
|ТоварыНаСкладахОбороты.Регистратор3. Дублирование соединений с ВТ_Остатки и ТоварыНаСкладахОбороты
В запросе дважды повторяются соединения с ВТ_Остатки и ТоварыНаСкладахОбороты, что избыточно и вызовет ошибку.Удалите повторяющиеся соединения, оставьте по одному соединению каждого.
4. Рекомендация по построению таблицы дат
Ваш способ построения таблицы дат через разряды — классический и рабочий. Убедитесь, что параметры&ДатаНачалаи&ДатаОкончаниякорректны.—
### Итог: исправленный фрагмент с соединениями и выборкой
|ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
|ПО ВТ_БлижайшиеДатыОстатков.ПериодРО = ВТ_Остатки.Период
|И ВТ_БлижайшиеДатыОстатков.Номенклатура = ВТ_Остатки.Номенклатура
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Обороты(&ДатаНачала, &ДатаОкончания, Регистратор, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОбороты
|ПО ВТ_Остатки.Период = НАЧАЛОПЕРИОДА(ТоварыНаСкладахОбороты.Период, ДЕНЬ)—
|ВЫБРАТЬ
| ВТ_БлижайшиеДатыОстатков.ТДПериод КАК ТДПериод,
| ВТ_Остатки.Номенклатура,
| ВЫБОР
| КОГДА ТДПериод = ВТ_Остатки.Период
| ТОГДА ВТ_Остатки.КоличествоНачальныйОстаток
| ИНАЧЕ ВТ_Остатки.КоличествоКонечныйОстаток
| КОНЕЦ КАК КоличествоНачальныйОстаток,
| ВЫБОР
| КОГДА ТДПериод = ВТ_Остатки.Период
| ТОГДА ВТ_Остатки.КоличествоПриход
| ИНАЧЕ 0
| КОНЕЦ КАК КоличествоПриход,
| ВЫБОР
| КОГДА ТДПериод = ВТ_Остатки.Период
| ТОГДА ВТ_Остатки.КоличествоРасход
| ИНАЧЕ 0
| КОНЕЦ КАК КоличествоРасход,
| ВТ_Остатки.КоличествоКонечныйОстаток,
| ТоварыНаСкладахОбороты.Регистратор
|ИЗ
| ВТ_БлижайшиеДатыОстатков КАК ВТ_БлижайшиеДатыОстатков
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
| ПО ВТ_БлижайшиеДатыОстатков.ПериодРО = ВТ_Остатки.Период
| И ВТ_БлижайшиеДатыОстатков.Номенклатура = ВТ_Остатки.Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Обороты(&ДатаНачала, &ДатаОкончания, Регистратор, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОбороты
| ПО ВТ_Остатки.Период = НАЧАЛОПЕРИОДА(ТоварыНаСкладахОбороты.Период, ДЕНЬ)
|УПОРЯДОЧИТЬ ПО
| ТДПериод—
Если нужно, могу помочь с полным исправленным текстом запроса.
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.