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

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
  Подписаться  
Уведомление о