таким же образом (казалось бы!) можно получить и Начальный остаток... и Приход/ Расход
но тут есть свои подводные камни...
1-ый далеко НЕ во всех конфигурациях есть РегистрСведений.РегламентированныйПроизводственныйКалендарь
"легко" заменяем на Таблицу Значений... не забывая определить тип поля и правильно посчитав число нужных дней!
2-ой Совсем не такие условия нужны для Начального остатка... помучаться придётся... чтоб ещё 2-ое условие добавить
3-ий остатки и движения по Товарам на складах (о ужас!) не всегда совпадают с движениями по Партиям товаров на складах, а нам, например, надо сравнивать эти движения с Продажами и Поступлениями!
(при ордерной схеме, как "обычно" и бывает у многих, Закупка и Продажи НЕ совпадают с движением по складу!)
4-ый подводный камень - отрицательный расход - это приход! (как в Бухгалтерии) и так же отрицательный приход - это расход! так надо показывать для Бухгалтерии или в выгрузках для поставщиков...
5-ый подводный камень - отрицательные остатки... их надо исключать...
и записи с нулевыми остатками и движениями 0 0 0 0 записями тоже!
Итоговая функция (рабочая) - получается вот такая (кто с таким столкнётся - оценит)
кто не хочет партии - легко заменить в выборке - ПартииТоваровНаСкладах >> ТоварыНаСкладах
кто не хочет параметр (СтруктураПараметров)
- легко заменить на 3 параметра ( ДатаНач , ДатаКон, Поставщик )
только не забудьте ДатаКон = должна быть на КонецДня()
Функция ПолучитьОстаткиИДвиженияПоДням( СтруктураПараметров )
ТЗ = Неопределено;
сутки = 86400;
ДатаНач = НачалоДня(СтруктураПараметров.ДатаНач);
ДатаКон = КонецДня(СтруктураПараметров.ДатаКон);
Поставщик = СтруктураПараметров.Поставщик; //отбор товаров по Поставщику/Бренду !
N = ( ДатаКон+1 - ДатаНач )/сутки; //число суток
табл = новый ТаблицаЗначений;
КД = Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя);
ОписаниеТиповДата = Новый ОписаниеТипов("Дата", , , КД);
табл.Колонки.Добавить("ДатаКалендаря", ОписаниеТиповДата );
для i=0 по N-1 цикл
стр1 = табл.Добавить();
стр1.ДатаКалендаря = ДатаНач + i*сутки;
КонецЦикла;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ДатаНач", ДатаНач);
Запрос.УстановитьПараметр("ДатаКон", ДатаКон);
Запрос.УстановитьПараметр("Поставщик", Поставщик);
Запрос.УстановитьПараметр("табл", табл);
Запрос.Текст = "ВЫБРАТЬ
| табл.ДатаКалендаря
|ПОМЕСТИТЬ Дни
|ИЗ
| &табл КАК табл
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Движения.Номенклатура,
| Движения.Номенклатура.Код КАК НоменклатураКод,
| ДНИ.ДатаКалендаря КАК ДатаКалендаря,
| СУММА(ВЫБОР
| КОГДА ДНИ.ДатаКалендаря = &ДатаНач
| ТОГДА ЕстьNull(Движения.КоличествоНачальныйОстаток,0)
| Иначе Выбор когда Движения.Период = &ДатаНач
| ТОГДА Движения.КоличествоКонечныйОстаток
| когда Движения.Период < ДНИ.ДатаКалендаря
| ТОГДА Движения.КоличествоОборот
| ИНАЧЕ 0 Конец
| КОНЕЦ) КАК КоличествоНачальныйОстаток,
| СУММА(ВЫБОР
| КОГДА Движения.Период = ДНИ.ДатаКалендаря
| ТОГДА выбор когда Движения.КоличествоПриход>0 тогда Движения.КоличествоПриход иначе 0 конец
| + выбор когда Движения.КоличествоРасход<0 тогда -Движения.КоличествоРасход иначе 0 конец
| ИНАЧЕ 0
| КОНЕЦ) КАК КоличествоПриход,
| СУММА(ВЫБОР
| КОГДА Движения.Период = ДНИ.ДатаКалендаря
| ТОГДА выбор когда Движения.КоличествоПриход<0 тогда -Движения.КоличествоПриход иначе 0 конец
| + выбор когда Движения.КоличествоРасход>0 тогда Движения.КоличествоРасход иначе 0 конец
| ИНАЧЕ 0
| КОНЕЦ) КАК КоличествоРасход,
| СУММА(ВЫБОР
| КОГДА Движения.Период = &ДатаНач
| ТОГДА ЕстьNull(Движения.КоличествоКонечныйОстаток,0)
| Иначе выбор КОГДА Движения.Период <= ДНИ.ДатаКалендаря
| ТОГДА Движения.КоличествоОборот
| ИНАЧЕ 0 Конец
| КОНЕЦ) КАК КоличествоКонечныйОстаток
|ПОМЕСТИТЬ ВТ_ДвиженияТов
|ИЗ
| Дни КАК ДНИ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты(
| &ДатаНач,
| &ДатаКон,
| День,
| ,
| Номенклатура.Поставщик = &Поставщик ) КАК Движения
| ПО ДНИ.ДатаКалендаря >= Движения.Период
|
|СГРУППИРОВАТЬ ПО
| Движения.Номенклатура,
| Движения.Номенклатура.Код,
| ДНИ.ДатаКалендаря" ;
ТЗ = Запрос.Выполнить().Выгрузить();
Возврат ТЗ;
КонецФункции
Показать