При интеграции 1С с внешними системами часто возникает необходимость загрузки данных из файлов формата DBF. Однако стандартные механизмы работы с файлами баз данных могут выдавать ошибки, если исходный файл выгружен из системы FoxPro. Разберем причинно-следственную связь таких ошибок и рассмотрим, как правильно прочесть подобный файл из кода 1С.
Проанализируем базовые варианты работы с DBF и ошибки, с которыми сталкиваются разработчики:
XBase в 1С: При вызове метода ОткрытьФайл() платформа выводит ошибку «Формат файла отличен от .DBF». Это связано с тем, что встроенный объект XBase рассчитан на работу со стандартами dBASE III и dBASE IV, но не поддерживает специфическую структуру заголовков Visual FoxPro.Select * from Table возникает исключительная ситуация: «Внешняя таблица не имеет предполагаемый формат». Изменение параметров соединения с dBASE III на dBASE IV в строке подключения проблему не решает, так как эти провайдеры также не умеют интерпретировать тип заголовка FoxPro.Причина заключается в сигнатуре заголовка файла: таблицы Visual FoxPro содержат байты идентификации (например, 0x30), отличающиеся от стандартных таблиц dBASE. Из-за этого универсальные механизмы считывают такой файл как поврежденный или имеющий неизвестный формат.
Для корректного взаимодействия с таблицами FoxPro необходимо использовать специализированный OLE DB поставщик данных — Microsoft OLE DB Provider for Visual FoxPro (VFPOLEDB).
Разберем по шагам порядок настройки и подключения:
VFPOLEDB в операционной системе. Его можно скачать с официального сайта Microsoft.VFPOLEDB существует только в 32-разрядной версии. Это означает, что код чтения файла должен выполняться либо в 32-битной клиенте 1С, либо через внешнее 32-битное соединение (например, через COM+ приложение на сервере).Рассмотрим рабочий пример кода 1С для чтения данных из файла BD_PPSP.DBF, расположенного в каталоге D:\dbf\:
КаталогИБ = "D:\dbf\";
// Создаем COM-объект подключения
ОлеДБ = Новый COMОбъект("ADODB.Connection");
Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ + ";Collating Sequence=MACHINE";
Попытка
ОлеДБ.Open(Соединение);
Исключение
Сообщить("Не удалось подключить провайдер VFPOLEDB: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Создаем объект команды и связываем с подключением
Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection = ОлеДБ;
Command.CommandText = "SELECT * FROM BD_PPSP.DBF";
// Выполняем запрос и получаем набор записей
RecordSet = Новый COMОбъект("ADODB.RecordSet");
RecordSet = Command.Execute();
Если НЕ RecordSet.EOF() Тогда
RecordSet.MoveFirst();
Пока НЕ RecordSet.EOF() Цикл
// Обработка значения конкретного поля (например, "DTV")
ЗначениеПоля = RecordSet.Fields.Item("DTV").Value;
Сообщить(ЗначениеПоля);
RecordSet.MoveNext();
КонецЦикла;
КонецЕсли;
// Закрываем соединение
RecordSet.Close();
ОлеДБ.Close();
Выясним назначение параметров, указываемых в строке подключения ConnectionString:
Provider=VFPOLEDB.1 — указывает платформе использовать драйвер Visual FoxPro. Если выдается ошибка «Не удается найти указанного поставщика», проверьте, установлен ли драйвер в системе и совпадает ли разрядность процесса с 32-битным драйвером.Data Source — должен содержать путь к папке с файлами DBF, а не полный путь к конкретному файлу. Имя файла пишется в предложении FROM текста запроса.Collating Sequence=MACHINE — задает последовательность сортировки. Этот параметр применяется при создании индексов или поиске, в базовых сценариях чтения его можно опускать.Благодаря использованию родного провайдера FoxPro файл успешно читается без необходимости его предварительной конвертации или перезаписи сторонними редакторами.