Имя: Пароль:
1C
1C 7.7
v7: Получение подчиненных документов прямым запросом в 1С 7.7
,
0 НоваяВолна
 
20.07.18
07:33
Вообщем сам сабж
Написал вот такой запрос, но подчиненные документы он не подхватывает, хотя они точно есть, хотя бы в одном документе из тех на которых тестировал. Что-то запутался, не могу найти где ошибся. Помогите.

ТекстSQLЗапроса = "SELECT    
    |    ДокументДоговор.IDDOC                        [ДокументДоговор $Документ.Договор],
    |    ЖурналДокументов.DOCNO                        НомерДокумента,  
    |   ЖурналОснование.IDDOC                        [ДоговорОсн $Документ],  
    |   ЖурналОснование.IDDOCDEF                    ДоговорОсн_вид,
    |    ЖурналДокументов.DOCNO                        НомерДокумента,
    |    CONVERT(DateTime, LEFT(ЖурналДокументов.DATE_TIME_IDDOC, 8), 112) as ДатаДокумента,
    |    Case When $ДокументДоговор.фУстнаяДоговоренность = 1
    |        then 'Устно'    
    |     When  rtrim(ltrim(ЖурналДокументов.$ОбщийРеквизит.Основание))='0     0'
    |        then 'Договор'    
    |     else 'Доп.'
    |        end                                      ПредставлениеДокумента,    
    |    $ДокументДоговор.РегистрационныйНомер as    РегистрационныйНомер,
    |    $ДокументДоговор.Субъект                    [Организация $Справочник.СубъектыУчета],
    |    $ДокументДоговор.Контрагент                    [Контрагент $Справочник.Контрагенты],  
    |    Cast($ДокументДоговор.ДатаНачала as Datetime)                    ДатаНачала,
    |    Nullif($ДокументДоговор.ДатаКонца,'17530101')                    ДатаКонца,  
    |    Case When  $ДокументДоговор.Автопролонгация=0
    |        then 'нет'    
    |        else 'да'
    |        end                                      Автопролонгация,    
    |    $ДокументДоговор.ПроцентПредоплаты            ПроцентПредоплаты,
    |    $ДокументДоговор.КоличествоДнейОтсрочки        КоличествоДнейОтсрочки,
    |    case when $ДокументДоговор.фФакторинг = 1 then 'Ф' else $СпрПредметДоговора.Сокр end    Сокр,
    |    Nullif(Cast($ДокументДоговор.ОплатаДо as Datetime),'17530101')    ОплатаДо,                
    |    $ДокументДоговор.ОтветственноеЛицо            [ОтветственноеЛицо $Справочник.Сотрудники]
    |FROM
    |    $Документ.Договор as ДокументДоговор WITH (NOLOCK)
    |INNER JOIN
    |    _1SJOURN as ЖурналДокументов WITH (NOLOCK)
    |ON
    |    ДокументДоговор.IDDOC = ЖурналДокументов.IDDOC
    |        AND
    |    ЖурналДокументов.ISMARK = 0
    |LEFT JOIN $Справочник.Контрагенты as СправочникКонтрагенты WITH (NOLOCK) ON СправочникКонтрагенты.ID = :Контрагент    
    |LEFT JOIN _1sjourn ЖурналОснование (nolock)
    |    ON right(ЖурналДокументов.sp1351, 9) = ЖурналОснование.iddoc  
    |LEFT JOIN $Документ.Договор as ДоговорОсн WITH (NOLOCK)
    |    ON ДоговорОсн.IDDOC = ЖурналОснование.IDDOC  
    |LEFT JOIN $Справочник.ПредметДоговора as СпрПредметДоговора WITH (NOLOCK)
    |    ON СпрПредметДоговора.ID = $ДокументДоговор.ПредметДоговора
    |WHERE     $ДокументДоговор.ДатаНачала<=:ДатаДокум
    |        AND    ($ДокументДоговор.Контрагент = :Контрагент
    |        or $ДокументДоговор.Контрагент in (select СпрКонтрагентыФилиал.ID from $Справочник.Контрагенты СпрКонтрагентыФилиал WITH (NOLOCK)
    |             WHERE $СпрКонтрагентыФилиал.ИНН = $СправочникКонтрагенты.ИНН and $СправочникКонтрагенты.Филиал = 1))
    |        AND $СправочникКонтрагенты.ЗапретИспользования = 0
    |        AND ($ДокументДоговор.ДатаКонца  >=:ДатаДокум
    |            OR $ДокументДоговор.ДатаКонца = Cast('17530101' as Datetime)
    |            OR ($ДокументДоговор.ДатаКонца <:ДатаДокум and $ДокументДоговор.Автопролонгация=1))
    |        AND
    |        ((ЖурналДокументов.CLOSED&1 = 1) OR ((ЖурналДокументов.CLOSED&1 = 0) AND ($ДокументДоговор.Контрагент <> '') ) )    
    |ORDER BY
    |    ДатаДокумента, РегистрационныйНомер";
    
         
    
    ODBCRecordSet = СоздатьОбъект("ODBCRecordSet");
    ODBCRecordSet.УстановитьТекстовыйПараметр("Контрагент"                , Контрагент);
    ODBCRecordSet.УстановитьТекстовыйПараметр("ДатаДокум"                , КонДата);
    
    ТзРезультат = ODBCRecordSet.ВыполнитьИнструкцию(ТекстSQLЗапроса);
        
    ТзРезультат.ВыбратьСтроку();
