Файл = создатьОбъект(XBASE);
//создаем ссылку на файл DBF
Файл.ОткрытьФайл(catalog.dbf); //открываем файл на
диске
Файл.КодоваяСтраница(1); //задаем кодировку: 0 - windows, 1 - DOS
Если Файл.Открыта()=0
Тогда //проверяем, удалось ли открыть файл
........Сообщить(Не удалось открыть файл!);
КонецЕсли;
Файл.Первая();
//позиционируемся на первой записи
Пока Файл.ВКонце()=0 Цикл //пока не дошли до конца, крутим цикл
.......НомерЗаписи = Файл.НомерЗаписи(); //получаем номер текущей
записи
.......НазвТовара = Файл.NAME; //получаем значение поля
.......Цена = Файл.ПолучитьЗначениеПоля(PRICE); //так
тоже можно, но чуть медленнее
.......Файл.Следующая(); //переходим на следующую запись
КонецЦикла;
Файл.Последняя();
//позиционируемся на первой записи
Пока Файл.ВНачале()=0 Цикл //пока не дошли до начала, крутим цикл
.......НазвТовара = Файл.NAME;
.......Цена = Файл.PRICE;
.......Файл. Предыдущая(); //переходим на предыдущую запись
КонецЦикла;
Для н = 1 По Файл.КоличествоЗаписей()
Цикл //здесь все понятно, по-моему
......Файл.Перейти(н); //позиционируемся на определенной записи
.......НазвТовара = Файл.NAME;
.......Цена = Файл.PRICE;
КонецЦикла;
Файл.ЗакрытьФайл(); //не забывайте пожалуйста
Файл = создатьОбъект(XBASE); //создаем ссылку на файл DBF
//определяем
структуру файла
//Синтаксис: ДобавитьПоле(Название,Тип,Длина,Точность)
Файл.ДобавитьПоле(NAME,S,50,0);
Файл.ДобавитьПоле(PRICE,N,10,2);
Файл.СоздатьФайл(catalog.dbf); //создаем файл физически
СпрТовары.ВыбратьЭлементы();
Пока СпрТовары.ПолучитьЭлемент()=1 Цикл
.......Файл.Добавить();
.......Файл.NAME = СпрТовары.Наименование;
.......Файл.УстановитьЗначениеПоля(PRICE,СпрТовары.Цена) //так
тоже можно;
.......Файл.Записать();
КонецЦикла;
Файл.ЗакрытьФайл(); //не забывайте пожалуйста
Например,
создадим файл, идентичный по структуре исходному.
//При этом применяется метод ОписаниеПоля, который возвращает характеристики
поля с указанным номером
//синтаксис: ОписаниеПоля(НомерПоля,НазваниеПоля,Тип,Длина,Точность)
Файл1
= СоздатьОбъект(XBASE);
Файл2 = СоздатьОбъект(XBASE);
Файл1 = ОткрытьФайл(file1.dbf);
Для н = 1 По Файл1.КоличествоПолей() Цикл
........НазвПоля = ;
........Тип = ;
........Длина = 0;
........Точность = 0;
........Файл1.ОписаниеПоля(н,назвПоля,Тип,Длина,Точность);
........Файл2.ДобавитьПоле(назвПоля,Тип,Длина,Точность);
КонецЦикла;
Для работы
с файлом DBF неизвестной структуры часто применяются следующие методы:
ПолучитьЗначениеПоля(ИмяПоля);
УстановитьЗначениеПоля(ИмяПоля,значение);
Файл.ПоказыватьУдаленные(1);
Файл.Первая();
Пока Файл.ВКонце()=0 Цикл
......Если Файл.ЗаписьУдалена()=1 Тогда
............Файл.Восстановить();
......КонецЕсли;
......Файл.Следующая();
КонецЦикла;
Файл.Первая();
Пока Файл.ВКонце()=0 Цикл
......Если Файл.PRICE 1000 Тогда
............Файл.Удалить();
......КонецЕсли;
......Файл.Следующая();
КонецЦикла;
Файл.Сжать();
//удалить записи физически
Можно удалить все записи в файле одним движением. При этом они физически
удаляются и не могут быть восстановлены.
Файл.ОчиститьВсе();
Стоит еще отметить про метод Очистить(), что он очищает все поля
текущей записи. Атрибуты, соответствующие полям типа строковый
приобретают значение «пустая строка», числовой — 0, логический — 0, дата
— «пустая дата».
Для организации упорядочивания содержимого файла БД и поиска в ней по значению одного или нескольких полей применяется механизм индексов. Его применение можно сравнить с сортировкой картотеки по определенному признаку (совокупности признаков). Однако, в отличие от картотеки, файл БД может иметь сразу несколько индексов, и, соответственно, являться упорядоченным одновременно по нескольким признакам. Индексы хранятся в индексном файле. Индексный файл может содержать информацию более чем об одном индексе. Рекомендуется для одного файла DBF иметь один индексный файл, в котором хранятся все индексы для этого файла.
Каждый индекс имеет наименование, признак уникальности, выражение индекса и фильтр. Наименование индекса используется для идентификации индекса. Выражение индекса и фильтр представляют собой написанные на специальном языке выражения, вычисление значения которых для каждой записи позволяет определить ее место при упорядочивании и необходимость помещения ее в упорядоченный список (индекс может содержать упоминание не обо всех записях таблицы, а только об удовлетворяющих выражению фильтра). Уникальный индекс (имеющий установленным признак уникальности) позволяет иметь в индексе ссылки на записи только с различным значением индексного выражения.
Основное правило: индекс нужен, чтобы быстро искать нужную запись.
DBF-ФАЙЛ
|
Индекс
по фамилии
|
||||||||||||||||||||||||||||
|
|
Нужно быстро найти Комаров. В неупорядоченном исходном файле искать его можно только последовательным перебором всех записей, что будет очень долго при большом числе записей. В индексе найти Комарова можно очень быстро, поскольку индекс отсортирован по полю Фамилия. При этом мы узнаем физический номер записи в файле DBF и производим прямое позиционирование на нужную запись.
После
создания структуры базы данных можно добавить индексы следующим образом:
//Синтаксис: ДобавитьИндекс(Название, Выражение, Уникальность,
Убывание, Фильтр)
Файл = СоздатьОбъект(XBase);
Файл.ДобавитьПоле(NAME, 1, 19, 3);
Файл.ДобавитьПоле(PRICE, 2, 25, 0);
Файл.ДобавитьИндекс(IDXCODE, CODE, 1, 0,
);
Файл.ДобавитьИндекс(IDXNAME, NAME, 0, 0,
);
Файл.ДобавитьИндекс(IDXNAMECODE, NAME+CODE,
0, 0, );
Файл.СоздатьФайл(mydb.dbf, mydb.cdx);
//1-й вариант
Файл.ТекущийИндекс(IDXNAME);
Файл.Найти(Иванов,0); //передается значение и режим
поиска
//2-й вариант
Файл.ТекущийИндекс(IDXNAMECODE);
Файл.Ключ.NAME = Иванов;
Файл.Ключ.CODE = 123;
Файл.НайтиПоКлючу(0);
//после сбоя рекомендуется заново переформировать все индексы
Файл.Переиндексировать();
В 1С существует специальный язык для задания выражений и фильтра индекса. Подробнее о нем, смотрите в документации на встроенный язык.