Имя: Пароль:
1C
1С v8
Вопрос по списанию.
0 tg30000
 
28.02.12
07:47
Процедура ОбработкаПроведения(Отказ, Режим)
   Запрос=Новый Запрос;
   Запрос.Текст=
   "ВЫБРАТЬ
   |    Реализация_вариант_Счет_00_116_списаниеТЧ.Номенклатура КАК Номенклатура,
   |    СУММА(Реализация_вариант_Счет_00_116_списаниеТЧ.Количество) КАК Количество,
   |    Реализация_вариант_Счет_00_116_списаниеТЧ.Ссылка.Подразделение,
   |    Реализация_вариант_Счет_00_116_списаниеТЧ.Ссылка.Мол
   |ПОМЕСТИТЬ ТабДок
   |ИЗ
   |    Документ.Реализация_вариант_Счет_00_116_списание.ТЧ КАК Реализация_вариант_Счет_00_116_списаниеТЧ
   |ГДЕ
   |    Реализация_вариант_Счет_00_116_списаниеТЧ.Ссылка = &Ссылка
   |
   |СГРУППИРОВАТЬ ПО
   |    Реализация_вариант_Счет_00_116_списаниеТЧ.Номенклатура,
   |    Реализация_вариант_Счет_00_116_списаниеТЧ.Ссылка.Подразделение,
   |    Реализация_вариант_Счет_00_116_списаниеТЧ.Ссылка.Мол
   |
   |ИНДЕКСИРОВАТЬ ПО
   |    Номенклатура
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    ЕСТЬNULL(Счет_00_116Остатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
   |    ЕСТЬNULL(Счет_00_116Остатки.СуммаОстаток, 0) КАК СуммаОстаток,
   |    ТабДок.Номенклатура,
   |    ТабДок.Количество,
   |    ТабДок.Подразделение,
   |    Счет_00_116Остатки.Подразделение КАК Подразделение1,
   |    Счет_00_116Остатки.Мол
   |ИЗ
   |    ТабДок КАК ТабДок
   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Счет_00_116.Остатки КАК Счет_00_116Остатки
   |        ПО ТабДок.Номенклатура = Счет_00_116Остатки.Номенткатура
   |            И ТабДок.Подразделение = Счет_00_116Остатки.Подразделение
   |            И ТабДок.Мол = Счет_00_116Остатки.Мол";
   Запрос.УстановитьПараметр("Ссылка",Ссылка);
   Запрос.УстановитьПараметр("Подразделение1",Подразделение);
   Запрос.УстановитьПараметр("Мол",Мол);
   Результат=Запрос.Выполнить();
   
   ВыборкаДетальныеЗаписи=Результат.Выбрать();
   Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
       
   Движение=Движения.Счет_00_116.Добавить();
   Движение.ВидДвижения=ВидДвиженияНакопления.Расход;
   Движение.Период=Дата;
   Движение.Номенткатура=ВыборкаДетальныеЗаписи.Номенклатура;
   Движение.Подразделение=ВыборкаДетальныеЗаписи.Подразделение;
   Движение.Количество=ВыборкаДетальныеЗаписи.Количество;
   Движение.Мол=Мол;
   //Контроль отрицательных остатков товаров ! ! !
   Если ВыборкаДетальныеЗаписи.КоличествоОстаток<ВыборкаДетальныеЗаписи.Количество  Тогда
       Отказ=Истина;
       Сообщение = Новый СообщениеПользователю;
       Нехватка=ВыборкаДетальныеЗаписи.Количество-ВыборкаДетальныеЗаписи.КоличествоОстаток;
       Сообщение.Текст="НЕХВАТКА ТОВАРА!" + "в подразделении : "+ВыборкаДетальныеЗаписи.Подразделение+"У МОЛ: "+ВыборкаДетальныеЗаписи.Мол+" товара:"+ВыборкаДетальныеЗаписи.Номенклатура+" Находится в количестве: "+ВыборкаДетальныеЗаписи.КоличествоОстаток +" а Вы списываете " +ВыборкаДетальныеЗаписи.Количество;
       Сообщение.Сообщить();
   ИначеЕсли ВыборкаДетальныеЗаписи.КоличествоОстаток=ВыборкаДетальныеЗаписи.Количество Тогда
       Движение.Сумма=ВыборкаДетальныеЗаписи.СуммаОстаток;
   ИначеЕсли ВыборкаДетальныеЗаписи.КоличествоОстаток>ВыборкаДетальныеЗаписи.Количество() Тогда
       Движение.Сумма=ВыборкаДетальныеЗаписи.СуммаОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток*ВыборкаДетальныеЗаписи.Количество;
   КонецЕсли;
   КонецЦикла;
   
КонецПроцедуры






Написана такая ОбработкаПроведения.
В регистрах есть записи :например стол 3шт на сумму 300р. Стул 1шт на сумму 50р.
Если списываю по одной строчке в табл части то все правильно списывает: 1 стол спишет по 100р. Но если списываю и стол и стул ,то если все списывается то выводит правильно, а если стол спишу 1 то он спишется без суммы, но второй строчкой стул 1 спишется правильно.
в общем если списываю неслолько позиций и не все из них списываются полностью, то не считается сумма по этим позициям, хотя смотрю в отладчике и условие вроде выполняется (ИначеЕсли ВыборкаДетальныеЗаписи.КоличествоОстаток>ВыборкаДетальныеЗаписи.Количество() Тогда) и в правой части все числа есть (Движение.Сумма=ВыборкаДетальныеЗаписи.СуммаОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток*ВыборкаДетальныеЗаписи.Количество;) а лавая часть(Движение.Сумма) все равно равна нулю...

Не пойму что не так..
1 Wobland
 
28.02.12
07:49
начнём, помолясь ;) остатки на какую дату берёшь?
2 Wobland
 
