Опубликовано: 16.04.2021

Работа с базами данных формата DBF

Контекст работы с XBase-объектами

Во всех программных модулях системы «1С:Предприятие» версии 7.7 для работы с базами данных формата DBF следует использовать объекты типа "XBase". При помощи функции СоздатьОбъект() можно создать произвольное число объектов данного типа. Для обращения к атрибуту XBase-объекта или вызова его метод, имя атрибута или метода записывается через точку после имени объекта.

Пример работы с объектом типа "XBase":

ФайлБД = СоздатьОбъект("XBase");
ИмяФайла = "";
Путь = "";
// вызываем диалог для выбора файла
ФС.ВыбратьФайл(0, ИмяФайла, Путь, , "*.*", , );
// получаем полный путь к файлу
ПолноеИмяФайла = Путь + ИмяФайла;
// пытаемся открыть файл
ФайлБД.ОткрытьФайл(ПолноеИмяФайла);
Если ФайлБД.Открыта() = 1 Тогда
   // работаем с БД
   ...

Иначе
   Сообщить("Не удалось открыть файл!");
КонецЕсли;

Атрибуты объекта XBase

Получить значение конкретного поля текущей записи позволяет атрибут <Поле>. В тексте программного модуля в качестве имени данного атрибута подставляется имя конкретного поля таблицы базы данных.

Пример использования атрибута:

ФИО = ФайлБД.FULLNAME;  // считываем значение поля FULLNAME текущей записи

Примечание: Данные атрибуты имеют смысл, только если файл базы данных находится в открытом состоянии.

Получить доступ к агрегатному типу данных типа "Ключ" позволяет атрибут Ключ (англоязычный синоним — Key). Агрегатный тип данных типа "Ключ", свою очередь, также имеет атрибуты. Состав его атрибутов полностью повторяет атрибуты XBase-объекта за исключением того, что отсутствует атрибут Ключ. Значения атрибутов агрегатного типа данных типа "Ключ" используются XBase-объектом для вычисления выражения индекса при использовании метода НайтиПоКлючу().

Пример использования атрибута:

ФайлБД.Ключ.FULLNAME = ФИО;
ЗаписьНайдена = ФайлБД.НайтиПоКлючу(0);

Методы объекта XBase

Методы для создания БД

Добавить поле в описание структуры базы данных позволяет метод ДобавитьПоле() (англоязычный синоним — AddField()). Использовать данный метод можно только перед созданием новой БД (до вызова метода СоздатьФайл()).

Синтаксис метода:

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

где

  • <Имя> — строковое выражение — имя создаваемого поля;
  • <Тип> — строковое или числовое выражение — тип создаваемого поля. Допустимые значения:
    • 1 или «N» — число;
    • 2 или «S» — строка;
    • 3 или «D» — дата;
    • 4 или «L» — логическое.
  • <Длина> — числовое выражение — общая длина создаваемого поля;
  • <Точность> — числовое выражение — длина создаваемого поля после десятичной точки (только для числовых полей).

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

ФайлБД = СоздатьОбъект("XBase");
// формируем структуру базы данных
ФайлБД.ДобавитьПоле("CODE", 1, 19, 0);
ФайлБД.ДобавитьПоле("FULLNAME", 2, 50, 0);

// создаем базу физически
ФайлБД.СоздатьФайл("mydb.dbf");

Добавить индекс в описание структуры базы данных позволяет метод ДобавитьИндекс(). Англоязычный синоним имени метода — AddIndex().

Синтаксис метода:

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

где

  • <Имя> — строковое выражение — имя создаваемого индекса;
  • <Выражение> — строковое выражение — выражение индекса;
  • <Уникальность> — числовое выражение — флаг уникальности индекса (1 — уникальный; 0 — не уникальный);
  • <Убывание> — числовое выражение — флаг направления убывания индекса (1 — индекс по убыванию значения ключа; 0 — по возрастанию значения ключа);
  • <Фильтр> — строковое выражение — фильтр индекса.

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

ФайлБД = СоздатьОбъект("XBase");
// формируем структуру базы данных
ФайлБД.ДобавитьПоле("CODE", 1, 19, 0);
ФайлБД.ДобавитьПоле("FULLNAME", 2, 50, 0);
ФайлБД.ДобавитьИндекс("IDXCODE", "CODE", 1, 0, "");
ФайлБД.ДобавитьИндекс("IDXNAME", "FULLNAME", 0, 0, "");

// создаем базу физически
ФайлБД.СоздатьФайл("mydb.dbf", "mydb.cdx");

Создать новый файл базы данных позволяет метод СоздатьФайл() (англоязычный синоним — CreateFile()). Если файл БД с таким именем уже существует, то выдаётся ошибка. Пример использования метода показан выше.

Синтаксис метода:

СоздатьФайл(<ПутьКБазе>, <ПутьКИндексу> )

где

  • <ПутьКБазе> — строковое выражение, содержащее путь к файлу базы данных;
  • <ПутьКИндексу> — строковое выражение, содержащее путь к индексному файлу базы данных. Параметр является необязательным и не используется, если не используется индексный файл.

Создать индексный файл позволяет метод СоздатьИндексныйФайл() (англоязычный синоним — CreateIndex()). Создаваемый индексный файл будет содержать все индексы, которые были созданы на текущий момент методом ДобавитьИндекс().

Синтаксис метода:

СоздатьИндексныйФайл(<ИмяФайла>)

где <ИмяФайла> — строковое выражение — имя индексного файла.

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

