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