1с 8 создание индексного поля dbf

Обновлено: 07.07.2024

Например, создадим файл, идентичный по структуре исходному.
//При этом применяется метод ОписаниеПоля, который возвращает характеристики поля с указанным номером
//синтаксис: ОписаниеПоля(<НомерПоля>,<НазваниеПоля>,<Тип>,<Длина>,<Точность>)

Для работы с файлом DBF неизвестной структуры часто применяются следующие методы:
ПолучитьЗначениеПоля(<ИмяПоля>);
УстановитьЗначениеПоля(<ИмяПоля>,<значение>);

Работа с удаленными записями

Файлы DBF устроены таким образом, что удаление записи не приводит к физическому удалению записи из файла. Запись просто помечается на удаление и пропускается при переборе. Таким образом размер файла остается прежним. Чтобы физически удалить все помеченные на удаление записи нужно применить метод Сжать. Средства встроенного языка позволяют работать с такими записями, перебирать их и даже отменять пометку на удаление.

Можно удалить все записи в файле одним движением. При этом они физически удаляются и не могут быть восстановлены.

Стоит еще отметить про метод Очистить(), что он очищает все поля текущей записи. Атрибуты, соответствующие полям типа "строковый" приобретают значение «пустая строка», числовой — 0, логический — 0, дата — «пустая дата».

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

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

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

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

Нужно быстро найти Комаров. В неупорядоченном исходном файле искать его можно только последовательным перебором всех записей, что будет очень долго при большом числе записей. В индексе найти Комарова можно очень быстро, поскольку индекс отсортирован по полю Фамилия. При этом мы узнаем физический номер записи в файле DBF и производим прямое позиционирование на нужную запись.

После создания структуры базы данных можно добавить индексы следующим образом:
//Синтаксис: ДобавитьИндекс(<Название>, <Выражение>, <Уникальность>, <Убывание>, <Фильтр>)

После сбоя рекомендуется заново переформировать все индексы

В 1С существует специальный язык для задания выражений и фильтра индекса. Подробнее о нем, смотрите в документации на встроенный язык.

Отбор по значению поля

Часто возникают вопросы по фильтрации файла БД по значению
определенного поля.
Предположим , что в предыдущем примере сотрудники работают в разных
подразделениях «Офис» и «Филиал» ,
и нужно вывести всех сотрудников работающих в офисе.

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

1. Создадим файл индекса, если он ранее не был создан

2. Откроем Файл базы с индексом

3.Прейдем на первую запись

4. И так как все записи упорядочены по индексу - достаточно пройтись
по записям, пока не встретится запись с другим значением поля "Otdel" :


ПутьКФайлуDBF = ПутьКПапкеФайлов + "Sync.dbf" ;
НовФайлуDBF = Новый Файл ( ПутьКФайлуDBF );
Если НовФайлуDBF . Существует ()=Ложь Тогда // Такого файла не существует - создадим новый файл DBF с нужной структурой
// - аналогичной структуре ТЗ на форме

// Описываем колонки таблицы. Типы бывают:
// N - число
// S - строка
// D - дата
// L - булево
// F - число
ТаблицаDBF . Поля . Добавить ( "KodSpr" , "S" , 10 ,); // имя колонки Код в справочнике(как в 1С8=10симв), тип, длина
ТаблицаDBF . Поля . Добавить ( "NameSpr" , "S" , 100 ,); // имя колонки Наименование в справочнике, тип, длина
ТаблицаDBF . Поля . Добавить ( "Scht" , "S" , 8 ,); // имя колонки Счет, тип, длина
ТаблицаDBF . Поля . Добавить ( "Sub1K" , "S" , 25 ,); // имя колонки код Субконто1, тип, длина
ТаблицаDBF . Поля . Добавить ( "SRod1K" , "S" , 25 ,); // имя колонки код Родитель Субконто1, тип, длина
ТаблицаDBF . Поля . Добавить ( "Sub2K" , "S" , 25 ,); // имя колонки код Субконто2, тип, длина
ТаблицаDBF . Поля . Добавить ( "SRod2K" , "S" , 25 ,); // имя колонки код Родитель Субконто2, тип, длина
ТаблицаDBF . Поля . Добавить ( "Sub3K" , "S" , 25 ,); // имя колонки код Субконто3, тип, длина
ТаблицаDBF . Поля . Добавить ( "SRod3K" , "S" , 25 ,); // имя колонки код Родитель Субконто3, тип, длина

ТаблицаDBF . Поля . Добавить ( "Urov" , "N" , 1 , 0 ); // имя колонки Уровень иерархии, тип, длина

ТаблицаDBF . СоздатьФайл ( ПутьКФайлуDBF , ); // путь к базе, путь к индексу
ТаблицаDBF . ЗакрытьФайл ();

ТаблицаDBF . ОткрытьФайл ( ПутьКФайлуDBF ,,Ложь); // путь к базе, путь к индексу - необязателен, только чтение

ТЗсФормы = Новый( "ТаблицаЗначений" );

Для каждого СтрокаТЗ из ТЗсФормы цикл

ТаблицаDBF . Первая (); // перешли к первой записи
Пока Не ТаблицаDBF . ВКонце () Цикл //не последняя запись
Если Не ТаблицаDBF . ЗаписьУдалена () Тогда //нет пометки на удаление
Если ( СокрЛП ( ТаблицаDBF . KodSpr ) = СокрЛП ( СтрокаТЗ . КодВидаОбъекта ))
и ( СокрЛП ( ТаблицаDBF . NameSpr ) = СокрЛП ( СтрокаТЗ . ВидОбъекта )) Тогда
ЗаписьDBFУжеСуществует =Истина;