ФайлБД.ДобавитьИндекс("IDXCODE", "CODE", 1, 0, "");
ФайлБД.ДобавитьИндекс("IDXROOM", "ROOM+FULLNAME", 0, 0, "");

ФайлБД.СоздатьИндексныйФайл("IDXCNEW.CDX");

Другой пример:

ФайлDBF = КаталогИБ() + "lssotr.dbf";
ФайлCDX = КаталогИБ() + "lssotr.cdx";

// Проверяем наличие индексного файла на случай,
// если он был удалён вместе с остальными CDX-файлами
// при выполнении каких-либо действий с информационной базой
Если (ФС.СуществуетФайл(ФайлDBF)=1)И(ФС.СуществуетФайл(ФайлCDX)=0) Тогда
   // Если DBF-файл обнаружен, а CDX-файла нет
   ФайлБД = СоздатьОбъект("XBase");
   // Пытаемся открыть DBF-файл
   Попытка
      ФайлБД.ОткрытьФайл(ФайлDBF);
      Если ФайлБД.Открыта()=0 Тогда
         Сообщить("Не удалось открыть файл" + ФайлDBF, "!");
      Иначе
         // Если удалось открыть DBF-файл,
         // восстанавливаем файл CDX
         ФайлБД.ДобавитьИндекс("IDXCODE", "CODE", 1, 0, "");
         ФайлБД.СоздатьИндексныйФайл(ФайлCDX);
         ФайлБД.ЗакрытьФайл();
      КонецЕсли;
   Исключение
      Сообщить("Не удалось открыть файл" + ФайлDBF, "!");
      Сообщить("Код ошибки " + ФайлБД.КодОшибки(), "!");
   КонецПопытки;

   ФайлБД = 0;
КонецЕсли;

Методы для работы с файлами БД

Открыть существующую базу данных формата DBF позволяет метод ОткрытьФайл(). Англоязычный синоним имени метода — OpenFile().

Синтаксис метода:

ОткрытьФайл(<ПутьКБазе>, <ПутьКИндексу>, <ТолькоЧтение>)

где

  • <ПутьКБазе> — строковое выражение, содержащее путь к файлу базы данных;
  • <ПутьКИндексу> — строковое выражение, содержащее путь к индексному файлу базы данных. Параметр является необязательным и не используется, если не используется индексный файл;
  • <ТолькоЧтение> — числовое выражение, определяющее режим открытия. Возможные значения: 1 — файл открывается в режиме только чтения; 0 — файл открывается в режиме полного доступа (но в эксклюзивном режиме!). Параметр является необязательным. Значение по умолчанию — 0.

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

Процедура ОткрытиеФайла()
   ИмяФайла = "";
   ПутьКФайлу = "";
   // Выбираем файл
   ФС.ВыбратьФайл(0, ИмяФайла, ПутьКФайлу, , "*.*", , );
   ПолноеИмяФайла = ПутьКФайлу + ИмяФайла;
   // Пытаемся открыть файл
   ФайлБД.ОткрытьФайл(ПолноеИмяФайла);
   Если ФайлБД.Открыта() = 1 Тогда
      Предупреждение("БД открыта", 2);
   Иначе
      Предупреждение("Не удалось открыть БД!", 2);
   КонецЕсли;
КонецПроцедуры

Проверить, открыта ли база данных, позволяет метод Открыта() (англоязычный синоним — IsOpen()). Параметров у этого метода нет. Возвращаемым значением метода является число 1, если база открыта, или 0, если база не открыта.

Пример использования:

ФайлБД.ОткрытьФайл(ПутьКФайлу);
Если ФайлБД.Открыта() = 1 Тогда
   // работаем с базой
   . . .

КонецЕсли;

Закрыть открытую ранее или созданную базу данных формата DBF позволяет метод ЗакрытьФайл() (англоязычный синоним — CloseFile()). Параметры и возвращаемое значение у этого метода отсутствуют.

Пример использования:

Процедура ЗакрытиеФайла()
   Если ФайлБД.Открыта() = 1 Тогда
      ФайлБД.ЗакрытьФайл();
   КонецЕсли;
КонецПроцедуры

Методы для работы с содержимым файла БД

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

Синтаксис метода:

КодоваяСтраница(<Режим>)

где <Режим> — числовое выражение, определяющее режим кодировки. Возможные значения: 0 — Windows-кодировка; 1 — DOS-кодировка. Параметр является необязательным и не используется в случае применения метода для получения текущего числового значения режима кодировки.

Примечание: После открытия, XBase-объект всегда находится в режиме DOS-кодировки.

Пример использования:

Если ФайлБД.Открыта() = 1 Тогда
   ФайлБД.КодоваяСтраница(1);
   ФайлБД.ТекущийИндекс("FULLNAME");
   ФайлБД.Первая();
   . . .


КонецЕсли;

Получить количество записей в базе данных позволяет метод КоличествоЗаписей() (англоязычный синоним — RecCount()). Возвращаемым значением метода является числовое значение соответствующее общему количеству записей, включая те, которые помечены как удалённые. Параметры у данного метода отсутствуют.

Пример использования:

Сообщить("Записей — " + Строка(ФайлБД.КоличествоЗаписей()));

Узнать количество полей в базе данных позволяет метод КоличествоПолей() (англоязычный синоним — FieldCount()). Параметры у метода отсутствуют. Метод может быть использован при работе с базой данных неизвестной заранее структуры.

Пример использования:

