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