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