Задача демонстрирующая новый метод списания в документе расходная накладная и алгоритм контроля отрицательных остатков.
При использовании данной методики контроля отрицательных остатков алгоритм можно разделить на 2 шага :
1. Формирование и запись движений
2. Получение и проверка остатков из регистра после записи движений. При появлении отрицательных остатков документ не проводится.
Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа - «Расходная накладная». Помимо продажи товара, могут оказываться дополнительные услуги, например по доставке. И услуги и товары указываются в одной табличной части.При нехватке товара необходимо выдавать соответствующее предупреждение с указанием количества нехватки и не позволять проводить документ
Задача 1.01
// *********** Вариант 1
Процедура ОбработкаПроведения(Отказ, РежимПроведения) // регистр ОстаткиНоменклатуры Расход Движения.ОстаткиНоменклатуры.Записывать = Истина; Для Каждого ТекСтрокаСписокНоменклатуры Из СписокНоменклатуры Цикл Движение = Движения.ОстаткиНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Склад = Склад; Движение.Номенклатура = ТекСтрокаСписокНоменклатуры.Номенклатура; Движение.Количество = ТекСтрокаСписокНоменклатуры.Количество; КонецЦикла; Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения=Истина; Движения.Записать() ; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОстаткиНоменклатурыОстатки.Склад, | ОстаткиНоменклатурыОстатки.Номенклатура, | ОстаткиНоменклатурыОстатки.КоличествоОстаток, | ОстаткиНоменклатурыОстатки.Номенклатура.Представление |ИЗ | РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &Граница, | Номенклатура В (&СписокТоваров) | И Склад = &Склад) КАК ОстаткиНоменклатурыОстатки |ГДЕ | ОстаткиНоменклатурыОстатки.КоличествоОстаток < 0"; Запрос.УстановитьПараметр("Граница", новый Граница(МоментВремени())); Запрос.УстановитьПараметр("СписокТоваров",
СписокНоменклатуры.ВыгрузитьКолонку("Номенклатура")); Запрос.УстановитьПараметр("Склад",Склад ); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "По номенклатуре "+ВыборкаДетальныеЗаписи.НоменклатураПредставление+ " не хватает товара. Перерасход: "+-ВыборкаДетальныеЗаписи.КоличествоОстаток; //Сообщение.Поле = ""; //Сообщение.УстановитьДанные(); Сообщение.Сообщить(); отказ=Истина; КонецЦикла; КонецПроцедуры
// *********** Вариант 2 Процедура ОбработкаПроведения(Отказ, Режим) Движения.ОстаткиНоменклатуры.Записывать = Истина; Запрос = Новый Запрос ; Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц ; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | &Период КАК Период, | &ВидДвижения КАК ВидДвижения |ПОМЕСТИТЬ ВТ_СписокНом |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ_СписокНом.Номенклатура КАК Номенклатура, | ВТ_СписокНом.Количество КАК Количество, | ВТ_СписокНом.Период КАК Период, | ВТ_СписокНом.ВидДвижения КАК ВидДвижения |ИЗ | ВТ_СписокНом КАК ВТ_СписокНом"; Запрос.УстановитьПараметр("ВидДвижения", ВидДвиженияНакопления.Расход); Запрос.УстановитьПараметр("Период", Дата); Запрос.УстановитьПараметр("Ссылка", Ссылка); РезультатЗапроса = Запрос.Выполнить(); Движения.ОстаткиНоменклатуры.Выгрузить(РезультатЗапроса.Выгрузить()); Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения=Истина; движения.Записать(); Запрос.Текст = "ВЫБРАТЬ | ОстаткиНоменклатурыОстатки.Номенклатура КАК Номенклатура, | ОстаткиНоменклатурыОстатки.Номенклатура.Представление КАК НоменклатураПредставление, | ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК КоличествоОстаток |ИЗ | РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &ДатаОстатков, | Номенклатура В | (ВЫБРАТЬ | ВТ_СписокНом.Номенклатура КАК Номенклатура | ИЗ | ВТ_СписокНом КАК ВТ_СписокНом)) КАК ОстаткиНоменклатурыОстатки |ГДЕ | ОстаткиНоменклатурыОстатки.КоличествоОстаток < 0"; Запрос.УстановитьПараметр("ДатаОстатков",Новый Граница(моментвремени(),ВидГраницы.Включая)); РезультатЗапроса = Запрос.Выполнить(); если НЕ результатЗапроса.Пустой() тогда Отказ=истина; выборка= РезультатЗапроса.Выбрать(); пока Выборка.Следующий() цикл Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Нехватает товара " + Выборка.Представление + " " + (-выборка.КоличествоОстаток); Сообщение.Сообщить(); КонецЦикла; КонецЕсли; если отказ тогда возврат конецесли; КонецПроцедуры
Комментариев нет:
Отправить комментарий