Имя: Пароль:
1C
1C 7.7
v7: Получить кратность валюты прямым запросом
0 LisaAlisa
 
28.11.15
21:32
Подскажите, пжл, как составить прямой запрос, чтобы получить кратность валюты на опр. дату. Аналог Док.Валюта.Кратность.Получить(Док.ДатаДок)

select Валюты.CODE
'???' AS Кратность
from SC30 as Валюты
1 Отладчик
 
28.11.15
22:10
1с++ што ле? Хороший костыль к 77 был...
2 Горогуля
 
28.11.15
23:45
ну посмотри в dd
3 hhhh
 
28.11.15
23:52
(0) если нужно получить(), то это не справочнике Валюты, это совсем в другом месте. Может в константах.
4 Pers0naGrata
 
29.11.15
00:03
Пишу такой прямой запрос:

ТекстЗапроса = "
    |ВЫБРАТЬ
    |    $спрВалюты.Код КАК Код,
    |    ВЫРАЗИТЬ($ПоследнееЗначение.Валюты.Кратность(:ВыбВалюта,:ВыбДата) КАК ЧИСЛО(7,0)) КАК Кратность
    |ИЗ
    |    Справочник.Валюты КАК спрВалюты
    |ГДЕ
    |    $спрВалюты.ТекущийЭлемент = :ВыбВалюта    
    |";
    
ПрямойЗапрос=СоздатьОбъект("ПрямойЗапрос");
ПрямойЗапрос.Текст=ТекстЗапроса;
    
ПрямойЗапрос.УстановитьТекстовыйПараметр("ВыбВалюта",ВыбВалюта);
ПрямойЗапрос.УстановитьТекстовыйПараметр("ВыбДата",ТекущаяДата());

И он мне в режиме отладке выдает такое:

SELECT
    спрВалюты.CODE AS Код,
    CAST((SELECT const_vt.VALUE
FROM __1S_CONST const_vt
WHERE const_vt.ID = '   G'
AND const_vt.OBJID = '     1   '
AND const_vt.DATE < '20151128'
ORDER BY idx_ID_OBJID_DATE_TIME_DOCID_PARTNO DESC LIMIT 1) AS ЧИСЛО(7,0)) AS Кратность
FROM
    [Справочник.Валюты] AS спрВалюты
WHERE
    спрВалюты.ID = '     1   '

Дальше сама разберешься...
5 LisaAlisa
 
30.11.15
10:05
(4) спасибо! но не разобралась, ведь кратность это не константа...
6 cw014
 
30.11.15
10:11
(5) Это периодический реквизит, а оно в таблице const лежит
7 LisaAlisa
 
30.11.15
10:26
Я не могу понять, какие значения подставить в условия

WHERE const_vt.ID = '   G'
AND const_vt.OBJID = '     1   '

где посмотреть эти значения?
8 Franchiser
 
гуру
30.11.15
10:42
В mdeditor. Или скопировать md, сделать в не  периодический реквизит обычным и потом посмотреть в dd.
9 AMKahm
 
30.11.15
10:52
а просто написать $ПоследнееЗначение.Валюты.Кратность(:ВыбВалюта,:ВыбДата)
никак?

можно и так


    мд = СоздатьОбъект("MetaDataWork");
    рс = СоздатьОбъект("ODBCRecordset");    
    ТекстЗапроса = "
    |SELECT TOP(1) VALUE
    |FROM _1SCONST (nolock)
    |WHERE (OBJID=:Валюта) AND (ID = :Кратность) AND (DATE <= :ТекДата)
    |ORDER BY DATE DESC
    |";  
    рс.УстановитьТекстовыйПараметр("Валюта", Валюта);
    рс.УстановитьТекстовыйПараметр("ТекДата", ТекущаяДата());
    рс.УстановитьТекстовыйПараметр("Кратность",мд.ИДОбъекта(Метаданные.Справочник("Валюты").Реквизит("Кратность")));    
    Кратность = рс.ВыполнитьСкалярный(ТекстЗапроса);



или надо савсем прямой запрос, чтоб не из 1С выполнялся?
10 LisaAlisa
 
30.11.15
11:11
(9) да, чтоб не из 1С тоже
11 AMKahm
 
30.11.15
12:00
ну самое простое - выполни запрос из (9) в 1С
и например в профайлере/режиме отладки посмотри что там вместо :Валюта и :Кратность встало

ID там менятся не будет
OBJID - соединяй с таблицей Валют
например так

    |SELECT Валюты.DESCR as Валюта, Константы.VALUE as Кратность
    |FROM
    |    SC30 as Валюты
    |    OUTER APPLY (SELECT TOP(1) VALUE as Значение, DATE as Дата FROM _1SCONST (nolock) WHERE (OBJID=Валюты.ID) AND (ID = '  идКратности из профайлера') AND (Константы.DATE <= :ТекДата) ORDER BY DATE DESC) as Кратность
12 AMKahm
 
30.11.15
12:03
косячно скопипастил, но смысл понятен...