Имя: Пароль:
1C
1С v8
Списание по партиям, помогите найти ошибку
0 Vladius
 
03.10.11
20:16
Вот код:

УчетнаяПолитика = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).Значение;

Если УчетнаяПолитика = Перечисления.УчетнаяПолитика.ЛИФО Тогда
   ПорядокСписания = "УБЫВ";
Иначе
   ПорядокСписания = "ВОЗР";
КонецЕсли;

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

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока Выборка.Следующий()  Цикл
   Если Выборка.Количество > Выборка.КоличествоОстаток Тогда
       Нехватает = Выборка.Количество - Выборка.КоличествоОстаток;
       Сообщение = Новый СообщениеПользователю;
       Сообщение.Текст = "Не хватает товара " + "'" + Выборка.Номенклатура + "'" +
       " количество " + Нехватает + " в наличии осталось только " + Выборка.КоличествоОстаток;
       Сообщение.УстановитьДанные(ЭтотОбъект);
       Сообщение.Поле = "Товары["+(Выборка.НомерСтроки-1)+"].Количество";
       Сообщение.Сообщить();
       Отказ=Истина;
   КонецЕсли;    
КонецЦикла;

Если Отказ Тогда
   Возврат;
КонецЕсли;

Выборка.Сбросить();

Пока Выборка.Следующий() Цикл
   ОсталосьСписать = Выборка.Количество;
   ВыборкаПартий = Выборка.Выбрать();
   Пока ВыборкаПартий.Следующий() И ОсталосьСписать <>0 Цикл
       Списать = Мин(ОсталосьСписать, Выборка.КоличествоОстаток);

       Движение = Движения.ОстаткиНоменклатуры.Добавить();
       Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
       Движение.Период = Дата;
       Движение.Номенклатура = Выборка.Номенклатура;
       Движение.Количество = Списать;
       Движение.Партия = ВыборкаПартий.Партия;
       Движение.Стоимость = Выборка.Цена;
       
       ОсталосьСписать = ОсталосьСписать - Списать;
   КонецЦикла;        
КонецЦикла;

Движения.ОстаткиНоменклатуры.Записывать=Истина;


Товар списывается. Но получается вот такая лабуда
http://imagestun.com/images/2011/1jjlla3avb.jpg

И затем товар не списывается так как списывает его по последней партии в которой остаток 0 а не по следующей партии.
Где ошибка так и не понял....
1 catena
 
03.10.11
20:20
Так на первой же партии и отказ:    

Если Выборка.Количество > Выборка.КоличествоОстаток Тогда
2 Vladius
 
03.10.11
20:38
Не совсем понял причем тут "Если Выборка.Количество > Выборка.КоличествоОстаток Тогда" ?
3 catena
 
03.10.11
20:39
(2)Отладчиков пройдись, поймешь.
У тебя на первой же партии это условие спотыкается.
4 Vladius
 
03.10.11
20:45
Выборка.КоличествоОстаток показывает 0. Значит проблема в запросе?
5 Tarlich
 
03.10.11
20:56
НЕ берусь утверждать - может что то с ГП ?
6 catena
 
03.10.11
20:58
Да при чем здесь? Нехватку надо определять по сумме всех партий, а не по каждой партии отдельно.
7 Vladius
 
03.10.11
21:03
Подсказали что с регистра надо отбирать вот так

РегистрНакопления.ОстаткиНоменклатуры.Остатки(&;МоментВремени, Номенклатура В(ВЫБРАТЬ Номенклатура ИЗ ДокТЧ КАК ДокТЧ))

Что именно выполняет этот код?

В(ВЫБРАТЬ Номенклатура ИЗ ДокТЧ КАК ДокТЧ)

Так все работает...
8 GROOVY
 
модератор
04.10.11
01:37
(7) ВНИМАТЕЛЬНО читаем посты (3) и (6).