Процедура ОписаниеПолей()

   Перем ИмяПоля;
   Перем Тип;
   Перем Длина;
   Перем Точность;

   СписЗнач = СоздатьОбъект("СписокЗначений");
   СписЗнач.УдалитьВсе();
   Для НомПоля=1 По ФайлБД.КоличествоПолей() Цикл
      ФайлБД.ОписаниеПоля(НомПоля, ИмяПоля, Тип, Длина, Точность);
      СписЗнач.ДобавитьЗначение("" + НомПоля + "; " + ИмяПоля + "; " + 
                                Тип + "; " + Длина + "; " + Точность);
   КонецЦикла;
КонецПроцедуры

Включить/отключить режим автоматического сохранения изменений в БД позволяет метод Автосохранение() (англоязычный синоним — AutoSave()). Возвращаемым значением метода является текущее числовое значение режима автосохранения на момент до исполнения метода.

При отключенном режиме автосохранения после внесения каких-либо изменений в текущую запись базы данных необходимо вызвать метод Записать(), прежде чем перейти к следующей записи. Иначе внесённые в базу изменения не сохранятся. При включенном режиме автосохранения запись изменений при перепозиционировании происходит автоматически (без вызова метода Записать()). А при необходимости можно и отказаться от внесённого изменения с помощью метода Отменить() (при этом восстанавливаются значения полей записи, которые были до внесения изменений).

Синтаксис метода:

Автосохранение(<Режим> )

где <Режим> — числовое выражение, определяющее режим автоматического сохранения изменений в базе. Возможные значения: 1 — установить режим автосохранения; 0 — снять режим автосохранения. Параметр является необязательным и не используется в случае применения метода для получения текущего числового значения режима автосохранения.

Пример, демонстрирующий работу метода:

ФайлБД.Автосохранение(1);
ФайлБД.Добавить();
ФайлБД.FIO = "Иванов";
ФайлБД.PHONE = 215;
ФайлБД.Добавить();         // произошла запись
ФайлБД.FIO = "Петров";
ФайлБД.PHONE = 314;
ФайлБД.Отменить();
ФайлБД.Добавить();         // записи не произошло
ФайлБД.Автосохранение(0);
ФайлБД.FIO = "Петров";
ФайлБД.PHONE = 314;
ФайлБД.Записать();         // произошла запись
ФайлБД.Добавить();
ФайлБД.FIO = "Сидоров";
ФайлБД.PHONE = 315;
ФайлБД.Добавить();         // записи не произошло

Установить/определить текущий индекс работы с базой позволяет метод ТекущийИндекс() (англоязычный синоним — CurrentIndex()). Установка текущего индекса работы с базой оказывает влияние на работу методов Найти(), НайтиПоКлючу(), Первая(), Последняя(), Следующая() и Предыдущая(). Возвращаемым значением метода является строковое значение с названием текущего индекса на момент до выполнения метода.

Синтаксис метода:

ТекущийИндекс(<НазваниеИндекса>)

где <НазваниеИндекса> — строковое выражение с названием индекса. Если параметр опущен, изменения текущего индекса не происходит.

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

Процедура НайтиПоИндексу(НовИнд)
   ИмяТекИнд = ФайлБД.ТекущийИндекс(НовИнд);
   ФайлБД.Первая();
   // восстанавливаем преждний индекс
   ФайлБД.ТекущийИндекс(ИмяТекИнд);
КонецПроцедуры

Другой пример:

Функция ПолучитьЛС(ТабНомер)

   // Функция поиска записи в DBF-файле по указанному ключу

   ФайлБД.ТекущийИндекс("IDXCODE");
   Если ФайлБД.Найти(ТабНомер, 0) = 1 Тогда
      ЛицевойСчет = СокрЛП(ФайлБД.ACCOUNT);
   Иначе
      ЛицевойСчет = "";
   КонецЕсли;

   Возврат ЛицевойСчет;

КонецФункции

Узнать о достижении начала файла при перемещении по записям позволяет метод ВНачале() (англоязычный синоним — BOF()). Параметры у метода отсутствуют. Возвращаемым значением метода будет число 1, если достигнуто начало файла, или 0, начало файла не достигнуто.

Пример использования:

Функция СредняяСтоимостьПокупки()
   // просматриваем записи, начиная с последней
   ФайлБД.Последняя();
   Уплачено = 0;
   Записей = 0;
   Пока ФайлБД.Вначале() = 0 Цикл
      // пока не достигнуто начало файла
      Уплачено = Уплачено + ФайлБД.AMOUNT;
      Записей = Записей + 1;
      ФайлБД.Предыдущая();
   КонецЦикла;
   Если Записей > 0 Тогда
      Уплачено = Уплачено / Записей;
   КонецЕсли;
   Возврат Уплачено;
КонецФункции

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

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

Функция МаксимальнаяПокупка()
   // просматриваем записи, начиная с первой
   ФайлБД.Первая();
   Уплачено = 0;
   Пока ФайлБД.ВКонце() = 0 Цикл
      // пока не достигнут конец файла
      Если ФайлБД.AMOUNT > Уплачено Тогда
         Уплачено = ФайлБД.AMOUNT;
      КонецЕсли;
      ФайлБД.Следующая();
   КонецЦикла;
   Возврат Уплачено;
КонецФункции

Добавить новую пустую запись в БД позволяет метод Добавить() (англоязычный синоним — Add()). Поля строкового типа новой записи имеют значение "" (пустая строка), числового типа — 0, логического — 0, поля типа "Дата" — значение «пустая дата» ("00.00.00"). Параметры у данного метода отсутствуют.

