Имя: Пароль:
1C
1C 7.7
v7: Прямой запрос во внешнюю базу.
0 Heaz3
 
17.07.18
13:35
Ситуация такая: есть самописная сервисная конфигурация, осуществляющая перемещение данных через ОЛЕ из типовой конфы в текстовый файл для конфы руководителей подразделений. Собираюсь ускорить процесс выгрузки данных из типовой, посредством добавления прямых запросов. База DBF. Использую следующий код:

ОлеДБ = СоздатьОбъект("OLEDBData");
а="ПУТЬ_К_ВНЕШНЕЙ_БАЗЕ\";
б="Provider=VFPOLEDB.1;Data Source= ""ПУТЬ_К_ВНЕШНЕЙ_БАЗЕ\""; User ID=""АДМИН""; Password=""ПАРОЛЬ_АДМИНА"";Mode=Read;Collating Sequence=MACHINE";
ОлеДБ.ПрисоединитьИБ(а,б);

Запрос = ОлеДБ.СоздатьКоманду();
Запрос.Выполнить("EXECSCRIPT('SET ANSI OFF')");
Запрос.Выполнить("EXECSCRIPT('SET REPROCESS TO 60 SECONDS')");
Запрос.Выполнить("EXECSCRIPT('SET REFRESH TO 0,-1')");
Запрос.Выполнить("Exec('SET TABLEVALIDATE TO 0')");
НачДата='01.01.2018';
КонДата=Дат;

мд = СоздатьОбъект("MetaDataWork");
НачПериод = мд.ПолучитьНачПериода(НачДата);
ПредПериод = мд.ПолучитьНачПериода(НачПериод-1);
КонПериод = мд.ПолучитьКонПериода(КонДата);

ТекстЗапроса = "
    |SELECT
    |        Рег.БСО as Бланк
    |     ,Рег.Номер as Номер
    |     ,Рег.МестоХранения as [МестоХранения $Спраочник.МестаХранения]
    |     ,Рег.Материал as [Материал $Справочник.Материалы]
    |     ,Рег.Справочник as [Справочник $Справочник.ТипыБланков]
    |       ,SUM(Рег.НачОст+Рег.Приход-Рег.Расход) КонОст
    |FROM
    |    (
    |   SELECT
    |         $Итоги.БСО БСО
    |        ,$Итоги.Номер Номер
    |     ,$Итоги.МестоХранения МестоХранения
    |        ,$Итоги.Материал Материал
    |     ,$Итоги.Справочник Справочник
    |       ,$Итоги.Наличие НачОст
    |        ,0 Приход
    |        ,0 Расход
    |         ,0
    |    FROM
    |        $РегистрИтоги.БСО Итоги
    |    WHERE
    |        DTOS(Итоги.period)+$Итоги.БСО
    |        LIKE  (DTOS(:ПредПериод~~)+'_________')
    |   UNION ALL  
    |
    |    SELECT
    |         $Движения.БСО
    |     ,$Движения.Номер
    |     ,$Движения.МестоХранения
    |        ,$Движения.Материал
    |     ,$Движения.Справочник
    |     ,$Движения.Наличие * (1 - Движения.debkred * 2)
    |        ,0
    |        ,0
    |     ,0
    |    FROM
    |        $Регистр.БСО  Движения
    |    WHERE
    |        DTOS(Движения.date)+Движения.time+Движения.iddoc+STR(Движения.lineno,4)+STR(Движения.actno,6) BETWEEN
    |         DTOS(:НачПериод~~)+'    '+'       '+'    '+'    '
    |     And DTOS(:КонПериод~~)+'ZZZZZZ'+'ZZZZZZZZZ'+'ZZZZ'+'ZZZZZZ'
    |
    |    UNION ALL
    |    
    |    SELECT
    |         $Оборот.БСО
    |     ,$Оборот.Номер
    |     ,$Оборот.МестоХранения
    |        ,$Оборот.Материал
    |     ,$Оборот.Справочник
    |        ,0
    |        ,$Оборот.Наличие*(1-Оборот.Debkred)
    |        ,$Оборот.Наличие*Оборот.Debkred
    |     ,0
    |    FROM
    |        $Регистр.БСО  Оборот
    |    WHERE
    |        DTOS(Оборот.date)+Оборот.time+Оборот.iddoc+STR(Оборот.lineno,4)+STR(Оборот.actno,6) BETWEEN
    |         DTOS(:НачДата~~)+'    '+'       '+'    '+'    '
    |     And DTOS(:КонДата~~)+'ZZZZZZ'+'ZZZZZZZZZ'+'ZZZZ'+'ZZZZZZ'
    |    ) Рег
    |WHERE
    |    Рег.НачОст+Рег.Приход-Рег.Расход=1
    |Group by Бланк,Номер,МестоХранения,Материал,Справочник
    |";

Запрос.УстановитьТекстовыйПараметр("ПредПериод",ПредПериод);
Запрос.УстановитьТекстовыйПараметр("НачПериод",НачПериод);
Запрос.УстановитьТекстовыйПараметр("КонПериод",НачДата-1);
Запрос.УстановитьТекстовыйПараметр("НачДата",НачДата);
Запрос.УстановитьТекстовыйПараметр("КонДата",КонДата);

ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
ТЗ.Выгрузить(Таблица1);

Колонки БСО, Номер и Наличие в регистре у меня текст-символы, там все хорошо выдает, проблемы начинаются с объектами Материал, Справочник, МестоХранения. Я так понимаю когда я обращаюсь к $Итоги.Материал как Материал, я получаю ссылку в виде строки, а если я обращусь к $Итоги.Материал как [Материал, $Справочник.Материалы] то мне должно вернуть элемент справочника. Когда я делал запрос из типовой конфы в ее же остатки, все выдавало верно. Но когда я начинаю подключатся из сервисной, то я получаю пустую строку. Суть вопроса: как мне сделать так, что бы мне хотя бы выдавало код или название справочников, или подключить метаданные из той базы. Есть ли альтернативы "ПрисоеденитьИБ" VFPOLEDB для DBF.
1 АНДР
 
17.07.18
16:10
2 fedoss
 
17.07.18
16:16
А в чем проблема сджоинить эту таблицу с нужными справочниками и взять оттуда любые реквизиты?
3 Salimbek
 
17.07.18
19:50
(1) 1SQLite работает только из "своей" базы.
(0) У тебя не Элемент справочника возвращается, а его Id. Просто когда пишешь [Материал, $Справочник.Материалы] - 1С++ понимает, что ты на самом деле хочешь тут получить элемент этого справочника, и сам из ID получает элемент. Таким образом, если у тебя есть Id и тебе надо получить, например, Код, то делаешь, как и советовал (2):

select Материалы.Code as КодМатериала, ... From $РегистрИтоги.БСО Итоги
left join $Справочник.Материалы Материалы on $Итоги.Материал=Материалы.ID
4 Heaz3
 
18.07.18
08:10
(2) , (3) Спасибо, изначально ход мыслей пошел не в ту степь, теперь все работает.