Добрый вечер коллеги!
Есть запрос, который выдает последнюю дату расхода номенклатуры:
ВЫБРАТЬ
ТоварыНаСкладах.Склад КАК Склад,
ТоварыНаСкладах.Номенклатура КАК Номенклатура,
МАКСИМУМ(ТоварыНаСкладах.Период) КАК ДатаПоследнегоРасхода
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
ГДЕ
ТоварыНаСкладах.Период <= КОНЕЦПЕРИОДА(&Дата, ДЕНЬ)
И ТоварыНаСкладах.Склад В ИЕРАРХИИ(&Склад)
И ТоварыНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
СГРУППИРОВАТЬ ПО
ТоварыНаСкладах.Склад,
ТоварыНаСкладах.Номенклатура
Показать
А как получить конечный остаток после этого расхода?
(1) Есть же таблица ОстаткиИОбороты, там можно глянуть остаток на позицию регистратора, но надо знать начальный период (можно брать начало времен, но считаться долго будет), ее можно соединить с этим запросом
ВЫБРАТЬ
ТоварыНаСкладах.Склад,
ТоварыНаСкладах.Номенклатура,
МАКСИМУМ(ТоварыНаСкладах.Период) КАК ДатаПоследнегоРасхода,
ХозрасчетныйОстатки.Субконто1 КАК Субконто1,
ЕСТЬNULL(ХозрасчетныйОстатки.СуммаОстаток,0) КАК СуммаОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Остатки(, Счет.Код = "10.09", , ) КАК ХозрасчетныйОстатки
ПО (Субконто1 = ТоварыНаСкладах.Номенклатура)
ГДЕ
ТоварыНаСкладах.Период <= КОНЕЦПЕРИОДА(&Дата, ДЕНЬ)
И ТоварыНаСкладах.Склад В ИЕРАРХИИ(&Склад)
И ТоварыНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
СГРУППИРОВАТЬ ПО
ТоварыНаСкладах.Склад,
ТоварыНаСкладах.Номенклатура,
ХозрасчетныйОстатки.Субконто1,
ХозрасчетныйОстатки.СуммаОстаток
Если пользоваться только регистром "Товары на складах", то решение вроде бы логичное такое - вычислить разницу между суммарным оборотом прихода на дату последнего расхода и суммарным оборотом расхода. Вычислить суммарный оборот расхода не представляет сложности:
ВЫБРАТЬ
ТоварыНаСкладах.Склад КАК Склад,
ТоварыНаСкладах.Номенклатура КАК Номенклатура,
МАКСИМУМ(ТоварыНаСкладах.Период) КАК ДатаПоследнегоРасхода,
СУММА (ТоварыНаСкладах.КоличествоОборот) КАК РасходНаДатуПоследнегоРасхода
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
ГДЕ
ТоварыНаСкладах.Период <= КОНЕЦПЕРИОДА(&Дата, ДЕНЬ)
И ТоварыНаСкладах.Склад В ИЕРАРХИИ(&Склад)
И ТоварыНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
СГРУППИРОВАТЬ ПО
ТоварыНаСкладах.Склад,
ТоварыНаСкладах.Номенклатура
А вот как вычислить суммарный приход на дату последнего расхода, т.е. вместо параметра "Дата", передать "ДатаПоследнегоРасхода" для каждого товара, не понятно
Без соединения регистра Товары на складах с самим собой никак. Но на этом видимо и падает база.
Если нельзя но очень хочется - ваш выбор запросы в цикле.
На первом шаге получаете свою незаполненную таблицу номенклатуры
На втором шаге ВНЕ запроса делите её на блоки по 10-100-1000 номенклатурынх позиций и запускаете цикл по блокам.
На каждой итерации цикла запрос, который первым делом из всей таблицы движения товаров во временную таблицу собирает только движения выбранного списка позиций , индексирует и далее уже сильно меньшая таблица приходов перемножается с сильно уменьшенной таблицей расходов, выдавая результат для части товаров.
Остаётся склеить результат в постобработке
Как вариант пришло в голову:
Может попробовать воспользоваться изменённым методом получения остатков на каждую дату.
Описано тут: Остатки на каждый день
Но сначала выполнить ваш запрос, в котором выбрать минимальную и максимальную даты - как начало и конец периода, будет ограничение по номенклатуре (В) и складу(=).
А после запрос по остатком на каждую дату. При этом период не выбирать, периодичность запись.