В начало

ОП «Списание по партиям»

            Есть документ «РасходнаяНакладная» и несколько регистров. Необходимо организовать списание товаров по партиям.

 

Листинг 1. Обработка проведения

Процедура ОбработкаПроведения (Отказ, Режим)

 

            ДвижениястаткиТоваров.Записывать = Истина;

            ДвижениястаткиПоСкладам.Записывать = Истина;

           

            Запрос = Новый Запрос;

            Запросекст =

                        "ВЫБРАТЬ

                        |           Номенклатура,

                        |           СУММА (Количество) КАК Количество,

                        |              МИНИМУМ (НомерСтроки) КАК НомерСтроки

                        |ПОМЕСТИТЬ ДокРасх

                        |ИЗ ДокументасходнаяНакладная.Товары

                        |ГДЕ Ссылка = &Ссылка И НЕ Номенклатураслуга

                        |СГРУППИРОВАТЬ ПО Номенклатура

                        |;

                        |ВЫБРАТЬ

                        |              ДокРасхомерСтроки,       

                        |           ДокРасхоменклатура,

                        |           ДокРасхоличество,

                        |           РегОстартия,

                        |           ЕСТЬNULL(РегОстоличествоОстаток,0) КАК КоличествоОстаток,

                        |           ЕСТЬNULL(РегОсттоимостьОстаток,0) КАК СтоимостьОстаток,

                        |           ЕСТЬNULL(РегСклоличествоОстаток,0) КАК ОстатокНаСкладе

                        |ИЗ ДокРасх КАК ДокРасх

                        |ЛЕВОЕ СОЕДИНЕНИЕ

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

                        |   ПО ДокРасхоменклатура = РегОст.Номенклатура

                        |   ЛЕВОЕ СОЕДИНЕНИЕ

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

                        |   ПО ДокРасхоменклатура = РегСкл.Номенклатура

                        |ИТОГИ

                        |   МИНИМУМ(Количество),

                        |   МИНИМУМ(ОстатокНаСкладе)

                        |   ПО ДокРасхоменклатура   ";

 

                       

            ЗапросстановитьПараметр ("Склад", Склад);

            ЗапросстановитьПараметр ("Ссылка", Ссылка);

            ЗапросстановитьПараметр ("МоментВремени", МоментВремени());

           

 

            Результат = Запросыполнить ();

 

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

 

            Пока Выборкаледующий() Цикл

                        Если Выборкаоличество > Выборка.ОстатокНаСкладе Тогда

                                   //***********************************

                                   //Указывание пользователю строки

                                   //с недостающим товаром

                                   //***********************************

                                   Сообщение = Новый СообщениеПользователю();

                                   Сообщениеекст = "Ругнуться что товара нет!";

                                   Сообщениеоле = "Товары["  + (Выборка.НомерСтроки - 1) + "].Количество";

                                   СообщениестановитьДанные(ЭтотОбъект);

                                   Сообщениеообщить();

                                   //***********************************

                                  

                                   Отказ = Истина;

                                   ДвижениястаткиТоваров.Записывать = Ложь;

                                   ДвижениястаткиПоСкладам.Записывать = Ложь;

                        КонецЕсли;     

            КонецЦикла;

           

            Если Отказ Тогда //Заглушка

                        Возврат;

            КонецЕсли;                             

           

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

           

            Пока Выборкаледующий() Цикл

            ОсталосьСписать = Выборкаоличество();

           

                        ВыборкаПартии = Выборкаыбрать();

                        Пока ВыборкаПартииледующий() И ОсталосьСписать>0 Цикл

                        Списать = МИН(ОсталосьСписать, ВыборкаПартииоличествоОстаток);

                        Себестоимость = Списать /

                                                          ВыборкаПартииоличествоОстаток * 

                                                          ВыборкаПартиитоимостьОстаток;

                       

                        //Регистр накопления ОстаткиТоваров

                        Движение = ДвижениястаткиТоваров.ДобавитьРасход();

                        Движениеериод = Дата;

                        Движениеоменклатура = Выборка.Номенклатура;

                        Движениеоличество = Списать;

                        Движениетоимость = Себестоимость;          

                        Движениеартия = ВыборкаПартии.Партия;

                       

                        ОсталосьСписать = ОсталосьСписать - Списать;

                        КонецЦикла;                                       

                                                            

            //Регистр накопления ОстаткиПоСкладам                                                       

            Движение = ДвижениястаткиПоСкладам.ДобавитьРасход();

            Движениеериод = Дата;

            Движениеоменклатура = Выборка.Номенклатура;

            Движениеоличество = Выборка.Количество;

            Движениеклад = Склад;

            КонецЦикла;

           

КонецПроцедуры

 

Листинг 2. Реализация метода FIFO

           

            |УПОРЯДОЧИТЬ ПО Партияата ВОЗР

            |ИТОГИ

            |   МИНИМУМ(Количество),

            |   МИНИМУМ(ОстатокНаСкладе),

            |   МИНИМУМ(НомерСтроки)

            |   ПО ДокРасхоменклатура   ";

 

Листинг 3. Реализация метода LIFO

           

            |УПОРЯДОЧИТЬ ПО Партияата УБЫВ

            |ИТОГИ

            |   МИНИМУМ(Количество),

            |   МИНИМУМ(ОстатокНаСкладе),

            |   МИНИМУМ(НомерСтроки)

            |   ПО ДокРасхоменклатура   ";