Пример использования:

Процедура ДобавитьЗапись(Знач1, Знач2)
   ФайлБД.Добавить();
   // Инициируем поля новой записи
   ФайлБД.FULLNAME = Знач1;
   ФайлБД.PHONE = Знач2;
   ФайлБД.Записать();
КонецПроцедуры

Перейти на первую запись в базе данных позволяет метод Первая() (англоязычный синоним — First()). Если не установлен текущий индекс, объект позиционируется на самую первую запись в БД, если установлен — на запись, имеющую самое младшее значение выражения текущего индекса (если индекс создавался с установленным флагом «Убывание», то наоборот). Параметры у этого метода отсутствуют. Возвращаемым значением метода является число 1, если действие выполнено, или 0, если действие не выполнено.

Пример использования:

Если ФайлБД.Открыта() = 0 Тогда
   ФайлБД.КодоваяСтраница(1);
   ФайлБД.ТекущийИндекс("NAME");
   ФайлБД.Первая();
   ...

КонецЕсли;

Перейти на последнюю запись в базе данных позволяет метод Последняя() (англоязычный синоним — Last()). Если не установлен текущий индекс, объект позиционируется на самую последнюю запись в БД, если установлен — на запись, имеющую самое старшее значение выражения текущего индекса (если индекс создавался с установленным флагом «Убывание», то наоборот). Параметры у этого метода отсутствуют. Возвращаемым значением метода является число 1, если действие выполнено, или 0, если действие не выполнено.

Пример использования:

// Вычисляет сумму полей AMOUNT всех существующих записей,
// начиная с последней записи и двигаясь к первой
Функция ВычислитьСумму()
   ФайлБД.Последняя();
   Сумма = 0;
   Пока ФайлБД.Вначале() = 0 Цикл
      Сумма = Сумма + ФайлБД.AMOUNT;
      ФайлБД.Предыдущая();
   КонецЦикла;
   Возврат Сумма;
КонецФункции

Позиционировать объект на следующую запись позволяет метод Следующая() (англоязычный синоним — Next()). В зависимости от того, установлен ли текущий индекс, позиционирование происходит либо в порядке возрастания физического номера записи, либо в порядке возрастания значения выражения текущего индекса (если индекс создавался с установленным флагом «Убывание», то в порядке убывания). Параметры у данного метода отсутствуют. Возвращаемым значением метода является число 1, если найдена следующая запись, или 0, если следующая запись не найдена.

Пример использования:

// Обнуляет значения всех полей всех существующих записей
Процедура ОчиститьЗапись()
   ФайлБД.Первая();
   Пока 1 = 1 Цикл   // ораганизуем бесконечный цикл
      ФайлБД.Очистить();
      ФайлБД.Записать();
      Если ФайлБД.Следующая() = 0 Тогда
         // если записи закончились
         Возврат;
      КонецЕсли;
   КонецЦикла;
КонецПроцедуры

Перейти на предыдущую запись позволяет метод Предыдущая() (англоязычный синоним — Prev()). В зависимости от того, установлен ли текущий индекс, позиционирование происходит либо в порядке убывания физического номера записи, либо в порядке убывания значения выражения текущего индекса (если индекс создавался с установленным флагом «Убывание», то в порядке возрастания). Параметры у данного метода отсутствуют. Возвращаемым значением метода является число 1, если найдена предыдущая запись, или 0, если предыдущая запись не найдена.

Пример использования:

// Вычисляет сумму полей AMOUNT всех существующих записей,
// начиная с последней записи и двигаясь к первой
Функция ВычислитьСумму()
   ФайлБД.Последняя();
   Сумма = 0;
   Пока ФайлБД.Вначале() = 0 Цикл
      Сумма = Сумма + ФайлБД.AMOUNT;
      ФайлБД.Предыдущая();
   КонецЦикла;
   Возврат Сумма;
КонецФункции

Перейти на запись по её физическому порядковому номеру в базе данных позволяет метод Перейти() (англоязычный синоним — GoTo()). Переход происходит на любую запись, даже если она помечена как удалённая и режим просмотра удалённых записей не включен.

Синтаксис метода:

Перейти(<НомерЗаписи>)

где <НомерЗаписи> — числовое выражение — физический порядковый номер записи в БД.

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

Процедура ИнформацияОЗаписи(НомЗап)
   ФайлБД.Перейти(НомЗап);
   Стр3ап = "н." + ФайлБД.НомерЗаписи();
   Стр3ап = Стр3ап + " Уд. " + ФайлБД.ЗаписьУдалена();
   Стр3ап = СтрЗап + " Содержит -";
   Для НомПоля=1 По ФайлБД.КоличествоПолей() Цикл
      СтрЗап = СтрЗап + Строка(ФайлБД.ПолучитьЗначениеПоля(НомПоля))+"; ";
   КонецЦикла;
   Предупреждение(СтрЗап, 10);
КонецПроцедуры

Найти запись, соответствующую заданному значению ключа по текущему индексу и режиму поиска, переданному в качестве параметра позволяет метод Найти() (англоязычный синоним — Find()). После вызова метода указатель устанавливается на найденную запись. Возвращаемым значением метода является число 1, если действие выполнено (запись найдена), или 0, если действие не выполнено.

Следует отметить, что вычисление значения индекса при работе XBase-объекта с базой данных производится объектом самостоятельно на основании выражения, переданного ему при создании ключа. При вызове данного метода значение <Ключ> должно быть вычислено средствами встроенного языка, что может представлять определённые трудности, если индекс составной, поля, включенные в выражение индекса, отличны от строковых и т.д. Поэтому применимость данного метода ограничена случаем использования простых строковых выражений индекса. В более сложных случаях следует применять универсальный метод НайтиПоКлючу(), который описан ниже.

Синтаксис:

Найти(<Ключ>, <Режим>)

где

  • <Ключ> — строковое выражение со значением выражения текущего индекса;
  • <Режим> — числовое выражение — режим поиска записей. Возможные значения:
    • 0 — искать запись на точное соответствие ключу (=);
    • 1 — искать запись на точное соответствие с ключом или большую (>=);
    • 2 — искать запись с большим ключом (>);
    • −1 (минус единица) — искать запись на точное соответствие с ключом или меньшую (<=);
    • −2 (минус два) — искать запись с меньшим ключом (<).

Пример использования:

ЗаписьНайдена = ФайлБД.Найти("Иванов", 0);

Другой пример:

Функция ПолучитьЛС(ТабНомер)

   // Функция поиска записи в DBF-файле по указанному ключу

   ФайлБД.ТекущийИндекс("IDXCODE");
   Если ФайлБД.Найти(ТабНомер, 0) = 1 Тогда
      ЛицевойСчет = СокрЛП(ФайлБД.ACCOUNT);
   Иначе
      ЛицевойСчет = "";
   КонецЕсли;

   Возврат ЛицевойСчет;

КонецФункции

Найти запись, соответствующую значениям атрибутов агрегатного объекта типа "Ключ" XBase-объекта по текущему индексу и режиму поиска, переданному в качестве параметра позволяет метод НайтиПоКлючу() (англоязычный синоним — FindByKey()). После вызова метода указатель устанавливается на найденную запись. Перед вызовом метода следует установить значения всех атрибутов агрегатного объекта типа "Ключ", которые участвуют в вычислении выражения текущего индекса. Возвращаемым значением метода является число 1, если действие выполнено (запись найдена), или 0, если действие не выполнено.

Синтаксис:

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

где <Режим> — числовое выражение — режим поиска записей. Возможные значения:

  • 0 — искать запись на точное соответствие ключу (=);
  • 1 — искать запись на точное соответствие с ключом или большую (>=);
  • 2 — искать запись с большим ключом (>);
  • −1 (минус единица) — искать запись на точное соответствие с ключом или меньшую (<=);
  • −2 (минус два) — искать запись с меньшим ключом (<).

Пример использования:

ФайлБД.Ключ.Name = "Иванов";
ФайлБД.Ключ.DIV_ID = 15;
// поиск по составному, неоднородному ключу
ЗаписьНайдена = ФайлБД.НайтиПоКлючу(0);

Получить физический порядковый номер текущей записи в файле базы данных позволяет метод НомерЗаписи() (англоязычный синоним — RecNo()). Параметров у данного метода нет. Возвращаемым значением метода является числовое значение.

Пример использования:

Процедура ПоказатьНомераУдаленныхЗаписей()
   РежимПоказаУдаленных = ФайлБД.ПоказыватьУдаленные(1);
   ФайлБД.Первая();
   Пока 1=1 Цикл
      Если ФайлБД.ЗаписьУдалена() = 1 Тогда
         Стр1 = "Номер удаленной записи — ";
         Стр2 = Строка(ФайлБД.НомерЗаписи());
         Предупреждение(Стр1 + Стр2, 3);
      КонецЕсли;
      Если ФайлБД.Следующая() = 0 Тогда
         Прервать;
      КонецЕсли;
   КонецЦикла;
   // восстанавливаем прежний режим
   ФайлБД.ПоказыватьУдаленные(РежимПоказаУдаленных);
КонецПроцедуры

Получить значение указанного поля текущей записи позволяет метод ПолучитьЗначениеПоля() (англоязычный синоним — GetFieldValue()). Тип возвращаемого значения зависит от типа поля.

Синтаксис метода:

ПолучитьЗначениеПоля(<Поле>)

где <Поле> — строковое выражение с названием поля или числовое выражение с номером поля.

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

Процедура ИнформацияОЗаписи(НомЗап)
   ФайлБД.Перейти(НомЗап);
   Стр3ап = "н." + ФайлБД.НомерЗаписи();
   Стр3ап = Стр3ап + " Уд. " + ФайлБД.ЗаписьУдалена();
   Стр3ап = СтрЗап + " Содержит -";
   Для НомПоля=1 По ФайлБД.КоличествоПолей() Цикл
      СтрЗап = СтрЗап + Строка(ФайлБД.ПолучитьЗначениеПоля(НомПоля))+"; ";
   КонецЦикла;
   Предупреждение(СтрЗап, 10);
КонецПроцедуры

Установить новое значение для указанного поля текущей записи позволяет метод УстановитьЗначениеПоля(). Англоязычный синоним имени метода — SetFieldValue().

Синтаксис метода:

УстановитьЗначениеПоля(<Поле>, <Значение>)

где

  • <Поле> — строковое выражение с названием поля или числовое выражение с номером поля;
  • <Значение> — устанавливаемое значение поля.

Пример использования:

ФайлБД.УстановитьЗначениеПоля("FULLNAME", "Иванов С.Н.");

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

Пример использования:

// Обнуляет значения всех полей всех существующих записей
Процедура ОчиститьЗапись()
   ФайлБД.Первая();
   Пока 1 = 1 Цикл   // ораганизуем бесконечный цикл
      ФайлБД.Очистить();
      ФайлБД.Записать();
      Если ФайлБД.Следующая() = 0 Тогда
         // если записи закончились
         Возврат;
      КонецЕсли;
   КонецЦикла;
КонецПроцедуры

Выполнить запись изменений в базу данных позволяет метод Записать() (англоязычный синоним — Save()). До его вызова все изменения объекта производятся только в памяти и лишь после вызова метода переносятся в файл БД. Метод используется при отключенном режиме автосохранения. Параметры у метода отсутствуют.

Пример использования:

ФайлБД.Автосохранение(0);
ФайлБД.FIO = "Петров";
ФайлБД.PHONE = 314;
ФайлБД.Записать();         // запись произведена

Отменить запись изменений в базу данных при включенном режиме автосохранения позволяет метод Отменить() (англоязычный синоним — Cancel()). Параметры у данного метода отсутствуют.

Пример использования:

ФайлБД.Автосохранение(1);
ФайлБД.Добавить();
ФайлБД.FIO = "Петров";
ФайлБД.PHONE = 314;
ФайлБД.Отменить();
ФайлБД.Добавить();   // предыдущие изменения не сохранились

Получить номер поля по его названию позволяет метод НомерПоля() (англоязычный синоним — FieldNo()). Возвращаемым значением метода является числовое значение номера поля.

Синтаксис метода:

НомерПоля(<ИмяПоля>)

где <ИмяПоля> — строковое выражение, содержащее названием поля.

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

НомПоля = ФайлБД.НомерПоля("CODE");

Получить описание поля по указанному номеру поля позволяет метод ОписаниеПоля(). Англоязычный синоним имени метода — GetFieldInfo().

Синтаксис метода:

ОписаниеПоля(<Номер>, <Имя>, <Тип>, <Длина>, <Точность>)

где

  • <Номер> — числовое выражение — номер поля БД, для которого требуется получить описание;
  • <Имя> — идентификатор переменной, в которую данный метод вернёт названия поля;
  • <Тип> — идентификатор переменной, в которую данный метод вернет числовое значение типа поля:
    • 1 — число;
    • 2 — строка;
    • 3 — дата;
    • 4 — логическое.
  • <Длина> — идентификатор переменной, в которую данный метод вернет числовое значение — общую длину поля;
  • <Точность> — идентификатор переменной, в которую данный метод вернет числовое значение — длину поля после десятичной точки (только для числовых полей).

Пример использования:

Процедура ОписаниеПолей()

   Перем ИмяПоля;
   Перем Тип;
   Перем Длина;
   Перем Точность;

   СписЗнач = СоздатьОбъект("СписокЗначений");
   СписЗнач.УдалитьВсе();
   Для НомПоля=1 По ФайлБД.КоличествоПолей() Цикл
      ФайлБД.ОписаниеПоля(НомПоля, ИмяПоля, Тип, Длина, Точность);
      СписЗнач.ДобавитьЗначение("" + НомПоля + "; " + ИмяПоля + "; " + 
                                Тип + "; " + Длина + "; " + Точность);
   КонецЦикла;
КонецПроцедуры

Добавить в БД новую запись путём копирования текущей позволяет метод Скопировать() (англоязычный синоним — Copy()). Параметров и возвращаемого значения у метода нет.

Пример использования:

Процедура КопироватьЗапись()
   ФайлБД.Скопировать();
   ФайлБД.Записать();
КонецПроцедуры

Пометить текущую запись как удалённую позволяет метод Удалить() (англоязычный синоним — Del()). Физически запись при этом из базы данных не удаляется и может быть впоследствии восстановлена. Полное удаление записей из БД с освобождением дискового пространства, занятого ими, производится вызовом методов Сжать() и ОчиститьФайл().

Пример использования:

Процедура УдалитьЗапись(Номер)
   ФайлБД.Перейти(Номер);
   ФайлБД.Удалить();
   ФайлБД.Записать();
КонецПроцедуры

Удалить все записи в базе данных позволяет метод ОчиститьФайл() (англоязычный синоним — Zap()). Параметров у метода нет. При вызове данного метода все существующие записи удаляются физически и не могут быть впоследствии восстановлены.

Пример использования:

Процедура ОчиститьБД()
   Если Вопрос("Вы уверены, что хотите очистить базу?", 1, 5) = 1 Тогда
      ФайлБД.ОчиститьФайл();
   КонецЕсли;
КонецПроцедуры

Методы для работы с записями, помеченными как удалённые

Определить и изменить режим показа удалённых (помеченных как удалёные) записей в базе позволяет метод ПоказыватьУдаленные() (англоязычный синоним — ShowDeleted()). Возвращаемым значением метода является текущее числовое значение режима показа удалённых записей в базе (на момент до исполнения метода).

Примечание: При включенном режиме показа удалённых записей записи, помеченные как удалённые, становятся «видны» для методов Первая(), Последняя(), Следующая() и Предыдущая().

Синтаксис метода:

ПоказыватьУдаленные(<Режим>)

где <Режим> — числовое выражение, определяющее режим показа удалённых записей в базе данных. Возможные значения: 1 — установить режим показа удалённых записей в базе; 0 — отменить режим показа удалённых записей в базе.

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

Процедура ПоказатьНомераУдаленныхЗаписей()
   Режим = ФайлБД.ПоказыватьУдаленные(1);
   ФайлБД.Первая();
   Пока 1=1 Цикл
      Если ФайлБД.ЗаписьУдалена() = 1 Тогда
         Сообщить("Номер удаленной записи — " +
                  Строка(ФайлБД.НомерЗаписи()));
      КонецЕсли;
      Если ФайлБД.Следующая() = 0 Тогда
         Прервать;
      КонецЕсли;
   КонецЦикла;
   // восстанавливаем прежний режим
   ФайлБД.ПоказыватьУдаленные(Режим);
КонецПроцедуры

Получить значение флага пометки на удаление текущей записи позволяет метод ЗаписьУдалена() (англоязычный синоним — RecDeleted()). Параметры у метода отсутствуют. Возвращаемым значением метода является число 1, если запись помечена как удалённая, или 0, если запись не имеет такой пометки.

Пример использования:

Процедура Восстановить3аписи()
   Режим = ФайлБД.ПоказыватьУдаленные(1);
   ФайлБД.Первая();
   Пока 1=1 Цикл
      Если ФайлБД.ЗаписьУдалена() = 1 Тогда
         ФайлБД.Восстановить();
         ФайлБД.Записать();
      КонецЕсли;
      Если ФайлБД.Следующая() = 0 Тогда
         // восстанавливаем прежний режим
         ФайлБД.ПоказыватьУдаленные(Режим);
         Возврат;
      КонецЕсли;
   КонецЦикла;
КонецПроцедуры

Восстановить текущую запись (убрать с записи флаг «удалена») позволяет метод Восстановить() (англоязычный синоним — Recall()). Параметры и возвращаемое значение у метода отсутствуют. Пример использования метода был приведён выше.

Физически удалить записи, помеченные как удалённые, и тем самым уменьшить размер файла БД позволяет метод Сжать() (англоязычный синоним — Pack()). Параметров у данного метода нет.

Пример использования:

Процедура СжатьБД()
   Если Вопрос("Уничтожить записи, c пометкой 'удалена'?", 1, 5) = 1 Тогда
      ФайлБД.Сжать();
   КонецЕсли;
КонецПроцедуры

Методы для работы с индексами

Узнать количество индексов в открытом индексном файле позволяет метод КоличествоИндексов() (англоязычный синоним — IndexCount()). Он может быть использован при работе с базой данных неизвестной заранее структуры. Параметры у данного метода отсутствуют.

Пример использования:

Процедура ОписаниеИндекса()

   Перем Назв;
   Перем Выр;
   Перем Уник;
   Перем Убыв;
   Перем Филт;

   СпЗнач = СоздатьОбъект("СписокЗначений");
   СпЗнач.УдалитьВсе();
   Для Ном=1 По ФайлБД.КоличествоИндексов() Цикл
      ФайлБД.ОписаниеИндекса(Ном, Назв, Выр, Уник, Убыв, Филт);
      СпЗнач.ДобавитьЗначение("" + Ном + "; " + Назв + "; " + Выр +
                              "; " + Уник + "; " + Убыв + "; " + Филт);
   КонецЦикла;
КонецПроцедуры

Получить описание индекса по указанному номеру индекса позволяет метод ОписаниеИндекса() (англоязычный синоним — GetIndexInfo()). Пример использования метода приведён выше.

Синтаксис метода:

ОписаниеИндекса(<Номер>, <Название>, <Выражение>,
                <Уникальность>, <Убывание>, <Фильтр>)

где

  • <Номер> — числовое выражение — номер индекса, для которого требуется получить описание;
  • <Название> — идентификатор переменной, в которую данный метод вернет строковое значение — название индекса;
  • <Выражение> — идентификатор переменной, в которую данный метод вернет строковое значение — выражение индекса;
  • <Уникальность> — идентификатор переменной, в которую данный метод вернет числовое значение — флаг уникальности индекса. Возможные значения: 1 — уникальный; 0 — не уникальный;
  • <Убывание> — идентификатор переменной, в которую данный метод вернет числовое значение — флаг направления убывания индекса. Возможные значения: 1 — индекс по убыванию значения ключа. 0 — по возрастанию значения ключа;
  • <Фильтр> — идентификатор переменной, в которую данный метод вернет строковое значение — фильтр индекса.

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

Пример использования:

Процедура ПереиндексацияБД()
   Если ФлагАварийногоЗавершения = 1 Тогда
      ФайлБД.Переиндексировать();
   КонецЕсли;
КонецПроцедуры

Примечание: Объекты типа "XBase" автоматически выполняют индексацию при изменениях базы данных, однако, при работе более чем с одним индексным файлом или после аварийных завершений может потребоваться принудительная переиндексация (для «своих» информационных баз система «1С:Предприятие» выполняет это автоматически).

Методы для работы с ошибками

Получить код последней ошибки позволяет метод КодОшибки() (англоязычный синоним — ErrorCode()). Параметры у метода отсутствуют.

Пример использования:

ФайлБД = СоздатьОбъект("XBase");
// Пытаемся открыть DBF-файл
Попытка
   ФайлБД.ОткрытьФайл("lssotr.dbf");
   // Работаем с DBF-файлом
   ...

Исключение
   Сообщить("Не удалось открыть файл lssotr.dbf", "!");
   Сообщить("Код ошибки " + ФайлБД.КодОшибки(), "!");
КонецПопытки;

Возможные коды ошибок:

Код ошибкиПричина ошибки
-10Ошибка закрытия файла
-20Ошибка создания файла
-30Ошибка определения длины файла
-40Ошибка установки длины файла
-50Ошибка при попытке заблокировать файл
-60Ошибка при открытии файла
-70Ошибка чтения файла
-80Ошибка удаления файла
-90Ошибка переименования файла
-100Ошибка позиционирования в файле
-110Ошибка снятия блокировки с файла
-120Ошибка записи в файл
-200Файл не является БД DBF формата
-210Неопознанное имя поля
-220Неопознанный тип поля
-230Запись слишком длинная
-300Индексный файл не содержит информации о записи
-310Нарушение структуры индексного файла
-330Указанное имя индекса недоступно
-340Ошибка уникальности индекса
-400Ожидается запятая или скобка
-410Выражение не завершено
-422IIF() требует параметров одинаковой длины
-425У STR() и SUBSTR() 2-ой и 3-ий параметры — константы
-430Неверное число параметров
-440Слишком сложное выражение
-450Пропущена правая скобка
-460Неверный тип подвыражения
-470Неопознанная функция
-480Неопознанный оператор
-490Неопознанное значение
-500Выражение не завершено символом двойной кавычки
-920Недостаточно памяти

Выражение и фильтр индекса

При работе с индексами XBase-объекты производят вычисление выражения индекса и фильтра. Выражение индекса и фильтра — это строковые выражения, составленные на специальном языке объектов типа "XBase".

Выражение индекса используется для вычисления значения ключа для каждой записи базы данных. Результатом вычисления выражения должно быть значение одного из следующих типов: числовое, строковое, дата или булево. Выражение фильтра должно возвращать результат типа булево. Если значение выражения фильтра для конкретной записи базы данных равно истине, информация об этой записи будет включена в индексный файл, в противном случае индексный файл не будет содержать информацию об этой записи и позиционирование на эту запись XBase-объекта с данным текущим индексом производиться не будет.

Атрибуты (кроме Ключ), константы и функции могут быть использованы как части выражений. Части выражения могут объединяться с помощью других функций или операторов. Простейшим выражением может быть имя атрибута, например, "FULLNAME". В таком случае тип выражения будет соответствовать типу атрибута.

Константы (литералы) могут иметь числовой, строковый и булевый тип. Строковые константы заключаются в одиночные кавычки. При необходимости включить в состав строковой константы символа двойной кавычки, его следует предварять обратной косой чертой, например, 'Фирма \"Вега\"'. Булевы константы записываются как .TRUE. или .Т. для обозначения истины и .FALSE. или .F. в противном случае.

Операторы используются для объединения частей выражения. Части выражения должны иметь тип, соответствующий оператору, например, оператор «/» (деление) работает с двумя числовыми значениями.

Порядок выполнения операторов в выражении соответствует общепринятому — с учётом скобок и приоритетов операторов. Например, выражение "1+2*3" возвратит 7, а "(1+2)*3" возвратит 9.

Числовые операторы:

Имя оператораОбозначениеПриоритет
Сложение+5
Вычитание5
Умножение*6
Деление/6
Возведение в степень** или ^7

Строковые операторы:

Имя оператораОбозначениеПриоритет
Объединение 1+5
Объединение 25

Оператор «Объединение 2» немного отличается тем, что пробелы в конце первой строки будут перемещены в конец результата. Например, результатом вычисления выражения "'Иванов ' + 'И. И.'" будет "Иванов И. И.", а "'Иванов ' - 'И. И.'" — "ИвановИ.И. ".

Операторы отношений:

Имя оператораОбозначениеПриоритет
Равно=4
Не равно<> или #4
Меньше<4
Больше>4
Меньше или равно<=4
Больше или равно>=4
Содержит$4

Примеры:

"'CD' $ 'ABCD'" вернёт ".Т."
"8 < 7" вернёт ".F."

Логические операторы:

Имя оператораОбозначениеПриоритет
Отрицание.NOT.3
И.AND.2
ИЛИ.OR.1

Функции, применяемые в выражениях:

ФункцияПараметр(ы)Возвращаемое значение
DATE() Тип даты. Системная дата
DAY(Date)Тип датыЧисло. Номер дня в месяце
DTOC(Date)Тип датыСтрока. Представление даты в формате ММ/ДД/ГГ
DTOS(Date)Тип датыСтрока. Представление даты в формате ГГГГММДД
IIF(Log, IfTrue, IfFalse)Log – выражение булева типа. IfTrue, IfFalse — тип определяется во время исполнения. Должны иметь одинаковую длину и типТип совпадает с типом IfTrue и IfFalse. Возвращает IfTrue, если значение вычисленного выражения Log равно истине, и IfFalse в противном случае
LTRIM(String)String – строкаСтрока. Исходная строка без ведущих пробелов
Month(Date)Date – датаЧисло. Номер месяца в году
STOD(String)String – строка. Представление даты в формате ГГГГММДДТип даты. Преобразованное в дату значение исходной строки
STR(Number, Length, Decim)Namber – число. Преобразуемое число. Length — число. Количество символов в возвращаемой строке, включая десятичную точку. Decim — число. Желаемое количество знаков после точкиСтрока. Результат преобразования числа в строковое представление
SUBSTR(String, StartPos, Num)String – строка. Исходная строка. StartPos — число. Начальная позиция. Num — число. Количество символовСтрока. Подстрока, состоящая из Num символов от начальной позиции исходной строки
TIME() Строка. Системное время в представлении ЧЧ:ММ:СС
TRIM(String)String — строкаСтрока. Исходная строка без заключительных пробелов
UPPER(String)String — строкаСтрока. Преобразование к верхнему регистру
VAL(String)String — строкаЧисло. Преобразование строки в число
YEAR(Date)Date — датаЧисло. Год

Другие статьи по схожей тематике