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