Советы и лайфхаки

Xbase 1c – Чтение и запись DBF в языке 1С 8.3, 8.2 (в примерах)

Чтение и запись DBF в языке 1С 8.3, 8.2 (в примерах)

Чтение и запись DBF в языке 1С 8.3, 8.2 (в примерах)

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

2017-12-19T00:25:27+00:00 XML ZIP WORD DBF HTTP FTP ТекстовыйДокумент ТабличныйДокумент

Скачать эти примеры в виде тестовой базы (как загрузить, как исследовать)
Скачать test.dbf, который используется в примерах ниже.

Оглавление (нажмите, чтобы раскрыть)

/// Как прочитать записи файла в формате dbf из 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакПрочитатьЗаписиФайлаВФорматеDBFНаКлиенте(ПутьКФайлуDBF)
 
    // О формате dbf - https://ru.wikipedia.org/wiki/DBF    
 
    Таблица = Новый XBase;
    Таблица.ОткрытьФайл(
        ПутьКФайлуDBF, // путь к базе
        , // путь к индексу
        Истина // только чтение
    );
 
    Сообщить("В таблице " + Таблица.КоличествоЗаписей() + " записей.");
    Сообщить("Таблица имеет кодировку: " + Таблица.Кодировка);
 
    Таблица.Первая(); // перешли к первой записи
    Пока Не Таблица.ВКонце() Цикл
        Если Не Таблица.ЗаписьУдалена() Тогда
            Сообщить(
                Строка(Таблица.EMPLOYEEID) + " " +
                Таблица.LASTNAME + " " + 
                Таблица.TITLE + " " +
                Таблица.ADDRESS            
            );
        КонецЕсли;
        Таблица.Следующая(); // переходим к следующей записи
    КонецЦикла;    
 
    Таблица.ЗакрытьФайл();
 
КонецПроцедуры
 
/// Как найти нужную запись в файле в формате dbf из 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакНайтиНужнуюЗаписьВФайлеВФорматеDBFНаКлиенте(ПутьКФайлуDBF)
 
    // О формате dbf - https://ru.wikipedia.org/wiki/DBF 
 
    // Файлы dbf могут быть очень большими и содержать сотни
    // тысяч записей. В этом случае полный перебор всех записей,
    // чтобы найти одну - не очень хорошая идея.
 
    Таблица = Новый XBase;
    Таблица.ОткрытьФайл(
        ПутьКФайлуDBF, // путь к базе
        , // путь к индексу
        Ложь // открываем на запись
    );
 
    // Но для того, чтобы искать по ключу - нужен индексный файл,
    // включающий нужные нам поля. Если бы этот файл уже был у нас,
    // то мы бы передали его при открытии файла вышле, но у нас его
    // нет, а потому - займёмся его созданием.
 
    // создадим индекс только по полю EMPLOYEEID
    Таблица.Индексы.Добавить(
        "INDEX_EMPLOYEEID",  // имя индекса
        "EMPLOYEEID", // выражение индекса
        Истина  // уникальность создаваемого индекса
    );
 
    КаталогДляЭкспериментов = КаталогДокументов() + "\helpme1c.ru";
    СоздатьКаталог(КаталогДляЭкспериментов);
 
    ПутьКФайлуИндекса = КаталогДляЭкспериментов + "\test.cdx";
 
    Таблица.СоздатьИндексныйФайл(ПутьКФайлуИндекса);
 
    Таблица.ЗакрытьФайл();
 
    // Заново открываем таблицу, уже на чтение и с индексным файлом,
    // который мы только что создали.    
 
    Таблица = Новый XBase;
    Таблица.ОткрытьФайл(
        ПутьКФайлуDBF, // путь к базе
        ПутьКФайлуИндекса, // путь к индексу
        Истина // только чтение
    );
 
    // Найдём среди записей ту, у которой поле EMPLOYEEID равно 3.
 
    // В таблице всего один индекс INDEX_EMPLOYEEID.
    Таблица.ТекущийИндекс = Таблица.Индексы.Получить(0); 
 
    Таблица.Ключ.EMPLOYEEID = "3";
 
    ЗаписьНайдена = Таблица.НайтиПоКлючу("=");
 
    Если ЗаписьНайдена Тогда
        Сообщить("Запись найдена");
        Сообщить(
            Строка(Таблица.EMPLOYEEID) + " " +
            Таблица.LASTNAME + " " + 
            Таблица.TITLE + " " +
            Таблица.ADDRESS            
        );
    Иначе
        Сообщить("Запись не найдена");
    КонецЕсли;
 
    Таблица.ЗакрытьФайл();
 
КонецПроцедуры
 
/// Как добавить новые записи в уже существующий файл в
/// формате dbf из 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакДобавитьНовыеЗаписиВФайлВФорматеDBFНаКлиенте(ПутьКФайлуDBF)
 
    // О формате dbf - https://ru.wikipedia.org/wiki/DBF
 
    // Добавим в уже знакомый нам test.dbf 2 новые записи о работниках.
 
    Таблица = Новый XBase;
    Таблица.ОткрытьФайл(
        ПутьКФайлуDBF, // путь к базе
        , // путь к индексу
        Ложь // открываем на запись
    );
 
    Таблица.Добавить();
    Таблица.EMPLOYEEID = "100";
    Таблица.LASTNAME = "Милькин";
    Таблица.TITLE = "Программист";
    Таблица.ADDRESS = "Владивосток";
    Таблица.Записать();
 
    Таблица.Добавить();
    Таблица.EMPLOYEEID = "101";
    Таблица.LASTNAME = "Милькина";
    Таблица.TITLE = "Биолог";
    Таблица.ADDRESS = "Владивосток";
    Таблица.Записать();
 
    Таблица.ЗакрытьФайл();
 
КонецПроцедуры
 
/// Как удалить определенные записи в файле в формате
/// dbf из 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакУдалитьОпределенныеЗаписиИзФайлаВФорматеDBFНаКлиенте(ПутьКФайлуDBF)
 
    // О формате dbf - https://ru.wikipedia.org/wiki/DBF    
 
    // Удалим записи с LASTNAME Милькин и Милькина
 
    Таблица = Новый XBase;
    Таблица.ОткрытьФайл(
        ПутьКФайлуDBF, // путь к базе
        , // путь к индексу
        Ложь // открываем на запись
    );
 
    Таблица.Первая();
 
    Пока Не Таблица.ВКонце() Цикл
        Если 
            СокрЛП(Таблица.LASTNAME) = "Милькин" Или
            СокрЛП(Таблица.LASTNAME) = "Милькина"
        Тогда
            Таблица.Удалить();
        КонецЕсли;
        Таблица.Следующая();
    КонецЦикла;
 
    // Но Удалить() только ставит пометку на
    // удаление, а чтобы реально удалить помеченные
    // на удаление записи нужно вызвать метод Сжать().
 
    Таблица.Сжать();
 
    Таблица.ЗакрытьФайл();
 
КонецПроцедуры
 
