Работа с файлами DBF

Работа с файлами DBF

DBF – широко распространенный формат хранения данных, появившийся в 80-х годах прошлого века. Впервые формат применялся в семействе СУБД dBase. В связи с популярностью и широким распространением dBase, было создано множество dBase-подобных программных продуктов, получивших собирательное название xBase. Несмотря на значительный возраст формата, он до сих пор достаточно широко используется. В данной статье рассматриваются способы работы с DBF из «1С:Предприятие».

Чтение файла DBF
Выгрузка в файл DBF
Работа с индексами
Удаление записей в файле DBF
Загрузка из DBF при помощи ADO



В «1С:Предприятие» для работы с файлами формата DBF(версия dBase III) применяется специальный программный объект – xBase. Работа с этим объектом обычно не вызывает трудностей.


Внимание!

При работе с файлами DBF следует помнить, что имя файла должно удовлетворять ограничению 8.3.



Внимание!

Объект xBase доступен как на стороне клиента, так и на стороне сервера. Следует продумывать клиент-серверное взаимодействие при решении каждой конкретной задачи.


Чтение файла DBF

Чтение данных из файла DBF производится за несколько последовательных этапов:

  1. Создание объекта XBase;
  2. Открытие файла;
  3. Последовательный перебор всех строк файла и считывание значений полей;
  4. Закрытие файла.

Рассмотрим этот процесс на примере:

ДБФ = Новый XBase; // Этап 1. Создание объекта XBase
ДБФ.ОткрытьФайл("D:\MyFile.dbf"); // Этап 2. Открытие файла
Пока Истина Цикл // Этап 3. Перебор строк файла
    Сообщить(ДБФ.NAME); // Пример обращения к значению поля
    Если НЕ ДБФ.Следующая() Тогда // Позиционирование на следующей записи
        Прервать;
    КонецЕсли;
КонецЦикла;
ДБФ.ЗакрытьФайл(); // Этап 4. Закрытие файла

Можно использовать несколько измененный алгоритм перебора строк файла:

Пока НЕ ДБФ.ВКонце() Цикл
    Сообщить(ДБФ.NAME);
    ДБФ.Следующая();
КонецЦикла;

Выгрузка в файл DBF

Этапы выгрузки в файл DBF:

  1. Создание объекта XBase;
  2. Указание кодировки (если не указать, то будет использоваться кодировка ANSI);
  3. Описание полей;
  4. Создание файла;
  5. Цикл с добавлением и заполнением строк;
  6. Закрытие файла.

Рассмотрим этот процесс на примере:

ДБФ = Новый XBase; // Этап 1. Создание объекта XBase
ДБФ.Кодировка = КодировкаXBase.OEM; // Этап 2. Указание кодировки
ДБФ.Поля.Добавить("CODE", "S", 9); // Этап 3. Описание имени и типа поля
ДБФ.Поля.Добавить("NAME", "S", 40);
ДБФ.СоздатьФайл("D:\MyFile.dbf"); // Этап 4. Создание файла
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
    ДБФ.Добавить(); // Добавление строки
    ДБФ.CODE = Выборка.Код; // Заполнение значения поля
    ДБФ.NAME = Выборка.Наименование;
    ДБФ.Записать(); // Запись строки
КонецЦикла;
ДБФ.ЗакрытьФайл(); // Этап 6. Закрытие файла

При указании кодировки используется тип КодировкаXBase, который может принимать два значения:

  • ANSI – формат Windows;
  • OEM – формат DOS.

Добавление нового поля при описании структуры имеет синтаксис

Добавить(<Имя>, <Тип>, <Длина>, <Точность>)

Доступны следующие типы:

  • «N» – число;
  • «S» – строка;
  • «D» – дата;
  • «L» – булево;
  • «F» – аналогично «N» – число.

Длина поля является обязательным для типов полей «N», «F» и «S».

Работа с индексами

Совместно с файлом DBF может использоваться индексный файл, в котором может содержаться информация об одном или более индексе. Наличие индексов делает возможным использование поиска, а не только последовательного перебора всех строк файла.

При создании индексного файла следует задать:

  • Перечень индексов;
  • Путь сохранения индексного файла (на этапе 4 выгрузки).

Пример создания индексного файла:

ДБФ.Индексы.Добавить("INDCODE", "CODE");
ДБФ.СоздатьФайл("D:\MyFile.dbf", "D:\index.cdx");

Процедура добавления нового индекса имеет синтаксис:

Добавить(<Имя>, <Выражение>, <Уникальность>, <Убывание>, <Фильтр>)

Для использования индексов при чтении из файла DBF следует:

  • Указать путь к индексному файлу (на этапе 2 загрузки);
  • Задать текущий индекс.

Пример открытия файла DBF с использованием индексного файла:

