Имя: Пароль:
1C
1С v8
Остатки товаров - ВЫБОР ЕСТЬNULL
0 EvgeniuXP
 
21.10.13
17:43
Есть код программы:
ВЫБОР
    КОГДА ЕСТЬNULL(КоличествоОстаток, 0) = 0 Тогда 0
    ИНАЧЕ
        ВЫБОР
            КОГДА Количество = ЕСТЬNULL(КоличествоОстаток, 0) ТОГДА СтоимостьОстаток
            ИНАЧЕ Количество / КоличествоОстаток * СтоимостьОстаток
        КОНЕЦ
КОНЕЦ

а можно ли записать это вот так, по-моему это идентично:
ВЫБОР
    КОГДА ЕСТЬNULL(КоличествоОстаток, 0) = 0 Тогда 0
    ИНАЧЕ
        ВЫБОР
            КОГДА Количество = КоличествоОстаток ТОГДА СтоимостьОстаток
            ИНАЧЕ Количество / КоличествоОстаток * СтоимостьОстаток
        КОНЕЦ
КОНЕЦ

т.к. первое условие отфильтрует NULL, а во втором ВЫБОР-е проверять на NULL уже не обязательно.

более того, в первом варианте, второе КОГДА еще и не правильное, ЕСТЬNULL(КоличествоОстаток, 0) вернет 0, а вот СтоимостьОстаток вернет NULL, но т.к. сработает первое условие КОГДА, то не вернет NULL, вернет 0.
1 Джинн
 
21.10.13
17:45
КОГДА ЕСТЬNULL(КоличествоОстаток, 0) = 0 Тогда 0

Бред какой-то :(
2 Maxus43
 
21.10.13
17:45
можно написать  ЕСТЬNULL(Количество,0)/ЕСТЬNULL(КоличествоОстаток,1)*СтоимостьОстаток
3 Maxus43
 
21.10.13
17:46
(2) + ну или как то так, сам погляди логику
4 EvgeniuXP
 
21.10.13
17:55
и второй вопрос:

почему при оперативном проведении чистят регистр "СтоимостьТоваров", а при не оперативном не чистят?

да, в расчетах ошибки нет, но если смотреть количество и документ проведенный и мы его перепроводим другим числом (было 25.01.2012, проводим 27.01.2012), то движения текущего документа возьмутся, т.к. движения не очистили и не записали.

т.е. такой код в модуле документа РасходТовара:

    Движения.СтоимостьТоваров.Очистить();
    Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
        Движения.СтоимостьТоваров.Записать();
    Иначе
        МоментИтогов = МоментВремени();    
    КонецЕсли;


желательно поменять на такой:
    Движения.СтоимостьТоваров.Очистить();
    Движения.СтоимостьТоваров.Записать();

и момент времени можно передать уже хоть с учетом границы, хоть без...
5 fisher
 
21.10.13
17:55
(2) А если КоличествоОстаток = 0?
6 Maxus43
 
21.10.13
17:57
(5) уел :)
7 EvgeniuXP
 
21.10.13
17:59
(4) т.е. при оперативном явно избавляются от движений, а в неоперативном - нет - хотя движения возьмутся (поменять дату с 25, на 27), но ниже пишут:

МоментИтогов = МоментВремени(); - якобы без учета движений текущего документа...
8 EvgeniuXP
 
21.10.13
18:01
признаюсь, это код(ы) GROOVY - его магию я не понимаю...
9 DexterMorgan
 
21.10.13
18:03
(8) Кароче, я тебе по секрету скажу на экзамене по спец., режим проведения вообще не важен.
10 EvgeniuXP
 
21.10.13
18:06
(9) дак я и вижу, что при любом раскладе нужно чистить и записывать регистры :)
11 fisher
 
21.10.13
18:09
(0) Короче, да. Второй вариант идентичен первому по результату. Оба рабочие. Первый слегка избыточен (похоже на случайную механическую копи-пасту).
12 Timon1405
 
21.10.13
18:21
Я так это понимаю:
купили 3 шт на 10р., списываем по одной
какая будет стоимость последней штуки?
не 3.33333..., а ВЕСЬ остаток стоимости полностью. именно об этом и говорится в запросе
13 GROOVY
 
21.10.13
18:32
(8) Гонишь, я того что в (0) не писал - это бред.
14 EvgeniuXP
 
21.10.13
20:27
(13) как не писал, если это в первой задаче по специалисту (первый поток: mg.spec8.ru). Ё-маё, еще и по шапке получил... вот так всегда...
15 EvgeniuXP
 
21.10.13
20:32
(13) на второй ответ нашел GROOVY 12.04.2012 в 14:26 в мг - спасибо.
16 GROOVY
 
21.10.13
20:44
17 EvgeniuXP
 
21.10.13
21:52
(16) почитал, и видео смотрел - вот я и говорю, если в //7 смотреть результат запроса при перепроведении документа и сменить дату с 25.01.12 на 27.01.12 остатки будут включены прошлым проведением,т.е. остатки получим меньше, чем должно быть - на расчет себестоимости это не сказывается, что можно и пренебречь и более понятно, наверное, всё таки чистить и записывать пустой набор перед чтением - так более логично.
18 EvgeniuXP
 
21.10.13
21:54
(+17) чистить и зиписывать не только при оперативном, но и при неоперативном проведении - но это, можете сказать, что лишняя нагрузка на БД - но остатки же не верные в запросе.
19 EvgeniuXP
 
21.10.13
21:57
(+18) в расчете себестоимости не верное КоличествоОстаток. В первом запросе, где остатки считываем - там всё правильно.
20 EvgeniuXP
 
21.10.13
22:02
а если еще смешать теорию с практикой, т.е. не только сдавать экзамен на спеца, но еще и в жизни работать на этой базе - то для последовательности это очень плохой пример, т.к. запись пустого набора будет влиять на границу последовательности - а документ пользователь просто перепровел не изменяя ни дату, ни количество, ни товары - привыкли нажимать ОК как закрыть :(
21 GROOVY
 
21.10.13
22:09
Если мы границу припишем, то вообще другой пример получится.
Для себестоимости можно включать и рассчитывать старые движения, либо исключать их (независимо от даты) однозначно. Что в последовательностях... Ну фигово все будет, зато правильно.