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