Имя: Пароль:
1C
1С v8
Проблема с запросом по остаткам
0 slafor
 
20.12.21
11:00
Есть запрос по партиям на складах (конфигурация - доработанная Розница, с добавленным партионным учетом - т.е. есть еще регистр ПартииНаСкладах с измерениями Номенклатура, Партия). Мне нужно получить приход за период поступлений (задается пользователем), за расход за период продаж (тоже задается пользователем), конечный остаток (на дату формирования отчета) - это все в разрезе партий, и начальные остатки - это уже по номенклатуре в целом. Первые идут "на ура", а вот с начальными остатками - просто беда.
Дело в том, что там поступления с февраля 2019 года. Когда я пишу отдельный запрос по остаткам на начало года, он мне, как и положено, выдает пустой результат. А когда включаю этот же запрос как временную таблицу и соединяю с таблицей приходов (она у меня основная, то есть я считаю номенклатуру именно из приходов, другая мне не нужна), у меня на начало года почему-то выдаются какие-то остатки, хотя их там в принципе не может быть.
Никак не могу разобраться, почему так.
В отличие от остальных временных таблиц, здесь соединение идет только по номенклатуре, без партий - то есть я должен увидет состояние по номенклатуре в целом.
Вот этот отчет:

ВЫБРАТЬ
    ПартииНаСкладахНачальныеОстатки.Номенклатура КАК Номенклатура,
    ПартииНаСкладахНачальныеОстатки.КоличествоОстаток КАК КоличествоОстаток,
    ПартииНаСкладахНачальныеОстатки.СуммаОстаток КАК СуммаОстаток
ПОМЕСТИТЬ втПартииНаСкладахНачальныеОстатки
ИЗ
    РегистрНакопления.ПартииНаСкладах.Остатки(&НачалоПериодаДоПрихода, ) КАК ПартииНаСкладахНачальныеОстатки
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПартииНаСкладахОстаткиИОборотыПриход.Номенклатура КАК Номенклатура,
    ПартииНаСкладахОстаткиИОборотыПриход.Партия КАК Партия,
    ПартииНаСкладахОстаткиИОборотыПриход.Партия.Контрагент КАК Поставщик,
    ПартииНаСкладахОстаткиИОборотыПриход.Партия.Дата КАК ДатаПрихода,
    ПартииНаСкладахОстаткиИОборотыПриход.КоличествоПриход КАК КоличествоПриход,
    ПартииНаСкладахОстаткиИОборотыПриход.СуммаПриход КАК СуммаПриход,
    ПартииНаСкладахОстаткиИОборотыПриход.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
    ПартииНаСкладахОстаткиИОборотыПриход.СуммаНачальныйОстаток КАК СуммаНачальныйОстаток
ПОМЕСТИТЬ втПартииНаСкладахОстаткиИОборотыПриход
ИЗ
    РегистрНакопления.ПартииНаСкладах.ОстаткиИОбороты(&НачалоПериодаПриход, &КонецПериодаПриход, , , ) КАК ПартииНаСкладахОстаткиИОборотыПриход
ГДЕ
    ПартииНаСкладахОстаткиИОборотыПриход.Партия.Дата МЕЖДУ &НачалоПериодаПриход И &КонецПериодаПриход
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПартииНаСкладахОстаткиИОборотыРасход.Номенклатура КАК Номенклатура,
    ПартииНаСкладахОстаткиИОборотыРасход.Партия КАК Партия,
    СУММА(ПартииНаСкладахОстаткиИОборотыРасход.КоличествоРасход) КАК КоличествоРасход,
    СУММА(ПартииНаСкладахОстаткиИОборотыРасход.СуммаРасход) КАК СуммаРасход
ПОМЕСТИТЬ втПартииНаСкладахОстаткиИОборотыРасход
ИЗ
    РегистрНакопления.ПартииНаСкладах.ОстаткиИОбороты(&НачалоПериодаРасход, &КонецПериодаРасход, , , ) КАК ПартииНаСкладахОстаткиИОборотыРасход

СГРУППИРОВАТЬ ПО
    ПартииНаСкладахОстаткиИОборотыРасход.Номенклатура,
    ПартииНаСкладахОстаткиИОборотыРасход.Партия
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПартииНаСкладахКонечныеОстатки.Номенклатура КАК Номенклатура,
    ПартииНаСкладахКонечныеОстатки.Партия КАК Партия,
    СУММА(ПартииНаСкладахКонечныеОстатки.КоличествоОстаток) КАК КоличествоОстаток,
    СУММА(ПартииНаСкладахКонечныеОстатки.СуммаОстаток) КАК СуммаОстаток
ПОМЕСТИТЬ втПартииНаСкладахКонечныеОстатки
ИЗ
    РегистрНакопления.ПартииНаСкладах.Остатки КАК ПартииНаСкладахКонечныеОстатки

