Учебник по 1С
37917957

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


Для организации упорядочивания содержимого файла БД и поиска в ней по значению одного или нескольких полей применяется механизм индексов. Его применение можно сравнить с сортировкой картотеки по определенному признаку (совокупности признаков). Однако, в отличие от картотеки, файл БД может иметь сразу несколько индексов, и, соответственно, являться упорядоченным одновременно по нескольким признакам. Индексы хранятся в индексном файле. Индексный файл может содержать информацию более чем об одном индексе. Рекомендуется для одного файла DBF иметь один индексный файл, в котором хранятся все индексы для этого файла.

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

Основное правило: индекс нужен, чтобы быстро искать нужную запись.

DBF-ФАЙЛ
Индекс по фамилии



Содержание раздела






Физ. номер записи
Фамилия
1
Иванов
2
Абдулов
3
Барабанов
4
Мирнов
5
Раскольников
6
Комаров

Нужно быстро найти Комаров. В неупорядоченном исходном файле искать его можно только последовательным перебором всех записей, что будет очень долго при большом числе записей. В индексе найти Комарова можно очень быстро, поскольку индекс отсортирован по полю Фамилия. При этом мы узнаем физический номер записи в файле 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С существует специальный язык для задания выражений и фильтра индекса. Подробнее о нем, смотрите в документации на встроенный язык.

Фамилия Физ. номер записи
Абдулов
2
Барабанов
3
Иванов
1
Мирнов
4
Комаров
6
Раскольников
5