G
Greml1N
Всем доброго времени. Прошу помочь с такой вот вещью. Сделал обусловленное проведение(fifo),и списание по партиям Расходной накладной.Вот что вышло.
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Исходный код если кому-то интересно</div></div><div class="sp-body"><div class="sp-content">
Но он проверяет остатки не беря в расчёт склады. Т.е надо что бы он проверял нехватку на том складе,который указан в расходной.
Оприходование товара то же идёт по складам.
склад указан в качестве измерение в регистре накопления(Остатки номенклатуры)
Склад-реквизит документа расходная. Типа имеет ссылку на справочник Склады.
Вот так вот)
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Исходный код если кому-то интересно</div></div><div class="sp-body"><div class="sp-content">
Код:
Процедура ОбработкаПроведения(Отказ, Режим)
Запрос=Новый Запрос;
Запрос.Текст= " Выбрать
|ВложенныйЗапрос.Номенклатура Как Номенклатура, //Форумируем вложенный запрос
|Ост.Партия Как Партия,
|ЕстьNULL(Ост.КоличествоОстаток,0) Как КолОст, //КолОст представлание Количества остатка
|ЕстьNULL(Ост.СуммаОстаток,0) Как СуммаОст, //СуммаОст
|ВложенныйЗапрос.Количество Как КолДок,
|ВложенныйЗапрос.Сумма Как СуммаДок
|Из
|(Выбрать
|Док.Номенклатура Как Номенклатура,
|Сумма(Док.Количество) Как Количество,
|Сумма(Док.Сумма) Как Сумма
|Из
|Документ.Расходная.Товары как Док
|Где
|Док.Ссылка=&ПарСсылка
|Сгруппировать ПО
|Док.Номенклатура) Как ВложенныйЗапрос
|Левое Соединение
|РегистрНакопления.ОстаткиНоменклатуры.Остатки(
| &Момент,номенклатура в
|(Выбрать Различные Док.Номенклатура
|из
|Документ.Расходная.Товары Как Док
|Где
|Док.Ссылка=&ПарСсылка)) Как ост
|ПО ВложенныйЗапрос.Номенклатура = Ост.номенклатура
|Для Изменения
|РегистрНакопления.ОстаткиНоменклатуры.Остатки
|Упорядочить По
|Номенклатура,
|Ост.Партия.Дата
|Итоги
|Сумма(КолОст),
|Сумма(СуммаОст),
|Максимум(КолДок),
|Максимум(СуммаДок)
|По
|Номенклатура";
Запрос.УстановитьПараметр("ПарСсылка",Ссылка); //Указываем что интересует текущий док
Запрос.УстановитьПараметр("Момент",МоментВремени()); //На данные момент времени
Результат=Запрос.Выполнить();
ВыборкаТоваров=Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Номенклатура");
Пока ВыборкаТоваров.Следующий() Цикл
//Контроль нехватки
Нехватка=ВыборкаТоваров.КолДок-ВыборкаТоваров.КолОст; //Отнимаем от Количества заказзоного-Остаток Товара
Если Нехватка>0 Тогда // Условине Нехватки товара
Сообщить("Нехватка Товара"+ //Вывод сообщение
СокрЛП(ВыборкаТоваров.Номенклатура)+":"+Нехватка); //Удаляем пробелы вс троке,и указываем в сообщениее Нехватка какого товара,и количества.
Сообщить("Расходная Накладная"+Номер+"от"+Дата+"Не проводится!");
Отказ=Истина; //Блокировка проведения
КонецЕсли;
Если не отказ Тогда // Если товара хватает
// Списание партий
НадоСписать=ВыборкаТоваров.КолДок; //Переменной "Надо списать" присваем значение КоличестоваТовара Который надо продать
ВыборкаПартий=ВыборкаТоваров.Выбрать(); //"ВыборкеПартий" присваем значение текущего выбора в наличии.
Пока ВыборкаПартий.Следующий() Цикл
//Выичлсение себестоимости и количества списания
Если НадоСписать<ВыборкаПартий.КолОст Тогда //Если списуем меньше чем в данное партии есть,т.е часть партии.
//Списываем часть партии
КоличествоСп=НадоСписать;
СебестоимостьСП=ВыборкаПартий.СуммаОст/ВыборкаПартий.КолОст*КоличествоСП;
НадоСписать=0;
Иначе //Если в партии не хватает товара списать
//Списываем Всю партию
КоличествоСп=ВыборкаПартий.КолОст;
СебестоимостьСп=ВыборкаПартий.СуммаОст;
НадоСписать=Надосписать-ВыборкаПартий.КолОст;
КонецЕсли;
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
// регистр Остатки Расход
Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход();
//Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаПартий.Номенклатура;
Движение.Партия=ВыборкаПартий.Партия;
Движение.Количество =КоличествоСп;
Движение.Сумма =СебестоимостьСП;
Движение.Склад=Склад;
Если НадоСписать=0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Но он проверяет остатки не беря в расчёт склады. Т.е надо что бы он проверял нехватку на том складе,который указан в расходной.
Оприходование товара то же идёт по складам.
склад указан в качестве измерение в регистре накопления(Остатки номенклатуры)
Склад-реквизит документа расходная. Типа имеет ссылку на справочник Склады.
Вот так вот)