Оперативный учет считается одним из самых простых для понимания. Решение задач постороено на работе с регистрами накопления.Главное при решении таких задач правильно спроектировать РН.
Данная задача очень простая для понимания и позволяет понять один из основопологающих принципов решения всех задач метод Списания партий. Реализуем механизм списания в док. «Расходная накладная»
Внимание Старый метод списания
Внимание Старый метод списания
Задача №1
СОЗДАЙТЕ ПУСТУЮ ИНФОРМАЦИОННУЮ БАЗУ. ЗАГРУЗИТЕ В НЕЕ КАРКАСНУЮ
КОНФИГУРАЦИЮ.
Компания занимается оптовой торговлей. Поступление товаров
отражается документом «Приходная накладная», продажа - «Расходная накладная».
Помимо продажи товара, могут оказываться дополнительные услуги, например по
доставке. И услуги и товары указываются в разных табличных частях.
Складской учет товаров не ведется.
Списание себестоимости товаров должно быть организовано по
партиям, в зависимости метода списания (FIFO или LIFO),
принятого в учетной политике. Значение учетной политики меняется не чаще одного
раза в год. Следует считать, что пользователь вручную самостоятельно корректно
будет устанавливать учетную политику на соответствующий период. При проведении
документа необходимо использовать метод, актуальный на момент проведения
документа.
Необходимо построить ведомость по партиям товаров за указанный
в отчете период.
Ведомость по партиям
товаров за период с 01.03.2010 по 31.03.2010
Номенклатура
|
Партия
|
Нач. ост.
|
Приход
|
Расход
|
Кон. ост.
|
Кефир
|
|||||
Прих.
Накладная №10
|
10
1 000,00
|
6
600,00
|
4
400,00
|
||
Прих.
Накладная №12
|
8
880,00
|
8
880,00
|
|||
Молоко
|
|||||
Прих.
Накладная №8
|
5
100,00
|
5
100,00
|
|||
Прих.
Накладная №9
|
2
30,00
|
1
15,00
|
1
15,00
|
||
Прих.
Накладная №10
|
2
32,00
|
2
32,00
|
Отчет может быть построен за любой расчетный период, границы
которого должны задаваться пользователем напрямую в форме отчета. В печатной
форме заголовок и шапка отчета должны соответствовать заданию.
Процедура ОбработкаПроведения(Отказ, Режим) методСписания=РегистрыСведений.МетодСписанияТоваров.ПолучитьПоследнее(Дата).МетодСписания; если методСписания.пустая() тогда отказ=истина; Конецесли; запрос =Новый Запрос(); запрос.УстановитьПараметр("Ссылка",Ссылка); запрос.УстановитьПараметр("МоментВремени",МоментВремени()); Запрос.Текст ="ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | РасходнаяНакладнаяСписокНоменклатуры.Количество КАК Количество |ПОМЕСТИТЬ ВТ |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ОстаткиНоменклатурыОстатки.Номенклатура КАК Номенклатура, | ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК КоличествоОстаток, | ОстаткиНоменклатурыОстатки.партия КАК партия, | ОстаткиНоменклатурыОстатки.СтоимостьОстаток КАК СтоимостьОстаток, | ВТ.Количество КАК Количество, | ОстаткиНоменклатурыОстатки.партия.МоментВремени КАК партияМоментВремени |ИЗ | ВТ КАК ВТ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | ВТ.Номенклатура | ИЗ | ВТ)) КАК ОстаткиНоменклатурыОстатки | ПО ВТ.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | партияМоментВремени ВОЗР |ИТОГИ | СУММА(КоличествоОстаток), | СУММА(СтоимостьОстаток), | МАКСИМУМ(Количество) |ПО | Номенклатура"; Движения.ОстаткиНоменклатуры.Записывать = Истина; если методСписания=Перечисления.УчетнаяПолитика.ФИФО тогда //ФИФО Результат=Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); Пока Результат.Следующий() Цикл Если Результат.КоличествоОстаток>=Результат.Количество Тогда осталосьСписать=Результат.Количество; РезультатПопартиям=Результат.выбрать(); пока РезультатПопартиям.Следующий() и осталосьСписать<>0 Цикл списать=Мин(РезультатПопартиям.КоличествоОстаток,осталосьСписать); Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = РезультатПопартиям.Номенклатура; Движение.партия = РезультатПопартиям.партия; Движение.Количество = списать; Движение.Стоимость = РезультатПопартиям.СтоимостьОстаток/РезультатПопартиям.КоличествоОстаток; осталосьСписать=осталосьСписать-списать; конеццикла; Иначе нехватка=-(Результат.КоличествоОстаток-Результат.Количество); Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = ( " Не хватает " +строка(нехватка)+" "+строка(Результат.Номенклатура)+" для списания " ); Сообщение.Сообщить(); отказ=Истина; КонецЕсли; КонецЦикла; //ЛИФО иначеЕсли методСписания=Перечисления.УчетнаяПолитика.Лифо тогда Запрос.Текст=СтрЗаменить(Запрос.Текст,"ВОЗР","УБЫВ"); Результат=Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); Пока Результат.Следующий() Цикл Если Результат.КоличествоОстаток>=Результат.Количество Тогда осталосьСписать=Результат.Количество; РезультатПопартиям=Результат.выбрать(); пока РезультатПопартиям.Следующий() и осталосьСписать<>0 Цикл списать=Мин(РезультатПопартиям.КоличествоОстаток,осталосьСписать); Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = РезультатПопартиям.Номенклатура; Движение.партия = РезультатПопартиям.партия; Движение.Количество = списать; Движение.Стоимость = РезультатПопартиям.СтоимостьОстаток/РезультатПопартиям.КоличествоОстаток; осталосьСписать=осталосьСписать-списать; конеццикла; Иначе нехватка=-(Результат.КоличествоОстаток-Результат.Количество); Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = ( " Не хватает " +строка(нехватка)+" "+строка(Результат.Номенклатура)+" для списания " ); Сообщение.Сообщить(); отказ=Истина; КонецЕсли; КонецЦикла; конецесли; КонецПроцедуры
Комментариев нет:
Отправить комментарий