1С 8.3 DBF - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

1С 8.3 DBF

В 1С 8.3 для операций с DBF есть стандартный объект XBase, позволяющий работать непосредственно из встроенного языка. Формат хранения файлов баз данных DBF (dBase III), используемый в качестве одного из стандартных способов хранения информации в системах управления базами данных. Имеет двумерный массив (таблица) и часто используется программами 1С с самых ранних версий. В 1С 8.3 DBF может использоваться программистами для обмена со сторонними приложениями и базами данных. Данный формат устарел из из-за своих ограничений:
Ограничения файла:
Максимальное имя файла *.DBF (с расширением) не более 8 символов
Максимальное число записей в файле базы данных 1 миллиард
Максимальное число символов в записи 4000
Максимальное число полей в записи 255
Максимальное число одновременно открытых баз данных 25
Максимальное число символов в поле базы данных 254
Максимальное число символов в индексном ключе (.IDX) 100
Максимальное число символов в индексном ключе (.CDX) 254
Ограничения полей:
Максимальный размер символьных полей 254
Максимальный размер числовых (и с плавающей точкой) полей 20
Максимальное число символов в названиях полей 10
Точность цифр при числовых вычислениях 16
Чтение записей файла в формате *.DBF в 1С 8.3:
&НаКлиенте
Процедура ЧтениеЗаписейФайлаВФорматеDBF(ПутьКФайлуDBF)

   
ТаблицаDBF = Новый XBase;
   
ТаблицаDBF.ОткрытьФайл(ПутьКФайлуDBF,,Истина);  // путь к базе,   путь к индексу - необязателен,   только чтение

   
Сообщить("Таблица DBF имеет кодировку: " + ТаблицаDBF.Кодировка);
   
Сообщить("В таблице " + ТаблицаDBF.КоличествоЗаписей() + " записей.");

   
ТаблицаDBF.Первая(); // перешли к первой записи
   
Пока Не ТаблицаDBF.ВКонце() Цикл//не последняя запись
       
Если Не ТаблицаDBF.ЗаписьУдалена() Тогда //нет пометки на удаление
           
Сообщить(ТаблицаDBF.Kod + " " + ТаблицаDBF.Country + " " + Строка(ТаблицаDBF.Population) + " " + ТаблицаDBF.Continent);
        КонецЕсли;
       
ТаблицаDBF.Следующая(); // переходим к следующей записи
   
КонецЦикла;
   
ТаблицаDBF.ЗакрытьФайл();

КонецПроцедуры
Поиск нужной записи в файле в формате *.DBF в 1С 8.3:
&НаКлиенте
Процедура ПоискНужнойЗаписиВФайлеВФорматеDBF(ПутьКФайлуDBF)

   
// Файлы dbf могут быть очень большими и содержать тысячи записей.
    // В этом случае полный перебор всех записей,
    // чтобы найти одну - плохая идея - поиск будет долгим.

   
ТаблицаDBF = Новый XBase;
   
ТаблицаDBF.ОткрытьФайл(ПутьКФайлуDBF,,); // путь к базе,   путь к индексу,   открываем на запись (Ложь)

    // Но для того, чтобы искать по ключу - нужен индексный файл, включающий нужные нам поля. Если бы этот файл уже был у нас,
    // то мы бы передали его при открытии файла вышле, но у нас его нет, а потому - займёмся его созданием.
    // создадим индекс только по полю Population
   
ТаблицаDBF.Индексы.Добавить("INDEX_Population""Population",  ); // имя индекса,   выражение индекса,   уникальность создаваемого индекса (Истина)

   
КаталогDBFФайлов = "D:\World";
   
СоздатьКаталог(КаталогDBFФайлов);

   
ПутьКФайлуИндекса = КаталогDBFФайлов + "\kldr.cdx"; //имя файла не более 8 символов (включая расширение)

   
ТаблицаDBF.СоздатьИндексныйФайл(ПутьКФайлуИндекса);

   
ТаблицаDBF.ЗакрытьФайл();

   
// Заново открываем таблицу, уже на чтение и с индексным файлом, который мы только что создали.
   
ТаблицаDBF = Новый XBase;
   
ТаблицаDBF.ОткрытьФайл(ПутьКФайлуDBF,ПутьКФайлуИндекса,Истина); // путь к базе, путь к индексу, только чтение

    // Найдём среди записей ту, у которой поле Population равно 10.
    // В таблице всего один индекс INDEX_Population.
   
ТаблицаDBF.ТекущийИндекс = ТаблицаDBF.Индексы.Получить(0);
   
ТаблицаDBF.Ключ.Population = "10";

   
ЗаписьНайдена = ТаблицаDBF.НайтиПоКлючу("=");

    Если
ЗаписьНайдена Тогда
       
Сообщить("Запись найдена");
       
Сообщить(ТаблицаDBF.Kod + " " + ТаблицаDBF.Country + " " + Строка(ТаблицаDBF.Population) + " " + ТаблицаDBF.Continent);
    Иначе
       
Сообщить("Запись не найдена");
    КонецЕсли;

   
ТаблицаDBF.ЗакрытьФайл();

КонецПроцедуры
Добавление новых записей в уже существующий файл в формате *.DBF в 1С 8.3:
&НаКлиенте
Процедура ДобавлениеНовыхЗаписейВФайлВФорматеDBF(ПутьКФайлуDBF)

   
// Добавим в уже знакомый нам kldr.dbf 2 новые записи о странах.
   
ТаблицаDBF = Новый XBase;
   
