Имя: Пароль:
1C
1C 7.7
v7: подключение к 1с DBF базе через OLEDB foxpro (РЕШЕНО)
0 bigdenis22
 
11.07.25
12:11
пытаюсь подключится по сети к базе:
ПутьИБ = "\\192.168.60.10\ProdInKom$\";
    тПользователь = "Робот";
    тПароль = "робот";
    БД = СоздатьОбъект("OLEDBData");
      Соединение = "Provider=VFPOLEDB.1;Data Source=" + ПутьИБ +
             ";Mode=ReadWrite;Deleted=Yes;" +
             "Collating Sequence=RUSSIAN;" +
             "User ID=" + тПользователь +
             ";Password=" + тПароль;
    Рез = БД.Соединение(Соединение);
    
    БД.ПрисоединитьИБ(ПутьИБ, Соединение);
    Запрос = БД.СоздатьКоманду();

на строке БД.ПрисоединитьИБ(ПутьИБ, Соединение) - выдает ошибку:
{Обработка.РеестрОтгрузок.Форма.Модуль(136)}: FAILED! IDataInitialize::GetDataSource(): Произошли ошибки во время выполнения многошаговой операции OLE DB. По возможности, проверьте значения всех состояний OLE DB. Работа не выполнена.
пробовал как в букваре:
БД.ПрисоединитьИБ(ПутьИБ,  "Provider=VFPOLEDB.1;Deleted=Yes;Mode=ReadWrite;Collating Sequence=MACHINE;Data Source=%1");  - такая же ошибка.
что я не так делаю?

вообще, по ПрисоединитьИБ() для ДБФ информации как то не удалось найти, может кто-то поделится рабочими примерами?
ЗЫ: для SQL базы у меня подобная связка работает на-ура(естественно параметры отличаются)
1 СвинТуз
 
11.07.25
09:07
ДБФ = СоздатьОбъект("XBASE");
  ДБФ.КодоваяСтраница(0); // Windows
  ДБФ.ОткрытьФайл("c:\export.dbf");  
  Если ДБФ.Открыта()=0 Тогда
   Сообщить("Файл DBF не открыт !","!");
   Возврат;
  КонецЕсли;
  КолСтр  = ДБФ.КоличествоЗаписей();
  н= 0;
  ДБФ.Первая();
  ПризнакГруппы  = ДБФ.IsGroup;
  ТекУровень  = ДБФ.Level;
  ТекКодРодителя = ДБФ.ParentCode;
  ТекКод  = ДБФ.Code;
  ТекНаименоване = ДБФ.Descr;  
  н = н+1;
  Состояние("В файле прочитано записей "+н+" из "+КолСтр);
  Пока ДБФ.Следующая()=1 Цикл
   ПризнакГруппы  = ДБФ.IsGroup;
   ТекУровень  = ДБФ.Level;
   ТекКодРодителя = ДБФ.ParentCode;
   ТекКод  = ДБФ.Code;
   ТекНаименоване = ДБФ.Descr;
   н = н+1;
   Состояние("В файле прочитано записей "+н+" из "+КолСтр);
  КонецЦикла;  
  ДБФ.ЗакрытьФайл();
2 uno-group
 
11.07.25
09:09
Попытка
        ЗагрузитьВнешнююКомпоненту("1cpp.dll");
        Сообщить("Компонента 1С++ загружена!");
    Исключение
        Сообщить("Пытались, но не загрузили компоненту 1С++ :(");
    КонецПопытки;                    
    Соединение     = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ() + ";Exclusive=Yes;Mode=ReadWrite;Collating Sequence=MACHINE";
    ДБ             = СоздатьОбъект("OLEDBData");
    Рез         = ДБ.Соединение(Соединение);
3 Chameleon1980
 
11.07.25
09:09
(1) что  к чему?
4 uno-group
 
11.07.25
09:11
+(2) Не в монопольном режиме само собой.
5 СвинТуз
 
11.07.25
09:13
(3)
Есть встроенный в платформу функционал.
Пример использования.
6 СвинТуз
 
11.07.25
09:14
ДБФ простой формат.
Можно открыть как текст и читать.
Если знать как.
7 СвинТуз
 
11.07.25
09:16
Насколько помню встроенный функционал позволяет использовать индексы.
8 Chameleon1980
 
11.07.25
09:18
(5) человеку нужно понять почему VFPOLEDB не алё.
а не иди лучше минеральной воды возьми.
9 СвинТуз
 
