Підручник 1с

Файл = СоздатьОб'ект ( "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", СпрТовари.Цена) // так теж можна;
. Файл.Запісать ();
КонецЦікла;

Файл.ЗакритьФайл (); // не забувайте будь ласка

Робота зі структурою файлу DBF

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

Файл1 = СоздатьОб'ект ( "XBASE");
Файл2 = СоздатьОб'ект ( "XBASE");

Для н = 1 За Файл1.КолічествоПолей () Цикл
. НазвПоля = "";
. Тип = "";
. Довжина = 0;
. Точність = 0;
. Файл1.ОпісаніеПоля (н, назвПоля, Тип, Довжина, Точність);
. Файл2.ДобавітьПоле (назвПоля, Тип, Довжина, Точність);
КонецЦікла;

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

Робота з віддаленими записами
Файли DBF влаштовані таким чином, що видалення запису не призводить до фізичного видалення запису з файлу. Запис просто позначається на видалення і пропускається при переборі. Таким чином розмір файлу залишається колишнім. Щоб фізично видалити всі помічені на видалення запису потрібно застосувати метод Стиснути. Засоби вбудованого мови дозволяють працювати з такими записами, перебирати їх і навіть відміняти позначку на видалення.

Файл.ПоказиватьУдаленние (1);
Файл.Первая ();
Поки Файл.ВКонце () = 0 Цикл
. Якщо Файл.ЗапісьУдалена () = 1 Тоді
. Файл.Восстановіть ();
. КонецЕсли;
. Файл.Следующая ();
КонецЦікла;

Файл.Первая ();
Поки Файл.ВКонце () = 0 Цикл
. якщо Файл.PRICE <1000 Тогда
. Файл.Удаліть ();
. КонецЕсли;
. Файл.Следующая ();
КонецЦікла;

Файл.Сжать (); // видалити записи фізично

Можна видалити всі записи у файлі одним рухом. При цьому вони фізично видаляються і не можуть бути відновлені.
Файл.ОчістітьВсе ();

Варто ще відзначити про метод Очистити (), що він очищає всі поля поточного запису. Атрибути, відповідні полях типу "строковий" набувають значення «порожній рядок», числовий - 0, логічний - 0, дата - «порожня дата».

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

Для організації упорядкування вмісту файлу БД і пошуку в ній за значенням одного або декількох полів застосовується механізм індексів. Його застосування можна порівняти з сортуванням картотеки за певною ознакою (сукупності ознак). Однак, на відміну від картотеки, файл БД може мати відразу кілька індексів, і, відповідно, бути впорядкованим одночасно за кількома ознаками. Індекси зберігаються в індексному файлі. Індексний файл може містити інформацію більш ніж про одне індексі. Рекомендується для одного файлу 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);

// після збою рекомендується заново переформувати всі індекси
Файл.Переіндексіровать ();

НОВИНИ ФОРУМУ
Лицарі теорії ефіру

Схожі статті