14:45 Задача 1.4 Оперативный учет | |
списание товара в расходной не по средней будет .а согласно учетной политике 1) в Приходной код: Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр ОстаткиНоменклатуры Приход Движения.ОстаткиНоменклатуры.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Партия = Ссылка; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; Движение.Сумма = ТекСтрокаСписокНоменклатуры.Сумма; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры 2) В Расходной код: Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.Продажи.Записывать = Истина; //Получим данные по учетной политике ТекущаяПолитика = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).Значение; Если ТекущаяПолитика = Перечисления.УчетнаяПолитика.ЛИФО Тогда ПорядокПартий = "УБЫВ"; Иначе ПорядокПартий = "ВОЗР"; КонецЕсли; //Установим исключительную блокировку на те записи регистров, по которым осуществляется чтение, а потом - запись Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма, | РасходнаяНакладнаяСписокНоменклатуры.Партия |ПОМЕСТИТЬ СписокНоменклатуры |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.Партия |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | СписокНоменклатуры.Номенклатура КАК Номенклатура, | СписокНоменклатуры.Количество КАК Количество, | СписокНоменклатуры.Сумма КАК Сумма, | СписокНоменклатуры.Партия КАК ПартияДляСписания, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0) КАК СуммаОстаток, | ОстаткиНоменклатурыОстатки.Партия КАК ПартияОстаток |ИЗ | СписокНоменклатуры КАК СписокНоменклатуры | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | СписокНоменклатуры.Номенклатура | ИЗ | СписокНоменклатуры)) КАК ОстаткиНоменклатурыОстатки | ПО СписокНоменклатуры.Номенклатура.Ссылка = ОстаткиНоменклатурыОстатки.Номенклатура.Ссылка | |УПОРЯДОЧИТЬ ПО | ОстаткиНоменклатурыОстатки.Партия.МоментВремени " + ПорядокПартий + " |ИТОГИ | МАКСИМУМ(Количество), | МАКСИМУМ(Сумма), | МАКСИМУМ(ПартияДляСписания), | СУММА(КоличествоОстаток) |ПО | Номенклатура"; Запрос.УстановитьПараметр("Ссылка",Ссылка); Запрос.УстановитьПараметр("МоментВремени",МоментВремени()); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам ); Пока Выборка.Следующий() Цикл Если Выборка.Количество <= Выборка.КоличествоОстаток Тогда КоличествоДляСписания = Выборка.Количество; СуммаДляСписания = Выборка.Сумма; ВыборкаПоПартиям = Выборка.Выбрать(); //1.Сначала списываем по партии указанной в табличной части Если ВыборкаПоПартиям.НайтиСледующий(Выборка.ПартияДляСписания,"ПартияОстаток") Тогда СписатьПоПартии(Выборка.Номенклатура,КоличествоДляСписания,СуммаДляСписания, ВыборкаПоПартиям.ПартияОстаток,ВыборкаПоПартиям.КоличествоОстаток,ВыборкаПоПартиям.СуммаОстаток); КонецЕсли; //2.Списываем по оставшимся партиям ВыборкаПоПартиям.Сбросить(); Пока ВыборкаПоПартиям.Следующий() И КоличествоДляСписания Цикл Если Выборка.ПартияДляСписания<>ВыборкаПоПартиям.ПартияОстаток Тогда СписатьПоПартии(Выборка.Номенклатура,КоличествоДляСписания,СуммаДляСписания, ВыборкаПоПартиям.ПартияОстаток,ВыборкаПоПартиям.КоличествоОстаток,ВыборкаПоПартиям.СуммаОстаток); КонецЕсли; КонецЦикла; Иначе Сообщить("Товара " + Выборка.Номенклатура + " недостаточно, в наличии " + Выборка.КоличествоОстаток + ", необходимо " + Выборка.Количество + "."); Отказ = истина; КонецЕсли; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры Процедура СписатьПоПартии(Номенклатура,Количество,Сумма,Партия,КоличествоОстаток,СуммаОстаток) Если Количество<=КоличествоОстаток Тогда // Если количества в партии достаточно // регистр ОстаткиНоменклатуры Расход Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = Номенклатура; Движение.Партия = Партия; Движение.Количество = Количество; Движение.Сумма = Количество*СуммаОстаток/КоличествоОстаток; // регистр Продажи Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = Номенклатура; Движение.Количество = Количество; Движение.Себестоимость = Количество*СуммаОстаток/КоличествоОстаток; Движение.СуммаПродаж = Сумма; Сумма = 0; Количество = 0; Иначе // Если количества в партии меньше, чем необходимо // регистр ОстаткиНоменклатуры Расход Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = Номенклатура; Движение.Партия = Партия; Движение.Количество = КоличествоОстаток; Движение.Сумма = СуммаОстаток; // регистр Продажи Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = Номенклатура; Движение.Количество = КоличествоОстаток; Движение.Себестоимость = СуммаОстаток; Движение.СуммаПродаж = КоличествоОстаток*Сумма/Количество; Сумма = Сумма-КоличествоОстаток*Сумма/Количество; Количество = Количество-КоличествоОстаток; КонецЕсли; КонецПроцедуры Отчеты: Остатки также как в 1 .1 1. 2 1 .3 в Продажах: ВЫБРАТЬ ПродажиОбороты.Номенклатура, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СебестоимостьОборот КАК Себестоимость, ПродажиОбороты.СуммаПродажОборот КАК Продажа, ПродажиОбороты.СуммаПродажОборот - ПродажиОбороты.СебестоимостьОборот КАК Прибыль ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты | |
|
Всего комментариев: 0 | |