База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как использовать сумму из регистра в запросе вместо документа? › Ответ в теме: Как использовать сумму из регистра в запросе вместо документа?
В текущем запросе поле Сумма берется из документа, потому что у вас во внешнем запросе указано:
|
1 |
|ПриобретениеТоваровУслуг.Сумма КАК Сумма, |
А данные из регистра сейчас вообще не выводятся во внешний результат. В подзапросе регистра поле:
|
1 |
|СУММА(СебестоимостьТоваровОбороты.Стоимость) КАК Сумма, |
только рассчитывается, но наружу вы его не выбираете.
Если нужно, чтобы Сумма и СуммаБезНДС брались именно из регистра, замените во внешнем ВЫБРАТЬ эти строки:
|
1 2 3 |
|ПриобретениеТоваровУслуг.Сумма КАК Сумма, |ПриобретениеТоваровУслуг.СуммаНДС КАК СуммаНДС, |null КАК СуммаБезНДС, |
на:
|
1 2 3 |
|ЕСТЬNULL(СебестоимостьТоваров.Сумма, 0) КАК Сумма, |ПриобретениеТоваровУслуг.СуммаНДС КАК СуммаНДС, |ЕСТЬNULL(СебестоимостьТоваров.СуммаБезНДС, 0) КАК СуммаБезНДС, |
Здесь:
|
1 |
|СебестоимостьТоваров.Сумма |
будет брать значение из подзапроса регистра:
|
1 |
|СУММА(СебестоимостьТоваровОбороты.Стоимость) КАК Сумма |
А:
|
1 |
|СебестоимостьТоваров.СуммаБезНДС |
будет брать значение из:
|
1 |
|СУММА(СебестоимостьТоваровОбороты.СтоимостьБезНДС) КАК СуммаБезНДС |
Фрагмент внешнего запроса должен выглядеть так:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
| ПриобретениеТоваровУслуг.Цена КАК Цена, | ПриобретениеТоваровУслуг.КоличествоУпаковок КАК Количество, | | ЕСТЬNULL(СебестоимостьТоваров.Сумма, 0) КАК Сумма, | ПриобретениеТоваровУслуг.СуммаРучнойСкидки КАК СуммаСкидки, | | ЕСТЬNULL(СебестоимостьТоваров.Сумма, 0) | + ПриобретениеТоваровУслуг.СуммаРучнойСкидки КАК СуммаБезСкидки, | | ПриобретениеТоваровУслуг.СуммаНДС КАК СуммаНДС, | ЕСТЬNULL(СебестоимостьТоваров.СуммаБезНДС, 0) КАК СуммаБезНДС, | | ПриобретениеТоваровУслуг.НомерСтроки КАК НомерСтроки |
Но обратите внимание: в этом варианте СуммаБезСкидки рассчитывается как:
|
1 |
Сумма из регистра + скидка из документа |
Если скидка не должна участвовать, используйте:
|
1 2 3 |
| ЕСТЬNULL(СебестоимостьТоваров.Сумма, 0) КАК Сумма, | ПриобретениеТоваровУслуг.СуммаРучнойСкидки КАК СуммаСкидки, | ЕСТЬNULL(СебестоимостьТоваров.Сумма, 0) КАК СуммаБезСкидки, |
### Важное различие между полями
Сейчас у вас есть два разных поля с одинаковым псевдонимом Сумма:
Из документа:
|
1 |
|ПриобретениеТоваровУслуг.Сумма КАК Сумма |
Из регистра в подзапросе:
|
1 |
|СУММА(СебестоимостьТоваровОбороты.Стоимость) КАК Сумма |
Псевдоним Сумма внутри подзапроса не означает, что он автоматически попадет в итоговую таблицу. Чтобы использовать его во внешнем запросе, нужно явно написать:
|
1 |
|СебестоимостьТоваров.Сумма |
Поэтому правильная схема такая:
|
1 2 |
|Подзапрос регистра: |СУММА(СебестоимостьТоваровОбороты.Стоимость) КАК Сумма |
и затем:
|
1 2 |
|Внешний запрос: |ЕСТЬNULL(СебестоимостьТоваров.Сумма, 0) КАК Сумма |
### Если нужно сохранить обе суммы
Для проверки лучше временно не называть сумму регистра просто Сумма, а дать ей отдельное имя:
|
1 2 3 4 |
|ПриобретениеТоваровУслуг.Сумма КАК СуммаДокумента, |ЕСТЬNULL(СебестоимостьТоваров.Сумма, 0) КАК СуммаРегистра, |ПриобретениеТоваровУслуг.СуммаНДС КАК СуммаНДСДокумента, |ЕСТЬNULL(СебестоимостьТоваров.СуммаБезНДС, 0) КАК СуммаБезНДСРегистра, |
Так вы сразу увидите, что именно вернул запрос:
|
1 2 3 4 |
СуммаДокумента СуммаРегистра СуммаНДСДокумента СуммаБезНДСРегистра |
Рекомендуемый диагностический вариант:
|
1 2 3 4 |
| ПриобретениеТоваровУслуг.Сумма КАК СуммаДокумента, | ЕСТЬNULL(СебестоимостьТоваров.Сумма, 0) КАК СуммаРегистра, | ПриобретениеТоваровУслуг.СуммаНДС КАК СуммаНДСДокумента, | ЕСТЬNULL(СебестоимостьТоваров.СуммаБезНДС, 0) КАК СуммаБезНДСРегистра, |
После проверки, если итоговой форме нужна именно сумма из регистра, можно оставить:
|
1 2 |
|ЕСТЬNULL(СебестоимостьТоваров.Сумма, 0) КАК Сумма, |ЕСТЬNULL(СебестоимостьТоваров.СуммаБезНДС, 0) КАК СуммаБезНДС, |
### Что должно быть в подзапросе регистра
Подзапрос у вас должен содержать реальные ресурсы регистра:
|
1 2 |
|СУММА(СебестоимостьТоваровОбороты.Стоимость) КАК Сумма, |СУММА(СебестоимостьТоваровОбороты.СтоимостьБезНДС) КАК СуммаБезНДС |
Полный фрагмент соединения:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|ЛЕВОЕ СОЕДИНЕНИЕ |( | ВЫБРАТЬ | СебестоимостьТоваровОбороты.Регистратор КАК Регистратор, | СебестоимостьТоваровОбороты.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура, | СебестоимостьТоваровОбороты.АналитикаУчетаНоменклатуры.Характеристика КАК Характеристика, | СебестоимостьТоваровОбороты.АналитикаУчетаНоменклатуры.Серия КАК Серия, | СУММА(СебестоимостьТоваровОбороты.Стоимость) КАК Сумма, | СУММА(СебестоимостьТоваровОбороты.СтоимостьБезНДС) КАК СуммаБезНДС | ИЗ | РегистрНакопления.СебестоимостьТоваров КАК СебестоимостьТоваровОбороты | ГДЕ | СебестоимостьТоваровОбороты.Регистратор В (&МассивДокументов) | И СебестоимостьТоваровОбороты.ВидДвижения = &ВидДвиженияПриход | СГРУППИРОВАТЬ ПО | СебестоимостьТоваровОбороты.Регистратор, | СебестоимостьТоваровОбороты.АналитикаУчетаНоменклатуры.Номенклатура, | СебестоимостьТоваровОбороты.АналитикаУчетаНоменклатуры.Характеристика, | СебестоимостьТоваровОбороты.АналитикаУчетаНоменклатуры.Серия |) КАК СебестоимостьТоваров |ПО | СебестоимостьТоваров.Регистратор = ПриобретениеТоваровУслуг.Ссылка | И СебестоимостьТоваров.Номенклатура = ПриобретениеТоваровУслуг.Номенклатура | И СебестоимостьТоваров.Характеристика = ПриобретениеТоваровУслуг.Характеристика | И СебестоимостьТоваров.Серия = ПриобретениеТоваровУслуг.Серия |
Итоговый ключевой фрагмент для вашей задачи:
|
1 2 |
| ЕСТЬNULL(СебестоимостьТоваров.Сумма, 0) КАК Сумма, | ЕСТЬNULL(СебестоимостьТоваров.СуммаБезНДС, 0) КАК СуммаБезНДС, |
Именно эти поля будут брать данные из регистра, а не из документа. Если они возвращают 0, значит соединение не нашло соответствующую строку регистра, и тогда нужно проверять наличие движений, вид движения и соответствие регистратора, номенклатуры, характеристики и серии.