Имя: Пароль:
1C
1C 7.7
v7: Прямой запрос к регистру с подвохом
0 zenon46
 
05.02.20
09:50
Доброго дня!
Есть прямой запрос, который по переданному списку номенклатуры, находит последний документ прихода...вот только выяснилось что документы надо еще отсеивать по контрагентам из определенной папки, т.е. если последний приход в котором контрагент из "запретной" папки, то нужно найти что был до него, сейчас имею вот такой запрос, по логике нужно соединиться со справочником контрагентов и добавить условие, но как сделать пока не сообразил :

    |select
    |temp.val,
    |Спр.Code AS Код,    
    |subsel.Номенклатура AS [Номенклатура $Справочник.Номенклатура],
    |subsel.ДатаПослПрихода
    |from #TempTable
    |temp left join
    |(
    |SELECT
    |    $Рег.Номенклатура AS [Номенклатура],
    |    CAST(LEFT(MAX(Рег.Date_Time_IDDOC),8) AS datetime) AS ДатаПослПрихода
    |FROM
    |    $Регистр.ПартииНаличие as Рег
    |INNER JOIN
    |    _1Sjourn as ЖурналДок ON ЖурналДок.IDDoc = Рег.IDDoc    
    |LEFT JOIN
    |    $Справочник.Номенклатура AS Спр ON Спр.ID = $Рег.Номенклатура
    |WHERE
    |   ЖурналДок.iddocdef = $ВидДокумента.ПоступлениеТМЦ_Склад AND    
    |    $Рег.Номенклатура IN (SELECT val FROM #TempTable) AND
    |    $Рег.Фирма = :ВбрФирма    
    |GROUP BY
    |    $Рег.Номенклатура
    |) subsel on temp.val = subsel.Номенклатура
    |LEFT JOIN
    |$Справочник.Номенклатура AS Спр ON Спр.ID = temp.val
1 ikea
 
05.02.20
10:17
Создаете временную таблицу, куда помещаете "запрещенные контрагентов".
INNER JOIN по постащику к  $Регистр.ПартииНаличие


А потом в условии $Рег.Поставщик NOT IN(SELECT val FROM #ЗапрещенныеКонтрагенты)
2 zenon46
 
05.02.20
10:18
(1) отличная идея, спасибо!
3 zenon46
 
05.02.20
17:05
Продолжу темку, ибо развивается запрос, как избавиться от ошибки "Ошибка преобразования даты или времени из символьной строки." Дело в том что во временной таблицы у номенклатуры может и не быть прихода...потому нужно как то работать с пустым значением. Спасибо за подсказку. (Вроде как '17530101' - должна быть для 1С пустой датой)

    |SELECT
    |    temp.val,
    |    Спр.Code AS Код,    
    |    subsel.Номенклатура AS [Номенклатура $Справочник.Номенклатура],
    |   CAST(LEFT(Isnull(Рег.Date_Time_IDDOC,'17530101'),8) AS datetime) [ДатаПрих]
    |FROM
    |    #TempTable
    |    temp left join
    |(
    |SELECT
    |    $Рег.Номенклатура AS [Номенклатура],
    |    MAX(CAST(LEFT((Рег.Date_Time_IDDOC),8) AS datetime)) 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.Номенклатура
    |INNER JOIN
    |    $Справочник.Номенклатура AS Спр ON Спр.ID = temp.val     
    |LEFT JOIN
    |    $Регистр.ПартииНаличие AS Рег ON $Рег.Номенклатура = subsel.Номенклатура AND Рег.Date_time_iddoc=subsel.ДатаПослПрихода
4 olegves
 
05.02.20
20:18
(3) ну так isnull() и используй для своей даты
5 olegves
 
05.02.20
20:19
+(4) во внутреннем запросе
6 olegves
 
05.02.20
20:20
(5) а не посмотрел, что у тебя партии во внешнем, CAST применяй к '17530101'