ДБФ.ОткрытьФайл("D:\MyFile.dbf", "D:\index.cdx");
ДБФ.ТекущийИндекс = ДБФ.Индексы.INDCODE;

Внимание!

При открытии файла DBF позиционирование происходит на первой записи в файле. Первая запись в файле не соответствует первой записи в индексе. В связи с этим при использовании индексов перед тем, как последовательно обходить строки, необходимо спозиционироваться на первой строке индекса. Это можно сделать методом Первая(), например:

ДБФ.Первая();

Для поиска может использоваться одна из двух функций:

  • Найти(<Ключ>, <Режим>);
  • НайтиПоКлючу(<Режим>).

В результате работы обоих функций возвращается значение с типом булево (найдена запись с указанными условиями или нет). В случае успешного поиска текущий указатель устанавливается на найденной строке. В качестве режима поиска может использоваться одно из значений:

  • «=»;
  • «>=»;
  • «>»;
  • «<=»;
  • «<«.

Рассмотрим поиск в файле DBF на примерах:

ДБФ = Новый XBase;
ДБФ.ОткрытьФайл("D:\MyFile.dbf", "D:\index.cdx"); // При открытии файла DBF дополнительно указывается индексный файл
ДБФ.ТекущийИндекс = ДБФ.Индексы.INDCODE; // Установка текущего индекса

// поиск методом Найти:
Если ДБФ.Найти("000000003", "=") Тогда
    Сообщить("Найдено. Наименование элемента: " + ДБФ.NAME);
Иначе
    Сообщить("Не найдено");
КонецЕсли;

// поиск методом НайтиПоКлючу:
ДБФ.Ключ.CODE = "000000002";
Если ДБФ.НайтиПоКлючу("=") Тогда
    Сообщить("Найдено. Наименование элемента: " + ДБФ.NAME);
Иначе
    Сообщить("Не найдено");
КонецЕсли;

ДБФ.ЗакрытьФайл();

Удаление записей в файле DBF

Удаление записи производится методом Удалить():

ДБФ.Удалить();

Но при использовании этого метода запись не удаляется из файла безвозвратно, ей присваивается пометка удаления. При переборе строк помеченные на удаление записи пропускаются. Если необходимо обойти весь файл, включая помеченные на удаление записи, необходимо присвоить значение Истина свойству ОтображатьУдаленные объекта xBase. Узнать помечена запись на удаление или нет можно с помощью функции ЗаписьУдалена(). Для снятия пометки удаления используется метод Восстановить().

ДБФ.ОтображатьУдаленные = Истина;
Пока НЕ ДБФ.ВКонце() Цикл
    Если ДБФ.ЗаписьУдалена() Тогда
        ДБФ.Восстановить();
    КонецЕсли;
ДБФ.Следующая();
КонецЦикла;

Для непосредственного удаления помеченных записей используется метод Сжать():

ДБФ.Сжать();

Если необходимо удалить все записи в файле непосредственно, то можно использовать метод ОчиститьФайл():

ДБФ.ОчиститьФайл();

Загрузка из DBF при помощи ADO

Для работы с файлами DBF может использоваться технология ADO. Драйверы ADO входят в состав операционной системы Windows и дополнительно их устанавливать не надо.

Рассмотрим пример кода для чтения из файла DBF по технологии ADO:

АДО = Новый COMОбъект("ADODB.Connection"); // Создание COM-объекта
АДО.Open("Provider=Microsoft.Jet.OLEDB.4.0;
         |Data Source=""D:\"";
         |Extended Properties=DBASE III");
БД = АДО.Execute("Select * from MyFile"); // запрос с получением всех записей из файла MyFile.DBF
Пока БД.EOF=0 Цикл //Цикл по записям файла DBF
    Сообщить(БД.Fields("Name").value); // Пример обращения к значению поля       
    БД.MoveNext(); //Переходим к следующей записи
КонецЦикла;
АДО.Close();

В приведенном примере используется строка подключения «Provider=Microsoft.Jet.OLEDB.4.0;Data Source= «D:\»;Extended Properties=DBASE III». В этой строке:

  • Provider – это используемый драйвер;
  • Data Source – путь, где находится файл DBF. Путь указывается с точностью до каталога. Имя файла используется в качестве имени таблицы в запросах;
  • Extended Properties – в случае обращения к файлам DBF является обязательным параметром. Можно указать формат файла

Внимание!

При чтении указанным способом кодировка по-умолчанию – OEM. Для того, чтобы изменить кодировку на ANSI необходимо в реестре Windows присвоить параметру HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\xBase\DataCodePage значение «ANSI».


 

Смотри также:

Основные способы обмена 1С с другими системами
Создание диаграммы excel из 1С
Подключение к базе 1С через COM

Добавить комментарий

Ваш e-mail не будет опубликован.