Имя: Пароль:
1C
1С v8
Неправильно работает вычисляемое поле в СКД
0 bplmeddy
 
26.11.19
12:02
Доброго времени суток. Есть запрос следующего вида:

ВЫБРАТЬ
    ТоварыНаСкладахОбороты.Склад,
    ТоварыНаСкладахОбороты.Номенклатура,
    ТоварыНаСкладахОбороты.ХарактеристикаНоменклатуры,
    ЕСТЬNULL(ТоварыНаСкладахОбороты.КоличествоПриход, 0) КАК Поступление,
    NULL КАК Продажи,
    NULL КАК Списание,
    NULL КАК НачальныйОстаток,
    NULL КАК КонечныйОстаток
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК ТоварыНаСкладахОбороты
ГДЕ
    ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОбороты.Регистратор) = ТИП(Документ.ПоступлениеТоваров)

СГРУППИРОВАТЬ ПО
    ТоварыНаСкладахОбороты.Склад,
    ТоварыНаСкладахОбороты.Номенклатура,
    ТоварыНаСкладахОбороты.ХарактеристикаНоменклатуры,
    ЕСТЬNULL(ТоварыНаСкладахОбороты.КоличествоПриход, 0)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ПродажиОбороты.Склад,
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.ХарактеристикаНоменклатуры,
    NULL,
    ПродажиОбороты.КоличествоОборот,
    NULL,
    NULL,
    NULL
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Период, ) КАК ПродажиОбороты

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ТоварыНаСкладахОбороты.Склад,
    ТоварыНаСкладахОбороты.Номенклатура,
    ТоварыНаСкладахОбороты.ХарактеристикаНоменклатуры,
    NULL,
    NULL,
    ТоварыНаСкладахОбороты.КоличествоРасход,
    NULL,
    NULL
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК ТоварыНаСкладахОбороты
ГДЕ
    ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОбороты.Регистратор) = ТИП(Документ.СписаниеТоваров)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Склад,
    ТоварыНаСкладахОстатки.Номенклатура,
    ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры,
    NULL,
    NULL,
    NULL,
    ТоварыНаСкладахОстатки.КоличествоОстаток,
    NULL
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&НачалоПериода, ) КАК ТоварыНаСкладахОстатки

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Склад,
    ТоварыНаСкладахОстатки.Номенклатура,
    ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры,
    NULL,
    NULL,
    NULL,
    NULL,
    ТоварыНаСкладахОстатки.КоличествоОстаток
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&КонецПериода, ) КАК ТоварыНаСкладахОстатки


И есть вычисляемое поле СКД вида:

ВЫБОР КОГДА Поступление <> 0 ТОГДА Продажи/Поступление*100 ИНАЧЕ Продажи*100 КОНЕЦ

Но почему-то, когда значение поступления есть, формула все равно считает по второй части условия (Продажи*100). Хотя само значение продажи в запросе выглядит так:
ЕСТЬNULL(ТоварыНаСкладахОбороты.КоличествоПриход, 0)
Можете подсказать, в чем именно проблема ?
Буду очень благодарен.
1 bplmeddy
 
26.11.19
12:03
Пардон, опечатался, не значение продажи, а значение поступления.
2 hhhh
 
26.11.19
12:14
(1)  NULL, уберите везде. Это юмористически выглядит. Пишите по-русски - 0.
3 Tonik992
 
26.11.19
12:16
>> Хотя само значение поступления в запросе выглядит так:
>> ЕСТЬNULL(ТоварыНаСкладахОбороты.КоличествоПриход, 0)

В это в первом запросе так. А в остальных то NULL
4 bplmeddy
 
26.11.19
12:19
(2) Емм, в смысле ?
5 bplmeddy
 
26.11.19
12:21
6 bplmeddy
 
26.11.19
12:28
(3) Либо я неправильно понимаю вас, либо я чего-то не знаю...
7 hhhh
 
26.11.19
12:30
(6) если значение 0, то и пишите 0. Не надо писать через анус: NULL, из-за этого вы огребли реальные проблемы, и всё равно упорствуете. Поставьте везде нкули. Жизнь станет намного проще.
8 Tonik992
 
26.11.19
12:31
9 bplmeddy
 
26.11.19
12:34
(7) (8) Хм, не знал что так можно. Сейчас попробую.
10 hhhh
 
26.11.19
12:35
(9) а я не знал, что NULL можно.
11 bplmeddy
 
26.11.19
12:36
(10) О_о
Так конструктор при создании объединённых запросов сам НУЛЛ проставляет.
12 Йохохо
 
26.11.19
12:37
(10) нул появляется если втупую не выбрать поля)
13 bplmeddy
 
26.11.19
12:39
Неа, поменял везде на нули - результат тот-же.

ВЫБОР КОГДА Поступление <> 0 ТОГДА Продажи/Поступление*100 ИНАЧЕ Продажи*100 КОНЕЦ

Вместо первой части условия (Продажи/Поступление*100), всегда считает по второй, не зависимо от того есть значение поступления или нет...
14 bplmeddy
 
26.11.19
12:41
(13) Попробовал немного изменить условие, на срабатывание если БОЛЬШЕ нуля:

ВЫБОР КОГДА Поступление > 0 ТОГДА Продажи/Поступление*100 ИНАЧЕ Продажи*100 КОНЕЦ

Ноль эффекта.
15 bplmeddy
 
26.11.19
12:45
Есть ещё мысли почему так ?
16 bplmeddy
 