СГРУППИРОВАТЬ ПО
    ПартииНаСкладахКонечныеОстатки.Номенклатура,
    ПартииНаСкладахКонечныеОстатки.Партия
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    втПартииНаСкладахОстаткиИОборотыПриход.Номенклатура КАК Номенклатура,
    втПартииНаСкладахОстаткиИОборотыПриход.Партия КАК Партия,
    втПартииНаСкладахОстаткиИОборотыПриход.Партия.Контрагент КАК Поставщик,
    втПартииНаСкладахОстаткиИОборотыПриход.Партия.Дата КАК ДатаПрихода,
    втПартииНаСкладахОстаткиИОборотыПриход.КоличествоПриход КАК КоличествоПриход,
    втПартииНаСкладахОстаткиИОборотыПриход.СуммаПриход КАК СуммаПриход,
    ВЫРАЗИТЬ(ЕСТЬNULL(втПартииНаСкладахОстаткиИОборотыРасход.КоличествоРасход, 0) КАК ЧИСЛО(15, 3)) КАК КоличествоРасход,
    втПартииНаСкладахОстаткиИОборотыРасход.СуммаРасход КАК СуммаРасход,
    втПартииНаСкладахКонечныеОстатки.КоличествоОстаток КАК КоличествоКонечныйОстаток,
    втПартииНаСкладахКонечныеОстатки.СуммаОстаток КАК СуммаКонечныйОстаток,
    втПартииНаСкладахНачальныеОстатки.КоличествоОстаток КАК КоличествоНачальныйОстаток,
    втПартииНаСкладахНачальныеОстатки.СуммаОстаток КАК СуммаНачальныйОстаток
ИЗ
    втПартииНаСкладахОстаткиИОборотыПриход КАК втПартииНаСкладахОстаткиИОборотыПриход
        ЛЕВОЕ СОЕДИНЕНИЕ втПартииНаСкладахОстаткиИОборотыРасход КАК втПартииНаСкладахОстаткиИОборотыРасход
        ПО втПартииНаСкладахОстаткиИОборотыПриход.Номенклатура = втПартииНаСкладахОстаткиИОборотыРасход.Номенклатура
            И втПартииНаСкладахОстаткиИОборотыПриход.Партия = втПартииНаСкладахОстаткиИОборотыРасход.Партия
        ЛЕВОЕ СОЕДИНЕНИЕ втПартииНаСкладахНачальныеОстатки КАК втПартииНаСкладахНачальныеОстатки
        ПО втПартииНаСкладахОстаткиИОборотыПриход.Номенклатура = втПартииНаСкладахНачальныеОстатки.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ втПартииНаСкладахКонечныеОстатки КАК втПартииНаСкладахКонечныеОстатки
        ПО втПартииНаСкладахОстаткиИОборотыПриход.Номенклатура = втПартииНаСкладахКонечныеОстатки.Номенклатура
            И втПартииНаСкладахОстаткиИОборотыПриход.Партия = втПартииНаСкладахКонечныеОстатки.Партия
1 slafor
 
20.12.21
11:04
&НачалоПериодаДоПрихода - это на СКД параметр ДОБАВИТЬКДАТЕ(&ПериодПриход.ДатаНачала,"СЕКУНДА",-1). То есть это за секунду до первого прихода из периода, заданного пользователем.
2 slafor
 
20.12.21
11:09
То есть первая вт

ВЫБРАТЬ
    ПартииНаСкладахНачальныеОстатки.Номенклатура КАК Номенклатура,
    ПартииНаСкладахНачальныеОстатки.КоличествоОстаток КАК КоличествоОстаток,
    ПартииНаСкладахНачальныеОстатки.СуммаОстаток КАК СуммаОстаток
ПОМЕСТИТЬ втПартииНаСкладахНачальныеОстатки
ИЗ
    РегистрНакопления.ПартииНаСкладах.Остатки(&НачалоПериодаДоПрихода, ) КАК ПартииНаСкладахНачальныеОстатки

при отдельном запуске работает нормально - там вообще нули в итоге стоят. А при соединении с таблицей приходов - уже какие-то непонятные значения.
3 DrShad
 
20.12.21
11:49
я бы делал через объединение наборов данных
4 slafor
 
20.12.21
12:10
(3) А в чем разница? Я же все равно у одному РН обращаюсь, просто в случает с оборотами - к виртуальной таблице ОстаткиИОбороты, а в другом случае - к таблице остатков.
5 slafor
 
20.12.21
14:16
(3) Спасибо, сделал путем объединения наборов данных - помогло решить вопрос.

Но теперь другая небольшая проблема - дублируются количества и суммы начального остатка, то есть и по партиям, и в целом по номенклатуре показывается начальный остаток по номенклатуре. Как это можно обойти?

https://yadi.sk/i/41KSmL5YCAvQmQ .

То есть надо, чтобы показывал только по Номенклатуре (этих партий-то еще не было). Пробовал по настройке ресурсов - пока не помогло.

https://yadi.sk/i/blwDR29hk075cQ .
6 slafor
 
20.12.21
17:00
+(5) Я, кажется, понял: когда я получал остатки на начало периода в том же наборе данных, где у меня находится основной запрос по оборотам, то моя настройка https://yadi.sk/i/blwDR29hk075cQ работает, а когда они находятся в разных наборах - нет. Не знаете, как это можно сделать?

И попутно - похожий вопрос по конечным остаткам. Решил тоже перенести их в отдельный набор данных, потому что возможно есть остатки, по которым были приходы раньше выбранного периода поступлений. Можно ли в основном запросе как-то определить, была ли партия в выбранном периоде или нет?