Имя: Пароль:
1C
1С v8
Помогите прочесть dbf файл
, ,
0 Dimon1089
 
18.09.17
17:02
Не могу прочесть DBF файл
АДО = Новый COMОбъект("ADODB.Connection"); // Создание COM-объекта
АДО.Open("Provider=Microsoft.Jet.OLEDB.4.0;
         |Data Source=""D:\"";
         |Extended Properties=dBASE III");
БД = АДО.Execute("Select * from Bd_ppsp'"); //
Выбивает ошибку:
БД = АДО.Execute("Select * from Bd_ppsp'"); // запрос с получением всех записей из файла MyFile.DBF
по причине:
Произошла исключительная ситуация (Microsoft JET Database Engine): Внешняя таблица не имеет предполагаемый формат.
Исправлял dBASE III на dBASE IV тоже самое.
1 Волшебник
 
модератор
18.09.17
17:03
Используй объект XBase, встроенный в платформу 1С
2 Ёпрст
 
18.09.17
17:17
(0)
пробуй через оледб

Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ + ";Mode=Read;Exclusive=No;Collating Sequence=MACHINE;TABLEVALIDATE TO 0";

или так:
Соединение = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + КаталогИБ + ";Mode=Share Deny None;Extended Properties=dBase IV;";
3 SSSSS_AAAAA
 
18.09.17
17:21
(2) При этом оба указанных драйвера надо сначала установить, они не штатные.
4 SSSSS_AAAAA
 
18.09.17
17:29
(0) Сам файлик покажи, попробуем определить в каком конкретно он формате.
5 Dimon1089
 
18.09.17
20:42
Вот файлик
http://my-files.ru/ih40wv
6 Dimon1089
 
18.09.17
20:49
7 Dimon1089
 
18.09.17
20:53
(1) Выбивает ошибку
ФайлDBF.ОткрытьФайл(ПутьКФайлу,,Истина); // открытие файла
по причине:
Формат файла отличен от .DBF
8 SSSSS_AAAAA
 
18.09.17
21:05
(7) Это FOXPRO. Используй первый вариант из (2). Драйвер искать на сайте мелкомягких по слову VFP OLEDB Provider. Драйвер только 32-битный, работать с ним, соответственно, только из 32-битной платформы.
9 Йохохо
 
18.09.17
21:24
попробуй этот загрузить https://cloud.mail.ru/public/M9rp/iLbjrm9Y6
отличаются типизацией полей
10 Dimon1089
 
18.09.17
21:43
(8)  Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (ADODB.Connection): Не удается найти указанного поставщика. Вероятно, он установлен неправильно.


КаталогИБ = "D:\Bd_ppsp.dbf";
СтрокаСоединения = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ + ";Mode=Read;Exclusive=No;Collating Sequence=MACHINE;TABLEVALIDATE TO 0";
  
    
    Соединение = Новый ComObject("ADODB.Connection");
    Соединение.ConnectionString = СтрокаСоединения;
    Попытка
        Соединение.Open();
        
    Исключение
        Сообщить(ОписаниеОшибки());
        
    КонецПопытки;
11 Dimon1089
 
18.09.17
21:46
(9) Мне нужен первоначальный формат. Так как DBF в течении дня заполняется.
12 Йохохо
 
18.09.17
21:50
13 ils108
 
19.09.17
04:52
у меня такая ошибка уходила при запуске под админскими правами. и когда в дбф ридере каком-нить таблица открыта, тоже ругался. закрываешь таблицу все работает
14 Emery
 
19.09.17
08:17
(0) > Не могу прочесть DBF файл

Способов доступа к dbf  из 1C вагон и маленькая тележка. Самый простой путь воспользоваться советом Волшебника: «Используй объект XBase, встроенный в платформу 1С». Для любителей изощренных способов можно почитать тут http://www.sql.ru/forum/601874/vs-rabota-s-dbf . Там речь идет о «семерке», но это не принципиальный момент.

Для общего развития могу сказать, что dbf без бинарного заголовка это обычный текст в формате sdf (поля фиксированной ширины без разделителей). Это намек, как можно работать с dbf без специализированных средств. Кстати, формат заголовка dbf хорошо известен и его легко сгенерировать самому ( http://emery-emerald.narod.ru/Cpp/2E14.html ).

В качестве лирического отступления могу рассказать о достоинствах и недостатках dbf-файлов. Об относительных преимуществах речь идет тут: http://www.sql.ru/forum/1212962/otnositelnye-preimushhestva-dbf-faylov , а про недостатки можно добавить то, что поле размера файла заголовка dbf является главным подозреваемым на вывод из строя жесткого диска нашего нетбука. Речь идет о моем драйвере для считывателей rfid-карт сотрудников при учете рабочего времени ( http://emery-emerald.narod.ru/Others/ElPath.html ). Там драйвер создает и заполняет dbf-файл во время считывания карточек пользователей. Эти считыватели китайские и шли безо всякого сопроводительного ПО, зато позволяли легко программировать собственное. Выбор формата dbf обусловливался удобством его дальнейшего использования в собственной конфигурации 1С77 по учету рабочего времени. Так вот главной моей ошибкой было то, что из-за необходимости заполнять поле размера файла в заголовке dbf, головка записи жесткого диска вынуждена была интенсивно дергаться из начала файла в конец и обратно (поскольку при входе / выходе на / с работы шел интенсивный обмен данных сотрудников со считывателями). Со временем файл данных сильно увеличился и головка диска явно подвергалась избыточным перегрузкам. В итоге это ожидаемо привело к выходу из строя жесткого диска, хотя пару лет он прослужил, а вот его «брат» близнец, работает до сих пор, поскольку обслуживает другой участок, где поток пользователей на порядок меньше.

В итоге, жесткий диск мы поменяли, а драйвер я переделал. Теперь он создает простой текстовый файл в формате sdf. Головка диска работает только на допись, соответственно никакой избыточной нагрузки. А работать в конфигурации с текстовыми файлами ничуть не сложнее, чем с dbf. При желании можно даже генерировать в «семерке» основу для кодировки UTF-8, например, собственные xml-файлы (иногда это сделать гораздо удобнее без использования штатных средств).

Ну и в заключении «раз пошла такая пьянка» скажу, что текстовый sdf-формат дает наводку на вопрос: А зачем вообще использовать заголовки в отдельных файлах баз данных, если их вполне можно вынести в отдельный файл для целой sdf-группы данных? Это плавно подводит нас к идее базы данных ориентированной на представление через колонки, а не строки. Т.е., не несколько строк в одном файле, а несколько колонок в одном файле (либо даже одна колонка в одном файле, как в самой крутой по производительности опенсорной базе данных «ClickHouse» от Яндекса).

Это все к тому, как можно далеко зайти от невинного вопроса ТС :) .
15 Ёпрст
 
19.09.17
09:50
(11)

Вот с такой строкой твой файл прекрасно читается:
    Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ + ";Collating Sequence=MACHINE";

если че, win 2012 x64
16 Ёпрст
 
19.09.17
09:53
КаталогИБ = "F:\"; // тут свой путь воткнешь + в системе должен быть установлен vfp провайдер, вот отсюда, к примеру:
    //  http://www.microsoft.com/downloads/details.aspx?FamilyId=E1A87D8F-2D58-491F-A0FA-95A3289C5FD4&displaylang=en
   ОлеДБ = Новый COMОбъект("ADODB.Connection");
    Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ + ";Collating Sequence=MACHINE";
    Command = Новый COMОбъект("ADODB.Command");
    Command.ActiveConnection = ОлеДБ;
    ТекстЗапроса = "select * from BD_PPSP.DBF";
    Command.CommandText = ТекстЗапроса;    
    RecordSet = Новый COMОбъект("ADODB.RecordSet");    
    RecordSet.cuRsortype = 1;  
    RecordSet.cuRsorlocation = 3;  
    RecordSet = Command.Execute();
    Если not RecordSet.EOF() Тогда
        RecordSet.MoveFirst();
        Пока RecordSet.EOF() = 0 Цикл
            Сообщить(RecordSet.Fields.Item("DTV").Value);
            RecordSet.MoveNext();  
        КонецЦикла;
    КонецЕсли;
    RecordSet.Close();
17 Ёпрст
 
19.09.17
09:55
+
    Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ + ";Collating Sequence=MACHINE";
    ОлеДБ.Open(Соединение);
18 SSSSS_AAAAA
 
19.09.17
11:07
(15) (16) (17) + ";Collating Sequence=MACHINE"
совершенно бесполезная дописка ибо нужна только и исключительно при создании индексов.
19 Ёпрст
 
19.09.17
11:31
(18) не только при создании
20 Ёпрст
 
19.09.17
11:32
21 Ёпрст
 
19.09.17
11:33
Это всё оттуда осталось.
22 Dimon1089
 
19.09.17
11:40
Всем спасибо))) Пошло)))
23 Dimon1089
 