26.11.19
12:56
Порой я вообще не понимаю эту систему (1С)...
17 bplmeddy
 
26.11.19
13:06
Для интереса решил сложить продажи и поступления - все правильно посчитало.
Вопрос: почему эта ***** не хочет работать с нужной формулой....?
18 ИУБиПовиц
 
26.11.19
13:06
СГРУППИРОВАТЬ ПО
...
ЕСТЬNULL(ТоварыНаСкладахОбороты.КоличествоПриход, 0)

А зачем вы группируете по количеству?
Зачем вы группируете здесь, а не в СКД?
19 ИУБиПовиц
 
26.11.19
13:07
Если в запросе убрать эту группировку, поможет?
20 bplmeddy
 
26.11.19
13:09
(19) Сейчас попробую.
21 bplmeddy
 
26.11.19
13:13
(19) (20) Не помогло. Тот-же результат.
22 Йохохо
 
26.11.19
13:17
(21) в консоли запросов выведи результат
23 hhhh
 
26.11.19
13:28
(21) у вас получается здесь всегда или поступление = 0 или продажи = 0. То есть результат всегда или 0 или продажи. зачем вообще это выражение, непонятно. выкиньте его, оно ничего не делает.
24 vicof
 
26.11.19
13:44
(0) Учить язык запросов. Учить СКД.
1. Убрать Nullы
2. Свернуть данные из 5 таблиц в одну или условие ставить на итоговые поля, а не не детальные.
25 bplmeddy
 
26.11.19
16:19
Вопрос удалось решить путем отказа от вычисляемого поля и немного изменив запрос:
26 bplmeddy
 
26.11.19
16:20
ВЫБРАТЬ
    ТоварыНаСкладахОбороты.Склад,
    ТоварыНаСкладахОбороты.Номенклатура,
    ТоварыНаСкладахОбороты.ХарактеристикаНоменклатуры,
    ТоварыНаСкладахОбороты.КоличествоПриход КАК Поступление,
    0 КАК Продажи,
    0 КАК Списание,
    0 КАК НачальныйОстаток,
    0 КАК КонечныйОстаток,
    0 КАК ТестПрод,
    0 КАК ТестПост,
    0 КАК ПроцентПродаж
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК ТоварыНаСкладахОбороты
ГДЕ
    ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОбороты.Регистратор) = ТИП(Документ.ПоступлениеТоваров)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ПродажиОбороты.Склад,
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.ХарактеристикаНоменклатуры,
    0,
    ПродажиОбороты.КоличествоОборот,
    0,
    0,
    0,
    0,
    0,
    0
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Период, ) КАК ПродажиОбороты

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ТоварыНаСкладахОбороты.Склад,
    ТоварыНаСкладахОбороты.Номенклатура,
    ТоварыНаСкладахОбороты.ХарактеристикаНоменклатуры,
    0,
    0,
    ТоварыНаСкладахОбороты.КоличествоРасход,
    0,
    0,
    0,
    0,
    0
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК ТоварыНаСкладахОбороты
ГДЕ
    ТИПЗНАЧЕНИЯ(ТоварыНаСкладахОбороты.Регистратор) = ТИП(Документ.СписаниеТоваров)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Склад,
    ТоварыНаСкладахОстатки.Номенклатура,
    ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры,
    0,
    0,
    0,
    ТоварыНаСкладахОстатки.КоличествоОстаток,
    0,
    0,
    0,
    0
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&НачалоПериода, ) КАК ТоварыНаСкладахОстатки

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Склад,
    ТоварыНаСкладахОстатки.Номенклатура,
    ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры,
    0,
    0,
    0,
    0,
    ТоварыНаСкладахОстатки.КоличествоОстаток,
    0,
    0,
    0
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&КонецПериода, ) КАК ТоварыНаСкладахОстатки

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ПродажиОбороты.Склад,
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.ХарактеристикаНоменклатуры,
    0,
    0,
    0,
    0,
    0,
    СУММА(ПродажиОбороты.КоличествоОборот),
    ТоварыНаСкладахОбороты.КоличествоПриход,
    ВЫБОР
        КОГДА ТоварыНаСкладахОбороты.КоличествоПриход ЕСТЬ NULL
            ТОГДА ПродажиОбороты.КоличествоОборот * 100
        ИНАЧЕ ПродажиОбороты.КоличествоОборот / ТоварыНаСкладахОбороты.КоличествоПриход * 100
    КОНЕЦ
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК ПродажиОбороты
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Обороты КАК ТоварыНаСкладахОбороты
        ПО ПродажиОбороты.Склад = ТоварыНаСкладахОбороты.Склад
            И ПродажиОбороты.Номенклатура = ТоварыНаСкладахОбороты.Номенклатура
            И ПродажиОбороты.ХарактеристикаНоменклатуры = ТоварыНаСкладахОбороты.ХарактеристикаНоменклатуры

СГРУППИРОВАТЬ ПО
    ПродажиОбороты.Склад,
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.ХарактеристикаНоменклатуры,
    ТоварыНаСкладахОбороты.КоличествоПриход,
    ВЫБОР
        КОГДА ТоварыНаСкладахОбороты.КоличествоПриход ЕСТЬ NULL
            ТОГДА ПродажиОбороты.КоличествоОборот * 100
        ИНАЧЕ ПродажиОбороты.КоличествоОборот / ТоварыНаСкладахОбороты.КоличествоПриход * 100
    КОНЕЦ