// Обновим нужные данные
ТаблицаDBF . Scht = СтрокаТЗ . Счет ;
ТаблицаDBF . Sub1K = СтрокаТЗ . Субконто1 . Код ;
ТаблицаDBF . SRod1K = СтрокаТЗ . Субконто1 . Родитель . Код ;
ТаблицаDBF . Sub2K = СтрокаТЗ . Субконто2 . Код ;
ТаблицаDBF . SRod2K = СтрокаТЗ . Субконто2 . Родитель . Код ;
ТаблицаDBF . Sub3K = СтрокаТЗ . Субконто3 . Код ;
ТаблицаDBF . SRod3K = СтрокаТЗ . Субконто3 . Родитель . Код ;
ТаблицаDBF . Urov = СтрокаТЗ . Субконто1 . Уровень ();

ТаблицаDBF . Следующая (); // переходим к следующей записи
КонецЦикла;

Если ЗаписьDBFУжеСуществует =Ложь Тогда //Создадим новую запись и добавим нужные данные

ТаблицаDBF . Добавить ();
ТаблицаDBF . KodSpr = СокрЛП ( СтрокаТЗ . КодВидаОбъекта );
ТаблицаDBF . NameSpr = СокрЛП ( СтрокаТЗ . ВидОбъекта );

ТаблицаDBF . Scht = СтрокаТЗ . Счет ;
ТаблицаDBF . Sub1K = СтрокаТЗ . Субконто1 . Код ;
ТаблицаDBF . SRod1K = СтрокаТЗ . Субконто1 . Родитель . Код ;
ТаблицаDBF . Sub2K = СтрокаТЗ . Субконто2 . Код ;
ТаблицаDBF . SRod2K = СтрокаТЗ . Субконто2 . Родитель . Код ;
ТаблицаDBF . Sub3K = СтрокаТЗ . Субконто3 . Код ;
ТаблицаDBF . SRod3K = СтрокаТЗ . Субконто3 . Родитель . Код ;
ТаблицаDBF . Urov = СтрокаТЗ . Субконто1 . Уровень ();

ТаблицаDBF . ЗакрытьФайл ();
//Сообщить("Файл записан. В таблице " + ТаблицаDBF.КоличествоЗаписей() + " записей.");

Внимание!

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

Внимание!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Внимание!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Внимание!

Остались вопросы?
Спросите в комментариях к статье.


ТЗ = Новый( "ТаблицаЗначений" ); //Создадим таблицу значений со структурой как у загружаемого файла DBF.
// Добавляем в таблицу значений колонку с описанием типа и заголовка
ОписаниеКода = Новый ОписаниеТипов ( "Число" ,Новый КвалификаторыЧисла ( 24 , 0 ));
ТЗ . Колонки . Добавить ( "Код" , ОписаниеКода ); //("Cod","N",24,0)

ОписаниеНаименование = Новый ОписаниеТипов ( "Строка" ,Новый КвалификаторыСтроки ( 100 ));
ТЗ . Колонки . Добавить ( "Наименование" , ОписаниеНаименование ); //("Name","S",100,0)

ОписаниеПримечание = Новый ОписаниеТипов ( "Строка" ,Новый КвалификаторыСтроки ( 250 ));
ТЗ . Колонки . Добавить ( "Примечание" , ОписаниеПримечание ); //("Prim","S",250,0)

ОписаниеЭтоГруппа = Новый ОписаниеТипов ( "Число" ,Новый КвалификаторыЧисла ( 1 , 0 ));
ТЗ . Колонки . Добавить ( "ЭтоГруппа" , ОписаниеЭтоГруппа ); //("Group","N",1,0)

ОписаниеКодРодителя = Новый ОписаниеТипов ( "Число" ,Новый КвалификаторыЧисла ( 24 , 0 ));
ТЗ . Колонки . Добавить ( "КодРодителя" , ОписаниеКодРодителя ); //("Rodit","N",24,0)

ОписаниеУровеньЭлементаВИерархии = Новый ОписаниеТипов ( "Число" ,Новый КвалификаторыЧисла ( 24 , 0 ));
ТЗ . Колонки . Добавить ( "УровеньЭлементаВИерархии" , ОписаниеУровеньЭлементаВИерархии ); //("Urove","N",24,0)

ФайлДБФСпр = Новый XBase ; // путь к базе "D:\SUBK\08.1_1.dbf", путь к индексу - необязателен, только чтение
ФайлДБФСпр . ОткрытьФайл ( ПутьКФайлу ,,Истина);

ФайлДБФСпр . Первая (); // перешли к первой записи

Пока Не ФайлДБФСпр . ВКонце () Цикл //не последняя запись

Если Не ТаблицаDBF . ЗаписьУдалена () Тогда //нет пометки на удаление

НоваяСтрока = ТЗ . Добавить ();
НоваяСтрока . Код = ФайлДБФСпр . Cod ;
НоваяСтрока . Наименование = ФайлДБФСпр . Name ;
НоваяСтрока . Примечание = ФайлДБФСпр . Prim ;
НоваяСтрока . ЭтоГруппа = ФайлДБФСпр . Group ;
НоваяСтрока . КодРодителя = ФайлДБФСпр . Rodit ;
НоваяСтрока . УровеньЭлементаВИерархии = ФайлДБФСпр . Urove ;

//Теперь можно выполнять любые манипуляции с ТЗ, например сортировать:
ТЗ . Сортировать ( "УровеньЭлементаВИерархии Возр" ); //

Для Каждого Стр Из ТЗ Цикл
Сообщить ( строка ( Стр . УровеньЭлементаВИерархии ) + " " + строка ( Стр . Код ) + " " + строка ( Стр . Наименование ));
КонецЦикла;

Читайте также: