• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Обусловленное Проведение

  • Автор темы Greml1N
  • Дата начала
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">
Код:
Процедура ОбработкаПроведения(Отказ, Режим)

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

//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

// регистр Остатки Расход
Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход();
//Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаПартий.Номенклатура;
Движение.Партия=ВыборкаПартий.Партия;
Движение.Количество =КоличествоСп;
Движение.Сумма =СебестоимостьСП;

Движение.Склад=Склад;


Если НадоСписать=0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;

КонецЕсли;
КонецЦикла;


КонецПроцедуры

Но он проверяет остатки не беря в расчёт склады. Т.е надо что бы он проверял нехватку на том складе,который указан в расходной.
Оприходование товара то же идёт по складам.
склад указан в качестве измерение в регистре накопления(Остатки номенклатуры)
Склад-реквизит документа расходная. Типа имеет ссылку на справочник Склады.
Вот так вот)
 
D

Darlock

Много лишнего кода привели. Во-первых: где вы проверяете склад? Правильно, нигде. Получая остатки запросом, необходимо итоги брать по складу, а не по номенклатуре. Во-вторых: выборку отсортировать по убыванию, по регистратору.
 
B

boris

В регистр ОстаткиНоменклатуры добавь измерение Склад и при списывании товара отбирай по этому значению. (При оприходовании заноси )))
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!