1 Владимир1С
 
20.07.18
08:44
(0) отлаживал на тестовой базе ? Получалось всё хорошо? Значит  в рабочей другие параметры, которые используешь в условиях.
2 НоваяВолна
 
20.07.18
08:59
(1) У нас тестовая и рабочая совпадают. Но дело не в этом. Я и в тестовой базе простым перебором вижу подчиненные документы для документа Договоры конкретного контрагента. А вот запрос мой их не подтягивает.
3 Ёпрст
 
20.07.18
09:03
(0)
  |LEFT JOIN $Справочник.Контрагенты as СправочникКонтрагенты WITH (NOLOCK) ON СправочникКонтрагенты.ID = :Контрагент

зачетное соединение..
4 Ёпрст
 
20.07.18
09:04
+
нахрена так писать ?
ЖурналДокументов.sp1351
5 Ёпрст
 
20.07.18
09:05
+
$ДокументДоговор.Контрагент <> ''

это тоже п...ц

стравнивать надо с $ПустойИД
6 Ёпрст
 
20.07.18
09:07
ну и для поиска подчиненных документов нужна табличка _1scrdoc
7 НоваяВолна
 
20.07.18
09:11
(3) что-то не понял причем тут справочник Контрагенты и Чем не понравилось соединение по полю ЖурналДокументов.sp1351? Там по идее и хранятся ссылки на подчиненные документы
8 Ёпрст
 
20.07.18
09:13
(7) как бэ, весь запрос в топку.
Для начала, ознакомься с этим, что ле..

http://www.script-coding.com/v77tables.html
9 НоваяВолна
 
20.07.18
09:19
(8) сказать так может каждый. в топку... Сам то можешь лучше написать? Так помоги с выбором подчиненных, дай пример. Нечего цепляться  за справочники, когда речь идет о документах
10 Владимир1С
 
20.07.18
09:34
(9) С пошаговой методикой отладки надеюсь, знаком. Придётся применить эту методику. Наращивать по одному условию, по одному соединению.
11 НоваяВолна
 
20.07.18
09:37
(10) да так и пытаюсь, пока ничего не выходит. Сам то запрос выводит всё что мне нужно за исключением подчиненных документов
12 Эльниньо
 
20.07.18
09:41
(9) Да. Ёпрст вообще ничего не может и ничего не знает.
Всё 1С-сообщество в курсе. Этим он известен и за это его все уважают
13 Владимир1С
 
20.07.18
09:45
(11) Сделай отдельно запрос по подчинённым для одного дока, без условий, просто получить все подчинённые. ODBCRecordSet.УстановитьТекстовыйПараметр("главныйДокумент"                , докИЗполяФормы);
Чтобы разбираться было проще.
14 Ёпрст
 
20.07.18
09:51
15 Инсуран
 
20.07.18
09:55
Что то такое надо:
SELECT
Жур.IDDoc [Документ $Документ],
Жур.IDDocDef Документ_вид
FROM _1SCRDOC Отбор (NOLOCK)
INNER JOIN _1Sjourn Жур (NOLOCK)
ON Отбор.ChildID = Жур.IDDoc and Жур.IsMark = 0
WHERE Отбор. MDID = 0 AND Отбор.ParentVal = :Родитель*
ну и дальше убрать все лишнее
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.