Имя: Пароль:
1C
1C 7.7
v7: Получение периодического реквизита в прямом запросе
, , ,
0 pofigos
 
29.01.16
09:59
Доброе утро!

Встал в ступоре. Не понимаю, как решить задачу:
Есть запрос

ТекстЗапроса = "
        //ОтгрузкаТМЦ
        |SELECT Журнал.IDDOC [Документ $Документ]
        |    , Журнал.IDDOCDEF [Документ_вид $ВидДокументаПредставление]
        |    , $ОтгрузкаТМЦ.Клиент [Клиент $Справочник.Клиенты]
        |    , $ОтгрузкаТМЦСтроки.Товар  [Товар $Справочник.Товары]
        |    , $ОтгрузкаТМЦСтроки.Партия [Партия $Справочник.ПартииТоваров]
        |    , ("+Число(0)+") as ЦенаВал
        |    , SUM($ОтгрузкаТМЦСтроки.ВсегоСНДС) as СуммаСумма
        |    , ("+Число(0)+") as СуммаРыночная
        |    , SUM($ОтгрузкаТМЦСтроки.СуммаОтпускная) as СуммаСуммаБезНДС
        |    , ("+Число(0)+") as СуммаСуммаНДС
        |    , SUM($ОтгрузкаТМЦСтроки.Количество) as СуммаКол        
        |FROM _1SJOURN AS Журнал With (NOLOCK)
        |    LEFT JOIN $Документ.ОтгрузкаТМЦ AS ОтгрузкаТМЦ With (NOLOCK) ON Журнал.IDDOC = ОтгрузкаТМЦ.IDDOC
        |    LEFT JOIN $ДокументСтроки.ОтгрузкаТМЦ AS ОтгрузкаТМЦСтроки With (NOLOCK) ON Журнал.IDDOC = ОтгрузкаТМЦСтроки.IDDOC
        |    LEFT JOIN $Справочник.Товары AS спрТовары With (NOLOCK) ON спрТовары.ID = $ОтгрузкаТМЦСтроки.Товар
        |    LEFT JOIN $Справочник.Клиенты AS спрКлиенты With (NOLOCK) ON спрКлиенты.ID = $ОтгрузкаТМЦ.Клиент
        |    LEFT JOIN $Справочник.Склады AS спрСклады With (NOLOCK) ON спрСклады.ID = $ОтгрузкаТМЦ.Склад
        |
        |WHERE (Журнал.IDDOCDEF = $ВидДокумента.ОтгрузкаТМЦ)
        |    AND ((Журнал.CLOSED & 1) = 1)
        |    AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime)>=:НачДата)
        |    AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime)<=:КонДата)
        |    AND ($ОтгрузкаТМЦ.Склад NOT IN (SELECT val FROM #Склады))
        |    AND ($спрКлиенты.фИскл = 0)    
        |    AND (($спрТовары.ВидТоваров <> $Перечисление.ВидыТМЦ.Тара)
        |    OR ($спрТовары.ВидТоваров <> $Перечисление.ВидыТМЦ.Тара10)"+УсловиеПродукции+")
        |" +?(ВыбСклад.Выбран() = 1,"AND ($ОтгрузкаТМЦ.Склад IN (SELECT val FROM #СкладыВыбора))","")+"
        |" +?(ВыбКонтрагенты.РазмерСписка()>0,?(Искл=0,"AND ($ОтгрузкаТМЦ.Клиент IN (SELECT val FROM #ВыбКонтрагенты))","AND ($ОтгрузкаТМЦ.Клиент NOT IN (SELECT val FROM #ВыбКонтрагенты))"),"")+"
        |" +?(ВыбТМЦ.Выбран() = 1,"AND ($ОтгрузкаТМЦСтроки.Товар) IN (SELECT val FROM #ВыбТовар))","")+"
        |
        |GROUP BY Журнал.IDDOC
        |    , Журнал.IDDOCDEF    
        |    , $ОтгрузкаТМЦ.Клиент
        |    , $ОтгрузкаТМЦСтроки.Товар
        |    , $ОтгрузкаТМЦСтроки.Партия";


Так же есть запрос:

ТекстЗапроса2 ="
|select TOP(1)
        |                const.value
        |                from _1sconst const (nolock)
        |                where const.objid = :Валюта
        |                and const.id = $ИсторияРеквизита.Валюты.Курс
        |                and const.date <= :НачДата
        |                ORDER BY const.DATE DESC

По отдельности запросы отрабатывают.

Помогите, пожалуйста, сделать соединение. Необходимо получить значение периодического реквизита на дату документа из первого запроса.
Заранее спасибо.
1 Ёпрст
 
29.01.16
10:01
$ПоследнееЗначение
2 Ёпрст
 
29.01.16
10:02
это тоже зачетное условие:


($спрТовары.ВидТоваров <> $Перечисление.ВидыТМЦ.Тара)
   OR
3 Mikeware
 
29.01.16
10:03
(2) слушай, как по Перехватчику тебя спросить?
4 Ёпрст
 
29.01.16
10:04
(3) а че с ним ?
:)
5 Ёпрст
 
29.01.16
10:04
моги кинуть класс.. там всё просто как грабли :)
6 pofigos
 
29.01.16
10:05
(1) Последнее значение не понимаю куда прикрутить. По сути мне надо $ПоследнееЗначение.Валюты.Курс(Валюты.ID,Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime
7 pofigos
 
29.01.16
10:06
(2) С условием пока не занимался. Данные, самое интересное, выбирает корректные. Сейчас задача переписать отчет, который написан стандартным языком и строится около 30 минут за месяц.
8 Mikeware
 
29.01.16
10:06
(4) это не с ним. это со мной. туплю-с :-)
Не могу определить, какую форму открываю (нужно один журнал отловить, и формексовские события в нем.) Ну и есть опаска, что делаю не так
(5) кинь пример, плз. на мой ник на мэйл.ру
9 Ёпрст
 
29.01.16
10:13
(8)
https://cloud.mail.ru/public/CNvt/YFpgkgipQ

в глобальничке
Процедура ПриНачалеРаботыСистемы()
    
    ЗагрузитьВнешнююКомпоненту("1cpp.dll");    
    Настройки=СоздатьОбъект("УправлениеНастройками");
    Настройки.Сбросить("Проверка типов");
    Настройки.Сбросить("Отладка");
    //Настройки.Сбросить("Оптимизация");
    Настройки.Включить("Оптимизация");
    Настройки.Включить("TurboBL");
    Настройки.Включить("ПерехватитьСобытияГК");
    Перехватчик = СоздатьОбъект("Перехватчик");  
    ПерехватчикСобытийГМ = СоздатьОбъект("ПерехватСобытий");  
    Перехватчик.ПерехватитьСобытияГлобальногоМодуля(ПерехватчикСобытийГМ);
    ПерехватчикСобытийГМ.ПерехватитьПроведение(); //это, если перехватывать проведение
    //Перехватчик.ПодключитьСобытие_ЗаписьСобытияЖурналаРегистрации(); //это если нужно ЖР перехватывать
10 Ёпрст
 
29.01.16
10:14
+9 посмотришь там к коде класса, есть как определять тип формы  и т.д, т.е откуда идёт вызов.
Могу и рабочий класс с конфы посмотреть
11 Ёпрст
 
29.01.16
10:21
(7) ну сам подумай, как на условие неравенства можно ставить или. Там нужно и
12 pofigos
 
29.01.16
10:32
(11) Согласен.

А вот куда прикрутить выборку курса валюты на дату документа так и не могу дойти (
13 ЧеловекДуши
 
29.01.16
10:39
(0) Вот, что-что, а на SQL запросе это куда приятней лепить, чем на запросах от 1С 8.ххх :)
14 ЧеловекДуши
 
29.01.16
10:41
+(0)  Соединение не надо!!! Это не 8-ка.
Тут можно запрос в Поле лепить :)
15 Mikeware
 
29.01.16
10:44
(9) (10) спасибо. вроде так и делал. Но не работало.
Т.е.если я правильно понял, смысл в том, что объект класса перехватывает созданиеконтекста, и на каждый контекст создает еще экземпляр, который уже и перехватыает события этого контекста?
16 Ёпрст
 
29.01.16
10:46
(12) ну так и воткни в  селект последнее значение, валюту из дока, дату из журнала (туда можно и сам док пихать). усё.
17 Ёпрст
 
29.01.16
10:46
(15) ага
18 Ёпрст
 
29.01.16
10:47
Хотя Артур и утверждал, что нужно по двум классам разносить, события локального и глобального контекста, но я всегда лепил всё в одном классе - вроде "глюков" не замечал.
19 pofigos
 
29.01.16
10:51
Вопрос закрыт ) нашел ошибку и все взлетело.
Отдельное спасибо за (2)
20 Mikeware
 
29.01.16
11:04
(17) т.е. получается, что не экземпляр объекта ПерехватСобытий првязвывется к открытому контексту? а как он потом уничтожается?
21 Ёпрст
 
29.01.16
12:51
(20) дык закрыл объект , улетел объект
22 Mikeware
 
04.02.16
14:59
(21) а события OnDrop() у тебя ловятся?
23 Ёпрст
 
05.02.16
07:47
(22) ага
24 Ёпрст
 
05.02.16
07:48
Хотя, за активикс не скажу, надо посмотреть, давно в 7.7 не кодил
25 Mikeware
 
09.02.16
10:15
(24) глянь, пожалуйста.
Я так и не смог отловить... ни в ГМ, ни в твоем классе
Закон Брукера: Даже маленькая практика стоит большой теории.