11.07.25
09:22
(8)
Там должно быть просто.
ясно. Помучатся значит.

https://help.foxclub.ru/html/7d6c2f1e-1426-4072-bacd-e834d800a366.htm

Дрова, доступ.
Само подключение примитивно.
10 СвинТуз
 
11.07.25
09:23
Видимо есть причина при наличии встроенного функционала
строить сложные выражения самостоятельно.
Тогда должен уметь искать ошибки.
11 СвинТуз
 
11.07.25
09:24
Дрова обнови.
12 СвинТуз
 
11.07.25
09:24
Подключение из Excel тоже глючит?
13 bigdenis22
 
11.07.25
09:26
(1) спасибо конечно, но мне нужно выполнять запросы из одной семерки в другой...
(2) эта часть и у меня работает, мне нужно ПрисоединитьИБ() - подключиться к метаданным, чтоб работала типизация в запросах...(не силен я в переводе имен 1с в истинные имена таблиц и полей)
14 СвинТуз
 
11.07.25
09:29
описание таблиц идет в отдельном файле
раньше шло
15 Chameleon1980
 
11.07.25
09:30
(13) на строке БД.ПрисоединитьИБ(ПутьИБ, Соединение) - выдает ошибку:

а еще у нас это не работает

вы начали с одного и переехали на типизация в запросах
какая проблема в итоге?
1cpp
16 bigdenis22
 
11.07.25
09:35
(9) на сколько я понимаю, метод ПрисоединитьИБ() - это из 1С++, метод класса OLEDBData выполняет подключение к метаданным именно в контексте 1с. К самому FoxPro мало имеет отношения.

ну и попутно вопрос: есть какие-то "удобные" методы переводить мета-имена 1с в реальные имена таблиц и полей? и обратно?
или только поиск по DD файлу?
17 bigdenis22
 
11.07.25
09:40
(15) мне нужно подключиться к БД и запросами получать данные.
если убрать  БД.ПрисоединитьИБ() - выполнение доходит до запроса и ругается на имена данных. Запросы я пишу именами 1С, вида:
	|SELECT Журнал.DOCNO Документ_ном
	| 	, Журнал.DATE as Дата
	|	, ТМЦ.DESCR Товар
	|	, $ТМЦ.КодТрейд КодТрейд
	|	, $РасходнаяНакладнаяСтроки.Кво Количество
	|	, ROUND($РасходнаяНакладнаяСтроки.ЦенаБезНДС/5*6, 2) Цена
	|	, $РасходнаяНакладнаяСтроки.СуммаСНДС Сумма
	|	, РасходнаяНакладная.IDDOC DOC
	|FROM 1SJOURN AS Журнал
	| INNER JOIN $Документ.РасходнаяНакладная AS РасходнаяНакладная ON Журнал.IDDOC = РасходнаяНакладная.IDDOC
	| INNER JOIN $ДокументСтроки.РасходнаяНакладная AS РасходнаяНакладнаяСтроки ON Журнал.IDDOC = РасходнаяНакладнаяСтроки.IDDOC
	| INNER JOIN $Справочник.ТМЦ AS ТМЦ ON $РасходнаяНакладнаяСтроки.ТМЦ = ТМЦ.ID
	|WHERE (" + Условие + ")
	|";
18 bigdenis22
 
11.07.25
09:43
(17) + этот запрос отлажен и работает в БД источнике данных через консоль запросов (ну естественно условие иначе выглядит : WHERE (Журнал.$ОбщийРеквизит.Примечание LIKE :Док1 OR Журнал.$ОбщийРеквизит.Примечание LIKE :Док2))
19 Chameleon1980
 
11.07.25
10:02
20 Chameleon1980
 
11.07.25
10:02
21 trad
 
11.07.25
10:05
Для начала соединение к БД проверь

БД = СоздатьОбъект("OLEDBData");
Рез = БД.Соединение("Provider=VFPOLEDB.1;Deleted=Yes;Data Source=" + ПутьИБ + ";Mode=ReadWrite;Mask Password=False;Collating Sequence=MACHINE;");
Сообщить(Рез);
22 uno-group
 
11.07.25
10:20
(13) дык в 1с++ вроде как и не надо. чтото вроде
    Для к=1 По КР
    Цикл
        ИмяРесурса = Метаданные.Регистр(Имя).Ресурс(к).Идентификатор;
        ТекстЗапроса = ТекстЗапроса+"
        |$РегистрИтоги."+Имя+"."+ИмяРесурса+" =0 and
        |";
    КонецЦикла;
