База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как исправить логические ошибки во втором блоке запроса 1С?
- В этой теме 1 ответ, 2 участника, последнее обновление 2 минуты назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
24 августа 2026 в 16:36 #38446
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ТоварыНаСкладахОстаткиИОбороты.Период, ДЕНЬ) КАК День,
ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
ТоварыНаСкладахОстаткиИОбороты.КоличествоОборот,
ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток
ПОМЕСТИТЬ втПоДню
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, , ) КАК ТоварыНаСкладахОстаткиИОбороты
ГДЕ
ТоварыНаСкладахОстаткиИОбороты.Номенклатура В ИЕРАРХИИ(&НоменклатураГр)
;////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ТоварыНаСкладах.Период, ДЕНЬ) КАК День,
ТоварыНаСкладах.Номенклатура,
МАКСИМУМ(ТоварыНаСкладах.Регистратор) КАК Регистратор
ПОМЕСТИТЬ втМаксРегПоДню
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
ГДЕ
((ТоварыНаСкладах.Номенклатура, НАЧАЛОПЕРИОДА(ТоварыНаСкладах.Период, ДЕНЬ)) В
(ВЫБРАТЬ
втПоДню.Номенклатура,
втПоДню.День
ИЗ
втПоДню)
И ТИПЗНАЧЕНИЯ(ТоварыНаСкладах.Регистратор) = ТИП(Документ.РеализацияТоваровУслуг)
Или НЕ ТоварыНаСкладах.Регистратор.Комментарий ПОДОБНО «%#Оформлен операцией%»
ИЛИ НЕ ТоварыНаСкладах.Регистратор ЕСТЬ NULL)СГРУППИРОВАТЬ ПО
ТоварыНаСкладах.Номенклатура,
НАЧАЛОПЕРИОДА(ТоварыНаСкладах.Период, ДЕНЬ)
;////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втПоДню.День,
втПоДню.Номенклатура,
втМаксРегПоДню.Регистратор,
втПоДню.КоличествоОборот,
втПоДню.КоличествоКонечныйОстаток
ИЗ
втПоДню КАК втПоДню
ЛЕВОЕ СОЕДИНЕНИЕ втМаксРегПоДню КАК втМаксРегПоДню
ПО втПоДню.Номенклатура = втМаксРегПоДню.Номенклатура
И втПоДню.День = втМаксРегПоДню.День -
24 августа 2026 в 16:36 #38447
В вашем запросе есть ошибка в условии WHERE во втором блоке — неверное использование логических операторов И, ИЛИ без скобок, из-за чего условие работает неправильно.
Вот правильный вариант с расстановкой скобок и исправлением логики:
|ВЫБРАТЬ
| НАЧАЛОПЕРИОДА(ТоварыНаСкладахОстаткиИОбороты.Период, ДЕНЬ) КАК День,
| ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
| ТоварыНаСкладахОстаткиИОбороты.КоличествоОборот,
| ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток
|ПОМЕСТИТЬ втПоДню
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, , ) КАК ТоварыНаСкладахОстаткиИОбороты
|ГДЕ
| ТоварыНаСкладахОстаткиИОбороты.Номенклатура В ИЕРАРХИИ(&НоменклатураГр)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|
|ВЫБРАТЬ
| НАЧАЛОПЕРИОДА(ТоварыНаСкладах.Период, ДЕНЬ) КАК День,
| ТоварыНаСкладах.Номенклатура,
| МАКСИМУМ(ТоварыНаСкладах.Регистратор) КАК Регистратор
|ПОМЕСТИТЬ втМаксРегПоДню
|ИЗ
| РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
|ГДЕ
| (
| (ТоварыНаСкладах.Номенклатура, НАЧАЛОПЕРИОДА(ТоварыНаСкладах.Период, ДЕНЬ)) В
| (ВЫБРАТЬ
| втПоДню.Номенклатура,
| втПоДню.День
| ИЗ
| втПоДню)
| )
| И
| (
| ТИПЗНАЧЕНИЯ(ТоварыНаСкладах.Регистратор) = ТИП(Документ.РеализацияТоваровУслуг)
| ИЛИ НЕ ТоварыНаСкладах.Регистратор.Комментарий ПОДОБНО «%#Оформлен операцией%»
| ИЛИ ТоварыНаСкладах.Регистратор ЕСТЬ NULL
| )
|СГРУППИРОВАТЬ ПО
| ТоварыНаСкладах.Номенклатура,
| НАЧАЛОПЕРИОДА(ТоварыНаСкладах.Период, ДЕНЬ)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|
|ВЫБРАТЬ
| втПоДню.День,
| втПоДню.Номенклатура,
| втМаксРегПоДню.Регистратор,
| втПоДню.КоличествоОборот,
| втПоДню.КоличествоКонечныйОстаток
|ИЗ
| втПоДню КАК втПоДню
| ЛЕВОЕ СОЕДИНЕНИЕ втМаксРегПоДню КАК втМаксРегПоДню
| ПО втПоДню.Номенклатура = втМаксРегПоДню.Номенклатура
| И втПоДню.День = втМаксРегПоДню.День
;Объяснение:
— В условии WHERE во втором запросе скобки вокруг логического выражения обязательны, чтобы правильно объединить условия с И и ИЛИ.
— Условие по Регистратору теперь читается так: регистратор должен быть либо документом РеализацияТоваровУслуг, либо комментарий не содержать «%#Оформлен операцией%», либо регистратор пустой.
— В вашем варианте было смешение И и ИЛИ без скобок, что приводило к неверной логике.
— В последнем запросе добавлен точный синтаксис для соединения.
Если нужно, могу помочь с оптимизацией или разъяснением.
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.