28.02.12
07:49
Запрос.УстановитьПараметр("Подразделение1",Подразделение);
Запрос.УстановитьПараметр("Мол",Мол);

это тебе зачем?
3 Wobland
 
28.02.12
07:51
Сумма=СуммаОстаток/КоличествоОстаток*Количество;

вот тут не понял
4 Wobland
 
28.02.12
07:53
|    ТабДок.Подразделение,
|    Счет_00_116Остатки.Подразделение КАК Подразделение1,

зачем два раза одно и то же?
5 tg30000
 
28.02.12
07:53
(2) В регистры попадает информация по 20 подразделениям, и то какое выбрано в документе по тому и идет списание

(3) ВыборкаДетальныеЗаписи.СуммаОстаток/ВыборкаДетальныеЗаписи.КоличествоОстаток*ВыборкаДетальныеЗаписи.Количество;
Ну по данным позициям получается информация и производятся арифм. действия.
6 Wobland
 
28.02.12
07:53
|    ЕСТЬNULL(Счет_00_116Остатки.СуммаОстаток, 0) КАК СуммаОстаток,
а у нас возможны NULLы при внутреннем соединении?
7 Wobland
 
28.02.12
07:54
(5) параметры устанавливаешь, а не используешь
8 tg30000
 
28.02.12
07:54
(6) ну тут да неправильно..
9 Wobland
 
28.02.12
07:54
(5) смысл арифметики от меня скрыт
10 tg30000
 
28.02.12
07:55
Ну как можно списать  из регистров тогда?
11 tg30000
 
28.02.12
07:56
если одна позиция ,то списывается же все правильно..
12 Wobland
 
28.02.12
07:58
(11) например стол 3шт на сумму 300р. Стул 1шт на сумму 50р.
давай спишем два стола и один стул. какой результат должен получиться?
13 Wobland
 
28.02.12
07:59
согласно (3) столы будут списываться по 50?
14 tg30000
 
28.02.12
08:03
Ну есть на остатке 3 стола на 300р
и 1 стул на сумму 50р.

1)если списываем в документе только одну позицию то если спишем 2 стола то они спишутся (300/3)*2=200р. остаток 1шт на сумму 100р.

2) НО если более одной позиции списывается в одном документе то сумма по тем позициям которые не полностью списываются не ставится вообще..
15 tg30000
 
28.02.12
08:04
Что-то неправильно в списании у меня раз при наличии более одной строки не выполняются условия..
16 Wobland
 
28.02.12
08:07
(14) 1) ага, арифметику понял ;)
2) делай Движения.Добавить() только если действительно собираешься делать движение.
3) а вообще - перепиши с нуля. двойной запрос там явно лишний
17 tg30000
 
28.02.12
08:09
(16) Спасибо, действительно проще снести что писалось и написать с нуля, а то еще больше можно запутаться..
Спасибо!
18 Wobland
 
28.02.12
08:10
(17) про (1) не забудь
19 tg30000
 
28.02.12
08:12
Про дату хорошо что напомнили!Спасибо!