23 bigdenis22
 
11.07.25
13:08
(21) Рез=1
(22) не понял, к чему это? - У меня код выполняется в БД "получатель данных" (где свои метаимена, таблицы и поля), запрос через драйвер отправляется(и должен выполнится) к другой БД "источник данных" (где уже ДРУГИЕ метаимена, таблицы, и поля)!
Метаданные инициатора как помогут в определении полей источника?
24 Chameleon1980
 
11.07.25
13:07
значит нужно знать, зачем ты приехал в Тулу со своим пряником
25 bigdenis22
 
11.07.25
11:35
БД.ПрисоединитьИБ() для ДБФ - вопрос открытый и не решенный

Нашел выход из ситуации, вроде работает:
глМД = СоздатьОбъект("MetaDataWork");
глМД.ПрисоединитьМД(ПутьИБ+"1Cv7.md");
НовТекст = глМД.ОбрМетаСКЛ(ТекстЗап);
Запрос.ВыполнитьИнструкцию(НовТекст,ТЗ);

глМД.ОбрМетаСКЛ(ТекстЗап) - преобразует метаимена в тексте запроса в вид:
SELECT Журнал.DOCNO Документ_ном
    , Журнал.DATE as Дата
    , ТМЦ.DESCR Товар
    , ТМЦ.sp14604 КодТрейд
        , Журнал.sp960
    , РасходнаяНакладнаяСтроки.sp1033 Количество
    , ROUND(РасходнаяНакладнаяСтроки.sp1036/5*6, 2) Цена
    , РасходнаяНакладнаяСтроки.sp1040 Сумма
    , РасходнаяНакладная.IDDOC DOC
FROM 1SJOURN AS Журнал
INNER JOIN dh1011 AS РасходнаяНакладная ON Журнал.IDDOC = РасходнаяНакладная.IDDOC
INNER JOIN dt1011 AS РасходнаяНакладнаяСтроки ON Журнал.IDDOC = РасходнаяНакладнаяСтроки.IDDOC
INNER JOIN sc148 AS ТМЦ ON РасходнаяНакладнаяСтроки.sp1031 = ТМЦ.ID
WHERE (Журнал.sp960 LIKE '%РасходнаяНакладная № 15294 от 03.07.25%')

запрос работает и возвращает данные.
ЗЫ: только как-то медленно - 2-3 секунды... в аналогичной ситуации запрос с подключение к SQL - доли секунды.
ЗЫЗЫ: может кому будет полезно, для ODBC SQL строку в условие "LIKE %РасходнаяНакладная № 15294 от 03.07.25%" надо передавать без одинарных кавычек,
а для OLEDB DBF - с одинарными кавычками "LIKE '%РасходнаяНакладная № 15294 от 03.07.25%'"
26 trad
 
11.07.25
11:40
(25)
БД = СоздатьОбъект("OLEDBData");
БД.ПрисоединитьИБ(ПутьИБ);
так тоже ошибка?

Внутри ПрисоединитьИБ(ПутьИБ) - это:
ПрисоединитьМД(ПутьИБ+"1Cv7.md")
+ (21)
27 bigdenis22
 
11.07.25
12:10
(26) посыпаю голову пеплом...
БД = СоздатьОбъект("OLEDBData");
БД.ПрисоединитьИБ(ПутьИБ, Соединение);
- работает...
выскакивала ошибка синтаксиса(из-за отсутствия одинарных кавычек у параметров) - вчера из-за усталости и аналогии с подключением ODBC SQL(где нужно и Соединение() и ПрисоединитьИБ()) - решил что также не подключает ИБ...

это сейчас уже после (25) поправил синтаксис параметров - и взлетело... а по началу упорно пыталься:
СоздатьОбъект - Соединить - ПрисоединитьИБ

наверно, вопрос можно считать решенным и закрытым.
Спасибо всем за участие.
28 uno-group
 
11.07.25
13:08
(23) дык что мешает сформировать этот запрос в удаленной базе получить текст запроса уже с полями и таблицами и т.п. и вставить этот текст в нужную базу.
29 uno-group
 
11.07.25
14:01
(25) Если бы SQL не давал прироста скорости, то не было бы смысла его использовать. Работай с дбф другим инструментом, но чудес не бывает.