ТаблицаDBF.ОткрытьФайл(ПутьКФайлуDBF,,); // путь к базе, путь к индексу, открываем на запись (Ложь)

   
ТаблицаDBF.Добавить();
   
ТаблицаDBF.Population = "10";//миллионов
   
ТаблицаDBF.Country = "Беларусь";
   
ТаблицаDBF.Kod = "BLR";
   
ТаблицаDBF.Continent = "Европа";
   
ТаблицаDBF.Записать();

   
ТаблицаDBF.Добавить();
   
ТаблицаDBF.Population = "19";//миллионов
   
ТаблицаDBF.Country = "Казахстан";
   
ТаблицаDBF.Kod = "KAZ";
   
ТаблицаDBF.Continent = "Азия";
   
ТаблицаDBF.Записать();

   
ТаблицаDBF.Добавить();
   
ТаблицаDBF.Population = "146";//миллионов
   
ТаблицаDBF.Country = "Россия";
   
ТаблицаDBF.Kod = "RUS";
   
ТаблицаDBF.Continent = "Европа, Азия";
   
ТаблицаDBF.Записать();

   
ТаблицаDBF.ЗакрытьФайл();

КонецПроцедуры
Удаление определенных записей в файле в формате *.DBF в 1С 8.3:
&НаКлиенте
Процедура УдалениеОпределенныхЗаписейВФайлеВФорматеDBF(ПутьКФайлуDBF)

   
// Удалим записи с Country Беларусь и Россия
   
ТаблицаDBF = Новый XBase;
   
ТаблицаDBF.ОткрытьФайл(ПутьКФайлуDBF,,Ложь); // путь к базе,   путь к индексу,   открываем на запись

   
ТаблицаDBF.Первая();

    Пока Не
ТаблицаDBF.ВКонце() Цикл
        Если
СокрЛП(ТаблицаDBF.Country) = "Беларусь" Или СокрЛП(ТаблицаDBF.Country) = "Россия" Тогда
           
ТаблицаDBF.Удалить();
        КонецЕсли;
       
ТаблицаDBF.Следующая();
    КонецЦикла;

   
// Но Удалить() только ставит пометку на удаление, а чтобы реально удалить
    // помеченные на удаление записи нужно вызвать метод Сжать().
   
Если Вопрос("Удаленные записи будут уничтожены. Продолжить?", РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда
       
ТаблицаDBF.Сжать();
    КонецЕсли;

   
ТаблицаDBF.ЗакрытьФайл();

КонецПроцедуры
Создание файла с нужными полями в формате *.DBF в 1С 8.3:
&НаКлиенте
Процедура СозданиеФайлаСНужнымиПолямиВФорматеDBF()

   
ТаблицаDBF2 = Новый XBase;
   
ТаблицаDBF2.Кодировка = КодировкаXBase.ANSI;

   
// Описываем колонки таблицы. Типы бывают:
    // N - число
    // S - строка
    // D - дата
    // L - булево
    // F - число
   
ТаблицаDBF2.Поля.Добавить("Capital","S",100,); // имя колонки,   тип,   длина
   
ТаблицаDBF2.Поля.Добавить("Year","S",100,); // имя колонки,   тип,   длина
   
ТаблицаDBF2.Поля.Добавить("Population","N",10,0); // имя колонки,   тип,   длина,   точность

   
КаталогDBFФайлов = "D:\World";
   
СоздатьКаталог(КаталогDBFФайлов);

   
ПутьКФайлуDBF2 = КаталогDBFФайлов + "\kldr.dbf"; //имя файла не более 8 символов (включая расширение)
   
ТаблицаDBF2.СоздатьФайл(ПутьКФайлуDBF2,  ); // путь к базе,   путь к индексу
   
ТаблицаDBF2.ЗакрытьФайл();

   
Сообщить("Новый файл создан в '" + ПутьКФайлуDBF2 + "'.");

   
// И уже теперь можем его открыть и добавить данные.
   
ТаблицаDBF = Новый XBase;
   
ТаблицаDBF.ОткрытьФайл(ПутьКФайлуDBF2,,);   // путь к базе,   путь к индексу,   открываем на запись (по умолчанию Ложь)

   
ТаблицаDBF.Добавить();
   
ТаблицаDBF.Capital = "Минск";
   
ТаблицаDBF.Year = "1067";
   
ТаблицаDBF.Population = 2;//Миллиона
   
ТаблицаDBF.Записать();

   
ТаблицаDBF.Добавить();
   
ТаблицаDBF.Capital = "Нур-Султан";
   
ТаблицаDBF.Year = "1830";
   
ТаблицаDBF.Population = 1;//Миллион
   
ТаблицаDBF.Записать();

   
ТаблицаDBF.Добавить();
   
ТаблицаDBF.Capital = "Москва";
   
ТаблицаDBF.Year = "1147";
   
ТаблицаDBF.Population = 13;//Миллионов
   
ТаблицаDBF.Записать();

   
ТаблицаDBF.ЗакрытьФайл();

КонецПроцедуры
1
комментарий
Александр
17 сен 2024
Код:

ТаблицаDBF2.Кодировка = КодировкаXBase.ANSI;

не работает во Фреш.
Возникает ошибка:
{(430,17)}: Переменная не определена (КодировкаXBase)
БД.Кодировка = >КодировкаXBase.OEM;

Как быть, как изменить кодировку?
____________________
Copyright©, «Программист 1С в г.Минске», 01.03.2020
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Защищенное соединение ssl
visa
mastercard
Maestro
Яндекс деньги
Назад к содержимому