/// Как создать файл в формате dbf с нужными
/// полями из 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакСоздатьФайлВФорматеDBFНаКлиенте()
 
    // О формате dbf - https://ru.wikipedia.org/wiki/DBF
 
    НоваяТаблица = Новый XBase;
    НоваяТаблица.Кодировка = КодировкаXBase.ANSI;
 
    // Описываем колонки таблицы.
 
    НоваяТаблица.Поля.Добавить(
        "FIRSTNAME", // имя колонки
        "S", // тип
        100, // длина
    );
    НоваяТаблица.Поля.Добавить(
        "AGE",
        "N",
        10,
        0 // точность
    ) ;
 
    // Типы ещё бывают:
    // N - число
    // S - строка
    // D - дата
    // L - булево
    // F - число
 
    КаталогДляЭкспериментов = КаталогДокументов() + "\helpme1c.ru";
    СоздатьКаталог(КаталогДляЭкспериментов);
 
    ПутьКНовомуDBF = КаталогДляЭкспериментов + "\new.dbf";    
 
    НоваяТаблица.СоздатьФайл(
        ПутьКНовомуDBF, // путь к базе
        // путь к индексу
    );
 
    НоваяТаблица.ЗакрытьФайл();
 
    Сообщить("Новый файл создан в '" + ПутьКНовомуDBF + "'.");
 
    // И уже теперь можем его открыть и добавить данные.
 
    Таблица = Новый XBase;
    Таблица.ОткрытьФайл(
        ПутьКНовомуDBF, // путь к базе
        , // путь к индексу
        Ложь // открываем на запись
    );    
 
    Таблица.Добавить();
    Таблица.FIRSTNAME = "Вова";
    Таблица.AGE = 31;
    Таблица.Записать();
 
    Таблица.Добавить();
    Таблица.FIRSTNAME = "Алёна";
    Таблица.AGE = 24;
    Таблица.Записать();    
 
    Таблица.ЗакрытьФайл();
 
КонецПроцедуры
 
/// Скачать и выполнить эти примеры на компьютере

Скачать эти примеры в виде тестовой базы (как загрузить, как исследовать)
Скачать test.dbf, который используется в примерах ниже.

Чтение и запись DBF в языке 1С 8.3, 8.2 (в примерах)

XML ZIP WORD DBF HTTP FTP ТекстовыйДокумент ТабличныйДокумент

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

Нажмите одну из кнопок, чтобы поделиться:

helpme1c.ru

1-258 XBase. 1с 8 0

<< Главная страница
1-258 XBase

Для работы с базами данных формата DBF в системе может ис­пользоваться специальный объект - XBase. Механизм работы с базами данных формата DBF предназначен для обеспечения воз­можности манипулирования ими непосредственно из встроенного языка 1C: Предприятия. Каждый объект XBase может быть свя­зан с одним файлом базы данных.

Основные понятия

Для облегчения понимания материала данного раздела читателем, не имеющим опыта работы с базами данных, ниже приводятся пояснения терминов, использованных при описании средства встроенного языка для работы с базами данных - объекта XBase.

Поля и записи

Если Вы не знакомы с концепцией базы данных, то ее можно себе представить в виде упорядоченного хранилища информации типа картотеки. Хорошим примером базы данных может служить те­лефонный справочник организации. Он содержит фамилии, но­мера телефонов и номера комнат всех сотрудников организации. Каждая строка справочника соответствует одной записи, а каждая колонка - полю. Каждое поле имеет наименование и характери­стики информации, для хранения которой оно предназначено: тип, длина, точность. Содержимое поля для конкретной записи называется значением поля. Напри-мер, телефонный справочник, может быть организован в виде таблицы с колонками (полями) "Фамилия Имя Отчество", "№ комнаты", "Телефон", каждая строка (запись) содержит информацию об одном абоненте.

Таблица, структура таблицы, файл базы данных

Весь справочник целиком в терминах баз данных называется таб­лицей. Состав входящих в таблицу полей определяет структуру таблицы, а состав входящих в таблицу записей - ее содержание. Каждая запись в таблице состоит из того же набора полей, что и таблица целиком, поэтому иногда употребляется термин структу­ра записи. Это понятие адекватно структуре таблицы, хотя упот­ребление первого термина представляется более корректным, т.к. таблица имеет структуру независимо от того, имеется ли в ней хотя бы одна запись.

Реализация баз данных формата DBF подразумевает, что каждая таблица хранится в отдельном файле. Поэтому в дальнейшем мы будем применять термин "файл базы данных" или "файл БД", имея в виду таблицу базы данных.

Индексы, выражения индекса и фильтра, индексный файл

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

Индексы хранятся в индексном файле. Индексный файл может содержать информацию более чем об одном индексе.

Запись изменений в базу данных

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

Работа с индексными файлами

Следует иметь в виду, что одновременно XBase-объект может быть связан не более, чем с одним индексным файлом. Все изме­нения в базе данных, сделанные в сеансе работы с одним индекс­ным файлом, никак не отражаются на остальных. Поэтому не ре­комендуется иметь более одного индексного файла для БД. В противном случае, после каждого открытия БД с индексным фай­лом, отличным от открытого в предыдущем сеансе работы с ба­зой, следует производить переиндексацию (обновление содержи­мого индексного файла).

Удаление записей

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

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

Создание базы данных, индекса, индексного файла

Помимо работы с существующими базами данных, объект XBase имеет набор методов, позволяющих создать новую базу данных произвольной структуры, новые индексы и новый индексный файл. Следует отметить, что, если использование методов, изме­няющих структуру БД, возможно только для объектов, не связан­ных с существующей базой данных (т.е. для вновь создаваемых БД), то создание новых индексов и индексного файла возможно как для создаваемых БД, так и для уже существующих и откры­тых.

Ограничения

Основное назначение объектов XBase - организация экспорта-импорта информации в/из внешних файлов формата DBF.

Объекты XBase не поддерживают поля типа memo.

Объекты XBase поддерживают только монопольный доступ к файлам.

XBase-объекты поддерживают индексные файлы в формате CDX. Однако, использование внешними программами (например, FoxBase) индексных файлов, созданных с помощью объектов XBase, так же, как и использование объектами индексных фай­лов, созданных внешними программами, не рекомендуется из-за возможной несовместимости версий.

XBase (XBase)

Основной объект для работы с таблицами баз данных в формате DBF. Предоставляет доступ к коллекции полей и индексов таб­лицы, позволяет открывать и записывать файлы таблиц, работать с записями таблицы.

Свойства

<Имя поля>

Использование:

Чтение и запись.

Описание:

Набор свойств содержит значения полей в текущей записи таб­лицы базы данных формата DBF, состав и тип которых зависит от структуры файла базы данных, с которым связан конкретный объект. Имена свойств совпадают с именами полей таблицы базы данных.

Автосохранение (AutoSave)

Использование:

Чтение и запись.

Описание:

Тип: Булево. Содержит признак автоматического сохранения изменений в базе данных.

Индексы (Indexes)

Использование:

Только чтение.

Описание:

Тип: Коллекция индексов XBase. Содержит коллекцию индексов таблицы базы данных формата DBF.

См. также:

Коллекция индексов XBase.

Ключ (Key)

Использование:

Чтение и запись.

Описание:

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

См. также:

XBase, метод НайтиПоКлючу.

ОтображатьУдаленные (ShowDeleted)

Использование:

Чтение и запись.

Описание:

Тип: Булево. Содержит признак показа удаленных записей.

Поля (Fiedls)

Использование:

Только чтение.

Описание:

Тип: Коллекция полей XBase. Содержит коллекцию полей таблицы базы данных формата DBF.

См. также:

Коллекция полей XBase.

ТекущийИндекс (Currentlndex)

Использование:

Чтение и запись.

Описание:

Тип: Индекс XBase. Содержит текущий используемый индекс. Установка текущего индекса работы с таблицей базы данных ока­зывает влияние на работу методов поиска и позиционирования: Найти, НайтиПоКлючу, Первая, Последняя, Следующая, Предыдущая.


icv8.odn.org.ua

"Кодовый" беспредел: C++: Xbase - библиотека прямой работы с DBF файлами. Сборка компилятором GNU GCC 4.4

     Каким бы старым формат dBase (dbf) не был, какие бы модификации не претерпевал ... он и по сей день находит применение. Как участник некоторых форумов по программированию, я не раз становился свидетелем одной и той же картины: раз-два в квартал обязательно появляется человек с вопросом "Как читать (записывать) данные из (в) файл(а) *.dbf?". Нет такой проблемы если вы пишите программы в IDE MS Visual Studio - там "дядя Билли" все предусмотрел - нужно лишь сформировать правильно строчку подключения для коннектора и все дела (подсмотреть такие строчки можно, например, тут). Но что делать, если используется другая среда разработки и нет желания использовать ODBC (особенно при написании программ для ОС Linux)?      Остается реализовать нативный доступ к файлу (не удивляйтесь - на форумах, обычно, так и советуют, с формулировкой в духе "да я сам так 100 раз делал" :-)) либо воспользоваться готовой библиотекой.      Прежде чем бросаться в дебри спецификации стандарта dBase (например, тут), я бы вам советовал обратить свой взор в сторону библиотек. Их не так много, а бесплатных и того меньше ;-).      Кому не жалко $15 за одну лицензию персонального использования, либо $37 за одну пользовательскую лицензию для организаций - можете попробовать использовать библиотеку alxBASE. Честно скажу - сам не пробовал, но практически каждый день использую программу DBFNavigator (того же разработчика) построенную на этой библиотеке. Проблем в работе DBFNavigator'а не обнаружил :-).      Тем же, кто радеет за свободно-распространяемое программное обеспечение я хотел бы предложить "пощупать" библиотеку "Xbase". Возможностей у ней, конечно, поменьше, но прочитать/записать файл в формате dBase III, dBase IV сможет. К сожалению, с 2006 года проект не развивается, поэтому не стоит делать ставку на поддержку и актуализацию (ну только если у вас нет желания сделать это) - лишь на имеющиеся возможности.      После столь лиричного вступления, мы, собственно, и подошли к главному вопросу - компиляции библиотеки "Xbase" компилятором GNU GCC 4.4 (этот и другие компиляторы рассматривались в другом обзоре). Как вы уже догадались, суть не в компиляции GCC как таковой, а именно GCC версии 4 и выше. Сразу стоит отметить, что компилятор GNU GCC 3.5 собирает библиотеку без проблем после накладывания патчей со страницы проекта Xbase и кроме стандартных:
./configure
make
вам ничего не понадобится. Как говорится "проверено боем" при смене штатного компилятора Qt - GNU GCC с версии 3.5 на версию 4.4.
     Итак, пошаговое руководство по сборке Xbase компилятором GNU GCC 4.4 на примере ОС Windows + MinGW:
  1. скачать и установить MinGW + MSYS + msysDTK следуя инструкции на сайте проекта. Необходимо установить все три пакета - в противном случае в системе будут отсутствовать необходимые инструменты. Не забудьте перезагрузить ПК после установки всего ПО.
  2. скачать исходный код Xbase.
  3. скачать патч compilation_fix.diff.
  4. распаковать архив с исходными кодами Xbase и переименовать директорию в xbase64-3.1.2-orig (для удобства работы, лучше всего распаковать в корень диска).
  5. скопировать в директорию xbase64-3.1.2-orig патч compilation_fix.diff и наложить его на исходный текст командой:
    patch -p1 -i compilation_fix.diff
  6. отредактировать файл configure.in, изменив в нем 77 строчку с:
    GXXVER=`${CXX} -v 2>&1 | grep version | cut -d " " -f 3 -`
    на
    GXXVER=`${CXX} -v 2>&1 | grep "gcc version" | cut -d " " -f 3 -`
  7. сформировать заново файл configure программой autoconf, для этого в директории с исходным текстом необходимо выполнить команду:
    autoreconf --force
  8. выполнить:
    ./configure
    make
     Внимание: выполнение пунктов 5,7,8 подразумевается в среде MSYS.

     Либо вы можете сразу скачать архив подготовленный мною. В нем вы найдете уже пропатченные исходные коды, обновленный configure, а так же бинарный файл библиотеки.
     Любые комментарии и публикации собственных улучшений, внесенных в эту библиотеку, приветствуются. Пишите :-).

UPD. Пропатченные таким образом исходники так же собираются GCC 4.6 и 4.7 (проверено лично :-)).

codedchaos.blogspot.com

Отправить ответ

avatar
  Подписаться  
Уведомление о