19.09.17
11:50
(16) Ошибка при установке значения атрибута контекста (ActiveConnection)
    Command.ActiveConnection = ОлеДБ;
по причине:
Произошла исключительная ситуация (ADODB.Command): Для требуемой операции необходим объект OLE DB Session, не поддерживаемый текущим проводником.
Провайдер установил
24 Ёпрст
 
19.09.17
11:52
(23) см (17)
25 SSSSS_AAAAA
 
19.09.17
11:53
(19) Сия настройка стоит по умолчанию и потому явное ее указание - перебор. Если таки у вас она вдруг почему-то имеет другое значение, то это повод разобраться с настройками винды.
26 SSSSS_AAAAA
 
19.09.17
11:53
(23) Откуда взялось
Command.ActiveConnection = ОлеДБ; ?
27 Dimon1089
 
20.09.17
17:06
(24) (26) Ошибка при вызове метода контекста (Execute)
    RecordSet = Command.Execute();
по причине:
Произошла исключительная ситуация (ADODB.Command): Невозможно использование подключения для выполнения операции. Оно закрыто или не допускается  в данном контексте.
  

КаталогИБ = "D:\";
       ОлеДБ = Новый COMОбъект("ADODB.Connection");
    //Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ + ";Collating Sequence=MACHINE";
    Command = Новый COMОбъект("ADODB.Command");
    //Command.ActiveConnection = ОлеДБ;
    Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ + ";Collating Sequence=MACHINE";
    ОлеДБ.Open(Соединение);
    ТекстЗапроса = "select * from BD_PPSP.DBF";
    Command.CommandText = ТекстЗапроса;    
    RecordSet = Новый COMОбъект("ADODB.RecordSet");    
    RecordSet.cuRsortype = 1;  
    RecordSet.cuRsorlocation = 3;  
    RecordSet = Command.Execute();
    Если not RecordSet.EOF() Тогда
        RecordSet.MoveFirst();
        Пока RecordSet.EOF() = 0 Цикл
            Сообщить(RecordSet.Fields.Item("DTV").Value);
            RecordSet.MoveNext();  
        КонецЦикла;
    КонецЕсли;
    RecordSet.Close();
28 Ёпрст
 
20.09.17
17:22
(27)
    КаталогИБ = "F:\"; // тут свой путь воткнешь + в системе должен быть установлен vfp провайдер, вот отсюда, к примеру:
    ОлеДБ = Новый COMОбъект("ADODB.Connection");
    Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ + ";Collating Sequence=MACHINE";
    ОлеДБ.Open(Соединение);
    Command = Новый COMОбъект("ADODB.Command");
    Command.ActiveConnection = ОлеДБ;
    ТекстЗапроса = "select * from BD_PPSP.DBF";
    Command.CommandText = ТекстЗапроса;    
    RecordSet = Command.Execute();
    Если not RecordSet.EOF() Тогда
        RecordSet.MoveFirst();
        Пока НЕ RecordSet.EOF() Цикл
            Сообщить(RecordSet.Fields.Item("DTV").Value);
            RecordSet.MoveNext();  
        КонецЦикла;
    КонецЕсли;
    RecordSet.Close();
29 Dimon1089
 
21.09.17
10:54
(28) Ошибка при вызове метода контекста (Execute)
RecordSet = Command.Execute();
по причине:
Произошла исключительная ситуация (Microsoft OLE DB Provider for Visual FoxPro): d:\dbf\bd_ppsp.dbf is not a table.

vfp установлен
DBF находится в папке d:\dbf\
30 Ёпрст
 
21.09.17
10:55
(29) тот файл что в (6) читается.
31 Ёпрст
 
21.09.17
10:55
Он у тя хотя бы дбф редактором каким открывается ?
32 Dimon1089
 
21.09.17
10:56
CDBF открывается
33 Dimon1089
 
21.09.17
10:56
(32) CDBF открывается
34 Ёпрст
 
21.09.17
11:06
(32) оледб откуда скачал хоть ? Там иссылка была
35 Ёпрст
 
21.09.17
11:09
и выложи файло, которое не читается
36 Dimon1089
 
21.09.17
11:11
(35) (5) это файлик
37 Dimon1089
 
21.09.17
11:12
(34) оледб уже встроена была
38 Dimon1089
 
21.09.17
11:13
(34) когда пересохраняю файлик все прекрасно работает
39 Ёпрст
 
21.09.17
11:15
(38) значит смотри, чем отличается заголовок
40 Ёпрст
 
21.09.17
11:16
Или пробуй с другим провайдером, например, Microsoft.ACE.OLEDB.12.0
41 Dimon1089
 
21.09.17
11:16
немного не понял, какой заголовок
42 Ёпрст
 
21.09.17
11:18
(41) смотри, чем отличается заголовок файла до правки в дбф редакторе и после.
43 Dimon1089
 
21.09.17
11:25
(42) да вот именно ничем я на его пересахронил
44 Dimon1089
 
21.09.17
11:27
(42) а можно как нибудь написать в 1с чтобы автоматом пересохронял файлс другим именем и менялся формат?
45 Ёпрст
 
21.09.17
11:28
(44) проще взять другого поставщика. Или изначально создавать файло в нужном формате.
46 Dimon1089
 
21.09.17
11:30
(45) этот файл загружается из другой программы
47 Йохохо
 
21.09.17
11:32
48 Dimon1089
 
21.09.17
11:42
(47) Типом поменялся до сохранения тип: Unknown после FoxBASE+/Dbase III plus, no memo
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший