Тема 12 Работа с DBF–файлами
Цель:
познакомится с понятием и областью применения агрегатного типа XBase;
приобрести и закрепить навыки применения методов для работы с XBase для загрузки данных из базы данных или для выгрузки данных в базу данных.
Пояснения к работе
Для работы с базами данных формата DBF в системе может использоваться специальный агрегатный тип данных – XBase. Механизм работы с базами данных формата DBF предназначен для обеспечения возможности манипулирования ими непосредственно из встроенного языка программы 1С: Предприятие. Основное назначение объектов XBase – организация экспорта–импорта информации в/из внешних файлов формата DBF. Каждый XBase–объект может быть связан с одним файлом базы данных.
Объект создается при помощи функции СоздатьОбъект() с ключевым словом XBase, ссылка на который присваивается переменной:
Пример:
ДБФ = СоздатьОбъект("XBase");
Объекты XBase имеют динамически изменяемый набор атрибутов, состав и тип которых зависит от структуры файла базы данных, с которым связан конкретный объект. Объект содержит в своих атрибутах информацию об одной текущей записи. Каждому полю файла базы данных соответствует один атрибут объекта. Наименование атрибута совпадает с именем поля.
В тексте программного модуля под термином <Поле> понимается имя конкретного столбца файла базы данных, с которым связан объект. Атрибут имеет смысл, только если файл базы данных находится в открытом состоянии. Состав атрибутов объекта может динамически изменяться в процессе исполнения 1С:Предприятия и определяется набором полей файла базы данных, с которым объект связан в данных момент времени.
Пример:
ФИО = ДБФ.FIO;
Объекты XBase не поддерживают поля типа memo.
Помимо работы с существующими базами данных, агрегатный тип XBase имеет набор методов, позволяющих создать новую базу данных произвольной структуры, новые индексы и новый индексный файл. Следует отметить, что, если использование методов, изменяющих структуру БД, возможно только для объектов, не связанных с базой данных (т. е. для вновь создаваемых БД), то создание новых индексов и индексного файла возможно как для создаваемых БД, так и для уже существующих и открытых.
12.1 Методы для работы с DBF–файлами
СоздатьФайл(<ПутьКБазе>, <ПутьКИндексу>) – создает новый файл базы данных формата DBF. Если база с таким именем существует, то выдается ошибка.
Параметры:
<ПутьКБазе> – строковое выражение, содержащее путь к файлу базы данных формата DBF.
<ПутьКИндексу> – необязательный параметр. Строковое выражение, содержащее путь к индексному файлу базы данных.
Пример:
ДБФ = СоздатьОбъект("XBase");
// Определение полей и индексов новой БД
// …
// Теперь физически создаем базу
ДБФ.СоздатьФайл("mydb.dbf", "mydb.cdx");
Открыта() – возвращает значение флага открытия файла базы данных.
Возвращаемое значение: 1 – база открыта; 0 – база не открыта.
ОткрытьФайл(<ПутьКБазе>, <ПутьКИндексу>, <ТолькоЧтение>) – открывает существующую базу данных формата DBF.
Параметры:
<ПутьКБазе> – строковое выражение, содержащее путь к файлу базы данных формата DBF.
<ПутьКИндексу> – необязательный параметр. Строковое выражение, содержащее путь к индексному файлу базы данных.
<ТолькоЧтение> – необязательный параметр. 1 – файл открывается в режиме только чтение; 0 – файл открывается в режиме полного доступа (при этом файл открывается в эксклюзивном режиме). Значение по умолчанию – 0.
Пример:
// Подразумевает, что объект ДБФ уже создан и
// доступен в данном контексте
ДБФ.ОткрытьФайл(ПутьДБ);
Если ДБФ.Открыта() = 1 Тогда
Предупреждение("База открыта");
Иначе
Предупреждение("Не смогли открыть Базу!");
КонецЕсли;
ЗакрытьФайл() – закрывает ранее открытую или созданную базу данных формата DBF.
Пример:
Если ДБФ.Открыта() = 1 Тогда
ДБФ.ЗакрытьФайл();
КонецЕсли;
ОчиститьФайл() – удаляет все записи в базе. При этом все существующие записи удаляются физически и не могут быть впоследствии восстановлены.
Пример:
Если Вопрос("Вы уверены, что надо очистить базу?", 1, 5) = 1 Тогда
ДБФ.ОчиститьФайл();
КонецЕсли;
Сжать() – удаляет записи, помеченные как удаленные.
Пример:
Если Вопрос("Уничтожить записи, помеченные как удаленные?", 1, 5) = 1 Тогда
ДБФ.Сжать();
КонецЕсли;
Переиндексировать() – выполняет переиндексирование базы. Объекты XBase автоматически выполняют индексацию при изменениях базы данных, однако, при работе более чем с одним индексным файлом или после аварийных завершений может потребоваться принудительная переиндексация (для «своих» БД система 1С:Предприятие выполняет это автоматически).
Пример:
Если ФлагАварийногоЗавершения = 1 Тогда
ДБФ.Переиндексировать();
КонецЕсли;
ПоказыватьУдаленные(<Режим>) – позволяет определить и изменить режим показа записей, помеченных на удаление в базе. В случае, если параметр не указан, изменения режима не происходит.
Параметры:
<Режим> – необязательный параметр. 1 – установить режим показа удаленных записей в базе. 0 – снять режим.
Возвращаемое значение: текущее числовое значение режима показа удаленных записей в базе (на момент до исполнения метода).
Пример:
РежПокУд = ДБФ.ПоказыватьУдаленные(1);
Первая() – предназначен для перехода на первую запись.
Возвращаемое значение: 1 – если действие выполнено; 0 – если действие не выполнено.
Пример:
// Обнуляет значения всех полей первой записи
ДБФ.Первая();
Последняя() – предназначен для перехода на последнюю запись.
Возвращаемое значение: 1 – если действие выполнено; 0 – если действие не выполнено.
Пример:
ДБФ.Последняя();
Следующая() – предназначен для позиционирования на следующую запись.
Возвращаемое значение: 1 – получена следующая запись; 0 – следующая запись не найдена.
ВКонце() – возвращает значение признака конца файла.
Возвращаемое значение: 1 – конец файла достигнут; 0 – конец файла не достигнут.
Пример:
ДБФ.Первая();
Пока ДБФ.ВКонце() = 0 Цикл
// действия с записью
ДБФ.Следующая();
КонецЦикла;
Предыдущая() – предназначен для перехода на предыдущую запись.
Возвращаемое значение: 1 – получена предыдущая запись; 0 – предыдущая запись не найдена.
НомерЗаписи() – возвращает физический порядковый номер текущей записи в файле базы данных. Результат не зависит от установки текущего индекса.
Возвращаемое значение: номер текущей записи.
Пример:
Ном=ДБФ НомерЗаписи();
Перейти(<НомерЗаписи>) – позволяет перейти на запись по ее физическому порядковому номеру в базе данных. Позволяет перейти на запись, помеченную удаленной, даже если не установлен режим просмотра удаленных записей.
Параметры:
<НомерЗаписи> – физический порядковый номер записи в базе данных.
Пример:
ДБФ.Перейти(3);
ВНачале() – возвращает значение признака начала файла.
Возвращаемое значение: 1 – начало файла не достигнуто; 0 – начало файла не достигнуто.
ТекущийИндекс(<НазваниеИндекса>) – устанавливает/определяет текущий индекс работы с базой. Установка текущего индекса работы с базой оказывает влияние на работу методов Найти(), НайтиПоКлючу(), Первая(), Последняя(), Следующая(), Предыдущая().
Параметры:
<НазваниеИндекса> – необязательный параметр. Строковое выражение с названием индекса. Если параметр опущен, изменения текущего индекса не происходит.
Возвращаемое значение: строковое значение с названием текущего индекса (на момент до выполнения метода).
Пример:
ИмяТекИнд = ДБФ.ТекущийИндекс(Инд);
ДБФ.Первая();
ДБФ.ТекущийИндекс(ИмяТекИнд);
Найти(<Ключ>, <Режим>) – позволяет найти запись, соответствующую данному значению <Ключ> ключа по текущему индексу и режиму поиска, переданному в качестве параметра. Указатель устанавливается на найденную запись.
Параметры:
<Ключ> – строковое выражение со значением выражения текущего индекса.
<Режим> – режим поиска записей:
0 – ищет запись на точное соответствие ключу (=);
1 – ищет запись на точное соответствие с ключом или большую (>=);
2 – ищет запись с большим ключом (>);
–1 (минус единица) – ищет запись на точное соответствие с ключом или меньшую(<=);
–2 (минус два) – ищет запись с меньшим ключом (<).
Возвращаемое значение: 1 – если запись найдена; 0 – если запись не найдена.
Пример:
ЗаписьНайдена = ДБФ.Найти("Иванов", 0);
ПолучитьЗначениеПоля(<НазваниеПоля>) – позволяет определить значение поля текущей записи.
Параметры:
<НазваниеПоля> – строковое выражение с названием поля или числовое выражение с номером поля.
Возвращаемое значение: значение поля записи, тип зависит от типа поля.
Пример:
Знач=ДБФ.ПолучитьЗначениеПоля("КП");
УстановитьЗначениеПоля(<НазваниеПоля>, <Значение>) – позволяет установить новое значение поля текущей записи.
Параметры:
<НазваниеПоля> – строковое выражение с названием поля или числовое выражение с номером поля.
<Значение> – значение поля.
Описание:
Пример:
ДБФ.УстановитьЗначениеПоля(НаименованиеПоля, 1234);
Добавить() – добавляет новую пустую запись. Для записи изменений в базу данных необходимо инициировать запись
Пример:
ДБФ.Добавить();
ДБФ.FIELD1 = Поле1;
ДБФ.FIELD2 = Поле2;
ДБФ.Записать();
Скопировать() – добавляет новую запись, копирующую текущую запись. Для записи изменений в базу данных необходимо инициировать запись
Пример:
ДБФ.Скопировать();
ДБФ.Записать();
Записать() – выполняет запись изменений в базу данных. До его вызова все изменения объекта производились только в памяти и будут потеряны при осуществлении перехода к другой записи или закрытии базы данных, если отключен режим автосохранения.
Автосохранение(<Режим>) – позволяет изменить режим автоматического сохранения изменений в базе. При установленном режиме автосохранения любые изменения позиционирования объекта приводит к автоматической записи изменений атрибутов (если они происходили с текущей записью) в базу данных. При сброшенном режиме автосохранения записи при изменении позиционирования не происходит – для этого нужно вызвать метод Записать(), причем до выполнения позиционирования.
Параметры:
<Режим> – необязательный параметр. 1 – установить режим автоматического сохранения изменений в базе. 0 – снять режим.
Возвращаемое значение: текущее числовое значение режима автоматического сохранения изменений в базе (на момент до исполнения метода).
Пример:
ДБФ.Автосохранение(1);
ДБФ.Новая();
ДБФ.FIO = "Иванов";
ДБФ.PHONE = 215;
ДБФ.Новая(); // Произошла запись
ДБФ.FIO = "Петров";
ДБФ.PHONE = 215;
ДБФ.Отменить();
ДБФ.Новая(); // Записи не произошло
ДБФ.Автосохранение(0);
ДБФ.FIO = "Петров";
ДБФ.PHONE = 314;
ДБФ.Записать(); // Произошла запись
ДБФ.Новая();
ДБФ.FIO = "Сидоров";
ДБФ.PHONE = 215;
ДБФ.Новая(); // Записи не произошло
Отменить() – отменяет запись изменения в базу.
Удалить() – помечает текущую запись на удаление. Физически запись из базы данных не удаляется и может быть впоследствии восстановлена. Полное удаление записей из БД с освобождением дискового пространства, занятого ими, производится вызовом методов Сжать() и ОчиститьФайл().
Пример:
ДБФ.Удалить();
ЗаписьУдалена() – возвращает значение флага пометки текущей записи на удаление.
Возвращаемое значение: 1 – запись помечена на удаление; 0 – запись не помечена на удаление.
Восстановить() – восстанавливает текущую запись, помеченную ранее на удаление.
Пример:
ДБФ.ПоказыватьУдаленные(1);
Если ДБФ.ЗаписьУдалена() = 1 Тогда
ДБФ.Восстановить();
ДБФ.Записать();
КонецЕсли;
Очистить() – обнуляет все поля записи. Атрибуты, соответствующие полям типа строковый приобретают значение «пустая строка», числовой – 0, логический – 0, дата – «пустая дата».
Пример:
ДБФ.Очистить();
КоличествоЗаписей() – возвращает количество записей в базе вместе с записями, помеченными, как удаленные.
Возвращаемое значение: количество записей в базе.
Пример:
Предупреждение("Записей – " + Строка(ДБФ.КоличествоЗаписей()));
КоличествоПолей() – возвращает количество полей базы. Может быть использован при работе с базой данных неизвестной заранее структуры.
Возвращаемое значение: количество полей базы.
ОписаниеПоля(<НомерПоля>, <НазваниеПоля>, <Тип>, <Длина>, <Точность>) – возвращает в параметрах <НазваниеПоля>, <Тип>, <Длина>, <Точность> описание поля с номером <НомерПоля>.
Параметры:
<НомерПоля> – номер поля, для которого требуется получить описание.
<НазваниеПоля> – идентификатор переменной, в которую данный метод вернет строковое значение названия поля.
<Тип> – идентификатор переменной, в которую данный метод вернет числовое значение типа поля. Допустимые значения см. в описании метода ДобавитьПоле().
<Длина> – идентификатор переменной, в которую данный метод вернет числовое значение – общую длину поля.
<Точность> – идентификатор переменной, в которую данный метод вернет числовое значение – длину поля после десятичной точки (только для числовых полей).
Пример:
Для КП = 1 По ДБФ.КоличествоПолей() Цикл
ДБФ.ОписаниеПоля(КП, Назв, Тип, Длин, Точн);
// действия с полем
КонецЦикла;
КоличествоИндексов() – возвращает количество индексов в открытом индексном файле. Может быть использован при работе с базой данных неизвестной заранее структуры.
Возвращаемое значение: количество индексов в открытом индексном файле.
ОписаниеИндекса(<НомерИндекса>, <НазваниеИндекса>, <Выражение>, <Уникальность>, <Убывание>, <Фильтр>) – возвращает в параметрах <НазваниеИндекса>, <Выражение>, <Уникальность>, <Убывание>, <Фильтр> описание индекса с номером <НомерИндекса>.
Параметры:
<НомерИндекса> – номер индекса, для которого требуется получить описание.
<НазваниеИндекса> – идентификатор переменной, в которую данный метод вернет строковое значение названия индекса.
<Выражение> – идентификатор переменной, в которую данный метод вернет строковое значение – выражение индекса.
<Уникальность> – идентификатор переменной, в которую данный метод вернет числовое значение – флаг уникальности индекса. 1 – уникальный. 0 – не уникальный.
<Убывание> – идентификатор переменной, в которую данный метод вернет числовое значение – флаг направления убывания индекса. 1 – индекс по убыванию значения ключа. 0 – по возрастанию значения ключа.