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(ПутьКФайлу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(ПутьКФайлу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(ПутьКФайлу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(ПутьКФайлу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.ЗакрытьФайл();
КонецПроцедуры
Процедура СозданиеФайлаСНужнымиПолямиВФормате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С 8.3 с тегом #DBF:
1
комментарий
Александр
17 сен 2024
Код:
ТаблицаDBF2.Кодировка = КодировкаXBase.ANSI;
не работает во Фреш.
Возникает ошибка:
{(430,17)}: Переменная не определена (КодировкаXBase)
БД.Кодировка = >КодировкаXBase.OEM;
Как быть, как изменить кодировку?
ТаблицаDBF2.Кодировка = КодировкаXBase.ANSI;
не работает во Фреш.
Возникает ошибка:
{(430,17)}: Переменная не определена (КодировкаXBase)
БД.Кодировка = >КодировкаXBase.OEM;
Как быть, как изменить кодировку?
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник