Имя: Пароль:
1C
1C 7.7
v7: Не совпадают значения сумм через запрос и просмотрщик регистров
0 zenon46
 
07.02.20
17:13
Доброго вечера! Ситуация следующая, есть запрос к регистру ПартииНаличие, но в результатх выборки не совпадают суммы как в валюте бух учета так и управленческой, просмотрщик содержимого регистра показывает правильную сумму, в данном случае 100р это доп расходы сверху на поступление, а выборка из запроса показывает почему то просто сумму поступления...как такое вообще может быть ?
вот собственно о чем речь : https://prnt.sc/qyzgi8
вот текст запроса :
    |SELECT
    |    temp.val,
    |    Спр.Code AS Код,    
    |    subsel.Номенклатура AS [Номенклатура $Справочник.Номенклатура],
    |   Isnull(Рег.Date_Time_IDDOC,'-') [ДатаПрих],
    |    $Рег.СуммаРуб AS [СуммаРуб $Число],
    |    $Рег.Количество AS [Количество $Число],    
    |    ($Рег.СуммаРуб/$Рег.Количество) AS [Себестоимость $Число],
    |    $Рег.Партия AS [Партия $Справочник.Партии],
    |    CAST(LEFT(Рег.Date_Time_IDDoc, 8) as DateTime) as ДатаПослПрих,
    |   $Спр.МинОстаток AS [МинОстаток $Число],
    |   $Спр.КолЗаказа AS [КолЗаказа $Число],
    |    balance.Количество AS [Остаток $Число]
    |FROM
    |    #TempTable
    |    temp left join
    |(
    |SELECT
    |    $Рег.Номенклатура AS [Номенклатура],
    |    MAX(Рег.Date_Time_IDDOC) AS ДатаПослПрихода
    |FROM
    |    $Регистр.ПартииНаличие as Рег
    |INNER JOIN
    |    _1Sjourn as ЖурналДок ON ЖурналДок.IDDoc = Рег.IDDoc    
    |INNER JOIN
    |    $Справочник.Партии AS СпрП ON СпрП.ID = $Рег.Партия
    |INNER JOIN
    |    $Справочник.Контрагенты AS СпрК ON СпрК.ID = $СпрП.Поставщик
    |WHERE
    |   ЖурналДок.iddocdef = $ВидДокумента.ПоступлениеТМЦ_Склад AND    
    |    $Рег.Номенклатура IN (SELECT val FROM #TempTable) AND    
    |    $Рег.Фирма = :ВбрФирма AND    
    |    $СпрП.Поставщик NOT IN (SELECT val FROM #TableKontr)    
    |GROUP BY
    |    $Рег.Номенклатура
    |) subsel ON temp.val = subsel.Номенклатура
    |LEFT JOIN
    |(
    |SELECT
    |    Рег.Номенклатура AS [Номенклатура],    
    |    Рег.КоличествоОстаток AS Количество
    |FROM
    |    $РегистрОстатки.ОстаткиТМЦ(:ВыбДата~,,Фирма = :ВбрФирма AND Номенклатура IN (SELECT val FROM #TempTable),(Номенклатура),(Количество)) AS Рег
    |) balance ON temp.val = balance.Номенклатура
    |INNER JOIN
    |    $Справочник.Номенклатура AS Спр ON Спр.ID = temp.val     
    |LEFT JOIN
    |    $Регистр.ПартииНаличие AS Рег ON $Рег.Номенклатура = subsel.Номенклатура AND Рег.Date_time_iddoc=subsel.ДатаПослПрихода
1 vicof
 
07.02.20
17:20
Почисть семерочный кэш)))
2 GreyK
 
07.02.20
17:50
(0) Называть "запросом" приблуду, которая работает через "дописку", нельзя, пишите "прямой запрос".
3 Djelf
 
07.02.20
18:35
Исходя из того что в запросе

    |SELECT
    |    temp.val,
    |    Спр.Code AS Код,    
    |    subsel.Номенклатура AS [Номенклатура $Справочник.Номенклатура],
    |   Isnull(Рег.Date_Time_IDDOC,'-') [ДатаПрих],
    |    $Рег.СуммаРуб AS [СуммаРуб $Число],
    |    $Рег.Количество AS [Количество $Число],    
    |    ($Рег.СуммаРуб/$Рег.Количество) AS [Себестоимость $Число],
    |    $Рег.Партия AS [Партия $Справочник.Партии],
    |    CAST(LEFT(Рег.Date_Time_IDDoc, 8) as DateTime) as ДатаПослПрих,
    |   $Спр.МинОстаток AS [МинОстаток $Число],
    |   $Спр.КолЗаказа AS [КолЗаказа $Число],
    |    balance.Количество AS [Остаток $Число]

отсутствует поле СуммаУпр, ответить на этот вопрос весьма затруднительно.

Рискну предположить что из-за фильтров типа

WHERE
    |   ЖурналДок.iddocdef = $ВидДокумента.ПоступлениеТМЦ_Склад AND    

доп.расходы вообще не учтены в запросе.
4 zenon46
 
07.02.20
19:34
(3) так запись по регистру что я показал сделана именно этим видом документа + к нему на основании зацеплен документ доп.расходов
5 zenon46
 
07.02.20
19:35
(3) а как их еще учитывать если в записи регистра 6100 а никак не 6000 как выдает запрос...вот я и понять не могу откуда такие разночтения
6 zenon46
 
07.02.20
19:35
(2) а это какой запрос, "черный" ?
7 zenon46
 
07.02.20
19:38
(3) да если убираю фильтр по виду документа то получаю https://prnt.sc/qz1y76
8 zenon46
 
07.02.20
19:40
(3) кажется понял..а как теперь это реализовать? собственно за партию я должен учитывать только док вида "ПоступлениеТМЦ_Склад" + еще как то надо сделать по этой же партии доп.расходы если они есть.
9 Salimbek
 
07.02.20
20:04
(4) Вам указали не на "Вид документа", а на то, что кроме СуммаРуб, в вашем регистре, вероятно, есть СуммаУпр. И, чисто теоретически, эти суммы могут отличаться.
10 zenon46
 
07.02.20
20:07
(9) это я уже проверил, там все одинаково
11 Salimbek
 
07.02.20
20:14
(10) А, тогда хорошо. Доп. расходы - создаются же каким-то документом. Так что можно просто к имеющемуся запросу добавить UNION ALL и сделать выборку с такими же полями по этому, второму виду документов. Если же документы связаны между собой, то еще и найти их где-то в 1SCRCDOC .
12 zenon46
 
07.02.20
20:27
(11) Поступление_ДопРасходы таким документом создаются, я полагал что запись то в регистре одна будет Сумма поступления + сумма поступления доп.расходов, но при выборке запросом оказалось не так
13 Salimbek
 
08.02.20
20:44
(12) Ну дак, какие движения в каких документах прописал - так и будет писаться. Можно же было в Обработке проведения документа ПоступлениеТМЦ_Склад смотреть, есть ли связанный ДопРасходы и делать соответствующее движение по регистру. Например...
14 Злопчинский
 
08.02.20
22:37
(13) имхо нехорошо так делать.
15 Злопчинский
 
08.02.20
22:38
(12) с чего бы это одна запись. документы разные - записи регистра под каждый документ свои (если конечно, не извращаться как в 13)
16 zenon46
 
09.02.20
12:49
(15) да, уже понял, теперь надо к запросу "прилепить" выборку по этой партии документа доп_расходов.
17 Злопчинский
 
09.02.20
14:02
$ВидДокумента.ПоступлениеТМЦ_Склад имхо лучше заменить манипуляциями с Регистр.ПартииНаличие.КодОперации - он там сделан именно для того, чтобы различать варианты движений.
18 zenon46
 
09.02.20
16:45
(17) да только есть еще документ ПоступлениеТМЦ и вид операции у них одинаков.
19 Злопчинский
 
09.02.20
19:15
(18) а какая разница принципиальная? если они у тебя с одинаковым кодом операции - значит у них и суть одна.
в разница поступления и поступления_склад - если идейно?
20 zenon46
 
10.02.20
12:41
(19) да там есть свои особенности в организации бизнес-процессов, схема агента-принципала...именно исходя из этих самых бизнес процессов, отрабатывать нужно именно один вид документа.
Попытался соединить с ДопРасходами...в итоге получаю столько строк сколько по каждому товару было документов доп расходы...ни как нге получается собрать в одну строку...

SELECT
temp.val,
Спр.Code AS Код,
subsel.Номенклатура AS [Номенклатура $Справочник.Номенклатура],
Isnull(Рег.Date_Time_IDDOC,'-') [ДатаПрих],
$Рег.СуммаРуб AS [СуммаРуб $Число],
$Рег.Количество AS [Количество $Число],
($Рег.СуммаРуб/$Рег.Количество) AS [Себестоимость $Число],
$Рег.Партия AS [Партия $Справочник.Партии],
CAST(LEFT(Рег.Date_Time_IDDoc, 8) as DateTime) as ДатаПослПрих,
$Спр.МинОстаток AS [МинОстаток $Число],
$Спр.КолЗаказа AS [КолЗаказа $Число],
balance.Количество AS [Остаток $Число],
subsel_P.СуммаДР AS СД
FROM
#TempTable
temp left join

(
SELECT
$Рег.Номенклатура AS [Номенклатура],
MAX(Рег.Date_Time_IDDOC) AS ДатаПослПрихода
FROM
$Регистр.ПартииНаличие as Рег
INNER JOIN
_1Sjourn as ЖурналДок ON ЖурналДок.IDDoc = Рег.IDDoc
INNER JOIN
$Справочник.Партии AS СпрП ON СпрП.ID = $Рег.Партия
INNER JOIN
$Справочник.Контрагенты AS СпрК ON СпрК.ID = $СпрП.Поставщик
WHERE
ЖурналДок.iddocdef = $ВидДокумента.ПоступлениеТМЦ_Склад AND
$Рег.Номенклатура IN (SELECT val FROM #TempTable) AND
$Рег.Фирма = :ВбрФирма AND
$СпрП.Поставщик NOT IN (SELECT val FROM #TableKontr)
GROUP BY
$Рег.Номенклатура
) subsel ON temp.val = subsel.Номенклатура

LEFT JOIN
(
SELECT
MAX(РегП.Date_Time_IDDOC) AS ДатаПослПриходаДопРасх,
$РегП.СуммаРуб AS СуммаДР,
$РегП.Номенклатура AS [Номенклатура]
FROM
$Регистр.ПартииНаличие as РегП
INNER JOIN
$Справочник.Партии AS СпрП ON СпрП.ID = $РегП.Партия
WHERE
$РегП.Фирма = :ВбрФирма AND
$РегП.Количество = 0
GROUP BY
  $РегП.Номенклатура,$РегП.СуммаРуб
) subsel_P ON temp.val = subsel_P.Номенклатура

LEFT JOIN
(
SELECT
Рег.Номенклатура AS [Номенклатура],  
Рег.КоличествоОстаток AS Количество
FROM
$РегистрОстатки.ОстаткиТМЦ(:ВыбДата~,,Фирма = :ВбрФирма AND Номенклатура IN (SELECT val FROM #TempTable),(Номенклатура),(Количество)) AS Рег
) balance ON temp.val = balance.Номенклатура

INNER JOIN
$Справочник.Номенклатура AS Спр ON Спр.ID = temp.val  
LEFT JOIN
$Регистр.ПартииНаличие AS Рег ON $Рег.Номенклатура = subsel.Номенклатура AND Рег.Date_time_iddoc=subsel.ДатаПослПрихода
21 Salimbek
 
11.02.20
15:17
(20) Ну при Лефт Джойн, так и должно быть.
Тут лучше:
Выборка по ПоступлениеТМЦ_Склад

UNION ALL

Точно такая же Выборка по ДопРасходы