Имя: Пароль:
1C
1С v8
Списание методом ФИФО
,
0 UUmmmmm
 
30.09.19
23:50
Подскажите пожалуйста что не так в запросе! Списание происходит но в регистр продаж в сумму попадают отрицательные  значения, тоже самое и в регистр себестоимость

Процедура ОбработкаПроведения(Отказ, Режим)
    
    ВидУслуга = Перечисления.ВидыНоменклатуры.Услуга;
    
    Движения.ОстаткиМатериалов.Записать();
    Движения.Себестоимость.Записать();
    Движения.Продажи.Записывать = Истина;
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    МАКСИМУМ(РасходнаяТовары.НомерСтроки) КАК НомерСтроки,
                   |    РасходнаяТовары.Номенклатура КАК Номенклатура,
                   |    СУММА(РасходнаяТовары.Количество) КАК КоличествоВДокументе,
                   |    СУММА(РасходнаяТовары.Сумма) КАК СуммаВДокументе
                   |ПОМЕСТИТЬ Док
                   |ИЗ
                   |    Документ.Расходная.Товары КАК РасходнаяТовары
                   |ГДЕ
                   |    РасходнаяТовары.Ссылка = &Ссылка
                   |
                   |СГРУППИРОВАТЬ ПО
                   |    РасходнаяТовары.Номенклатура
                   |
                   |ИНДЕКСИРОВАТЬ ПО
                   |    Номенклатура
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |ВЫБРАТЬ
                   |    ОстаткиМатериаловОстатки.Партия КАК Партия,
                   |    ЕСТЬNULL(ОстаткиМатериаловОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
                   |    ПриходнаяТовары.Цена КАК Цена,
                   |    Док.НомерСтроки КАК НомерСтроки,
                   |    Док.Номенклатура КАК Номенклатура,
                   |    Док.КоличествоВДокументе КАК КоличествоВДокументе,
                   |    Док.СуммаВДокументе КАК СуммаВДокументе
                   |ИЗ
                   |    Док КАК Док
                   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(
                   |                &Дата,
                   |                Номенклатура В
                   |                    (ВЫБРАТЬ
                   |                        Док.Номенклатура КАК Номенклатура
                   |                    ИЗ
                   |                        Док КАК Док)) КАК ОстаткиМатериаловОстатки
                   |            ЛЕВОЕ СОЕДИНЕНИЕ Документ.Приходная.Товары КАК ПриходнаяТовары
                   |            ПО ОстаткиМатериаловОстатки.Партия = ПриходнаяТовары.Ссылка
                   |                И ОстаткиМатериаловОстатки.Номенклатура = ПриходнаяТовары.Номенклатура
                   |        ПО Док.Номенклатура = ОстаткиМатериаловОстатки.Номенклатура
                   |
                   |УПОРЯДОЧИТЬ ПО
                   |    ОстаткиМатериаловОстатки.Партия.МоментВремени
                   |ИТОГИ
                   |    СУММА(КоличествоОстаток),
                   |    МАКСИМУМ(НомерСтроки),
                   |    МАКСИМУМ(КоличествоВДокументе),
                   |    МАКСИМУМ(СуммаВДокументе)
                   |ПО
                   |    Номенклатура";
    
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Запрос.УстановитьПараметр("Дата", МоментВремени());
    РезультатЗапроса = Запрос.Выполнить();
    
    Если НЕ РезультатЗапроса.Пустой() Тогда
        
        ВыборкаТовары = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
        
        Пока ВыборкаТовары.Следующий() Цикл
            
            Если ВыборкаТовары.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Товар
                И ВыборкаТовары.КоличествоОстаток < ВыборкаТовары.КоличествоВДокументе Тогда
                
                Сообщение = Новый СообщениеПользователю;
                Сообщение.Текст = "Не хватает номенклатуры " + ВыборкаТовары.Номенклатура
                                    + ", в количестве " + Строка(ВыборкаТовары.КоличествоВДокументе - ВыборкаТовары.КоличествоОстаток) + ".";
                Сообщение.Поле = "Товары[" + (ВыборкаТовары.НомерСтроки - 1) + "].Количество";
                Сообщение.УстановитьДанные(ЭтотОбъект);
                Сообщение.Сообщить();
                
                Отказ = Истина;    
                
            КонецЕсли;
            
            Если Отказ Тогда
                Продолжить;
            КонецЕсли;
            
            КоличествоНоменклатурыВДок = ВыборкаТовары.КоличествоВДокументе;
            
            ВыборкаПартий = ВыборкаТовары.Выбрать();
            
            Пока ВыборкаПартий.Следующий() И НЕ КоличествоНоменклатурыВДок = 0 Цикл        
                
                Если ВыборкаТовары.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Товар Тогда
                    
                    ОстатокВПартии = ВыборкаПартий.КоличествоОстаток;
                    КоличествоТоваров = Мин(ОстатокВПартии, КоличествоНоменклатурыВДок);    
                    
                    //Движения по регистру ОстаткиМатериалов
                    Движение = Движения.ОстаткиМатериалов.Добавить();
                    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
                    Движение.Период = Дата;
                    Движение.Партия = ВыборкаПартий.Партия;
                    Движение.Номенклатура = ВыборкаТовары.Номенклатура;
                    Движение.Количество = КоличествоТоваров;    
                    
                    //Движения по регистру Себестоимость
                    Движение = Движения.Себестоимость.Добавить();
                    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
                    Движение.Период = Дата;
                    Движение.Партия = ВыборкаПартий.Партия;
                    Движение.Номенклатура = ВыборкаТовары.Номенклатура;
                    Движение.Стоимость = ВыборкаПартий.Цена * КоличествоТоваров;
                    
                    //Движения по регистру Продажи
                    Движение = Движения.Продажи.Добавить();
                    Движение.Период = Дата;
                    Движение.Номенклатура = ВыборкаТовары.Номенклатура;
                    Движение.Мастер = Мастер;
                    Движение.Партия = ВыборкаПартий.Партия;
                    Движение.Количество = КоличествоТоваров;
                    Движение.Сумма = (ВыборкаТовары.СуммаВДокументе / ВыборкаТовары.КоличествоВДокументе) * КоличествоТоваров;
                    
                    КоличествоНоменклатурыВДок = ОстатокВПартии - КоличествоНоменклатурыВДок;
                    
                ИначеЕсли ВыборкаТовары.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
                    
                    //Движения по регистру Продажи для услуг
                    Движение = Движения.Продажи.Добавить();
                    Движение.Период = Дата;
                    Движение.Номенклатура = ВыборкаТовары.Номенклатура;
                    Движение.Мастер = Мастер;
                    Движение.Количество = ВыборкаТовары.КоличествоВДокументе;
                    Движение.Сумма = ВыборкаТовары.СуммаВДокументе;
                КонецЕсли;
                
            КонецЦикла;    
            
        КонецЦикла;
        
    КонецЕсли;
    
    Движения.ОстаткиМатериалов.Записать();
    Движения.Себестоимость.Записать();
    
КонецПроцедуры
1 Ненавижу 1С
 
гуру
01.10.19
00:09
вместо:
КоличествоНоменклатурыВДок = ОстатокВПартии - КоличествоНоменклатурыВДок;

попробуйте:
КоличествоНоменклатурыВДок = КоличествоНоменклатурыВДок - КоличествоТоваров;
2 assasu
 
01.10.19
04:30
зачем это "МАКСИМУМ(РасходнаяТовары.НомерСтроки) КАК НомерСтроки"  ?
я просто для самообразования спрашиваю
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой