Вход | Регистрация

1С:Предприятие ::

Метки: 

v7: Прямой запрос во внешнюю базу.

Я
   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
   fedoss
 
2 - 17.07.18 - 16:16
А в чем проблема сджоинить эту таблицу с нужными справочниками и взять оттуда любые реквизиты?
   Salimbek
 
3 - 17.07.18 - 19:50
(1) 1SQLite работает только из "своей" базы.
(0) У тебя не Элемент справочника возвращается, а его Id. Просто когда пишешь [Материал, $Справочник.Материалы] - 1С++ понимает, что ты на самом деле хочешь тут получить элемент этого справочника, и сам из ID получает элемент. Таким образом, если у тебя есть Id и тебе надо получить, например, Код, то делаешь, как и советовал (2):

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


Список тем форума
Рекламное место пустует   Рекламное место пустует
Закон Брукера: Даже маленькая практика стоит большой теории.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует