Чтение и запись 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:
- скачать и установить MinGW + MSYS + msysDTK следуя инструкции на сайте проекта. Необходимо установить все три пакета — в противном случае в системе будут отсутствовать необходимые инструменты. Не забудьте перезагрузить ПК после установки всего ПО.
- скачать исходный код Xbase.
- скачать патч compilation_fix.diff.
- распаковать архив с исходными кодами Xbase и переименовать директорию в xbase64-3.1.2-orig (для удобства работы, лучше всего распаковать в корень диска).
- скопировать в директорию xbase64-3.1.2-orig патч compilation_fix.diff и наложить его на исходный текст командой:
patch -p1 -i compilation_fix.diff
- отредактировать файл 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 -`
- сформировать заново файл configure программой autoconf, для этого в директории с исходным текстом необходимо выполнить команду:
autoreconf --force
- выполнить:
./configure make
Либо вы можете сразу скачать архив подготовленный мною. В нем вы найдете уже пропатченные исходные коды, обновленный configure, а так же бинарный файл библиотеки.
Любые комментарии и публикации собственных улучшений, внесенных в эту библиотеку, приветствуются. Пишите :-).
UPD. Пропатченные таким образом исходники так же собираются GCC 4.6 и 4.7 (проверено лично :-)).
codedchaos.blogspot.com