Работа с файлами DBF в 1С 8.3 и 8.2 – чтение и запись

Как произвести чтение из файла DBF в 1С предприятии 8.2 (8.3). Как записать данные в файл DBF.

Отбор/фильтр в отчетах/СКД/обработках 1C: БП, УТ, ERP, Кронос: WMS по файлу Excel, текстовому файлу или списку текстовых строк (номер документа, артикул, ИНН, QR-код, штрих-код, наименование)

Работа с интерфейсом Универсальные функции Практика программирования v8 v8::УФ 1cv8.cf Бесплатно (free)

Как построить отчет Анализ продаж или Остатки товаров с отбором/фильтром по списку кодов товаров/артикулов или ИНН покупателей из Эксель файла? Покажем, какой код нужно добавить в конфигурацию 1С (в том числе нетиповую), чтобы в любом отчете/отборе СКД/обработке можно было заполнять отбор по excel файлу, текстовому файлу или просто по списку строк – удобно и быстро.

23.11.2021    339    SizovE    3    

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

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

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

zip.gif Скачать эти примеры в виде тестовой базы (как загрузить, как исследовать)
Скачать 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; Таблица.Записать();   Таблица.ЗакрытьФайл(); КонецПроцедуры /// Скачать и выполнить эти примеры на компьютере

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

Чтение файла DBF

Чтение данных из файла DBF производится за несколько последовательных этапов:

  1. Создание объекта XBase;
  2. Открытие файла;
  3. Последовательный перебор всех строк файла и считывание значений полей;
  4. Закрытие файла.

Рассмотрим этот процесс на примере:

ДБФ = Новый XBase; // Этап 1. Создание объекта XBaseДБФ.ОткрытьФайл(“D:MyFile.dbf”); // Этап 2. Открытие файлаПока Истина Цикл // Этап 3. Перебор строк файла Сообщить(ДБФ.NAME); // Пример обращения к значению поля Если НЕ ДБФ.Следующая() Тогда // Позиционирование на следующей записи Прервать; КонецЕсли;КонецЦикла;ДБФ.ЗакрытьФайл(); // Этап 4. Закрытие файла

Можно использовать несколько измененный алгоритм перебора строк файла:

Пока НЕ ДБФ.ВКонце() Цикл Сообщить(ДБФ.NAME); ДБФ.Следующая();КонецЦикла;

Чтение в 1С из файла DBF

Рассмотрим учебный пример, в котором необходимо заполнить нужный массив из колонки файла dbf. Сам файл расположен по адресу «C:KLADR.DBF».

ПутьКФайлу = “C:KLADR.DBF”;ФайлDBF = Новый XBase; // создаем новый объектФайлDBF.ОткрытьФайл(ПутьКФайлу,,Истина); // открытие файлаФайлDBF.Первая(); // устанавливает курсор на первую записьМассивАдресов = Новый Массив;// цикл обрабатывается до тех пор, пока не дошел до последней записиПока НЕ ФайлDBF.ВКонце() ЦиклМассивАдресов.Добавить(ФайлDBF.ADRES);ФайлDBF.Следующая(); //передвигаем курсор далееКонецЦикла;//обязательно закрываем файл, после прекращения работыФайлDBF.ЗакрытьФайл();

Удаление записей в файле DBF

Удаление записи производится методом Удалить():

ДБФ.Удалить();

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

ДБФ.ОтображатьУдаленные = Истина;Пока НЕ ДБФ.ВКонце() Цикл Если ДБФ.ЗаписьУдалена() Тогда ДБФ.Восстановить(); КонецЕсли;ДБФ.Следующая();КонецЦикла;

Для непосредственного удаления помеченных записей используется метод Сжать():

ДБФ.Сжать();

Если необходимо удалить все записи в файле непосредственно, то можно использовать метод ОчиститьФайл():

ДБФ.ОчиститьФайл();

Обработка расширением на клиенте

Универсальные функции v8::УФ 1cv8.cf Бесплатно (free)

Описываю нетривиальный прием работы с расширением, который позволит относительно быстро реализовывать некоторые обработки данных.Суть: обработка данных на клиенте с использованием методов, которые реализованы разработчиком конфигурации на форме объекта.Если эти методы есть вне модуля формы объекта (общий модуль, модуль менеджера, модуль объекта)- лучше сделать обработку более простым способом.

31.10.2019    7937    EvgenURNN    10    

Загрузка из DBF при помощи ADO

Для работы с файлами DBF может использоваться технология ADO. Драйверы ADO входят в состав операционной системы Windows и дополнительно их устанавливать не надо.

Рассмотрим пример кода для чтения из файла DBF по технологии ADO:

АДО = Новый COMОбъект(“ADODB.Connection”); // Создание COM-объектаАДО.Open(“Provider=Microsoft.Jet.OLEDB.4.0; |Data Source=””D:””; |Extended Properties=DBASE III”);БД = АДО.Execute(“Select * from MyFile”); // запрос с получением всех записей из файла MyFile.DBFПока БД.EOF=0 Цикл //Цикл по записям файла DBF Сообщить(БД.Fields(“Name”).value); // Пример обращения к значению поля       БД.MoveNext(); //Переходим к следующей записиКонецЦикла;АДО.Close();

В приведенном примере используется строка подключения «Provider=Microsoft.Jet.OLEDB.4.0;Data Source= «D:»;Extended Properties=DBASE III». В этой строке:

  • Provider – это используемый драйвер;
  • Data Source – путь, где находится файл DBF. Путь указывается с точностью до каталога. Имя файла используется в качестве имени таблицы в запросах;
  • Extended Properties – в случае обращения к файлам DBF является обязательным параметром. Можно указать формат файла

Внимание!

При чтении указанным способом кодировка по-умолчанию – OEM. Для того, чтобы изменить кодировку на ANSI необходимо в реестре Windows присвоить параметру HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftJet4.0EnginesxBaseDataCodePage значение «ANSI».

Остались вопросы?
Спросите в комментариях к статье.

Смотри также:

Создание диаграммы Excel из 1С
Подключение к базе 1С через COM
Работа с файлами Excel

Рейтинг
( 1 оценка, среднее 5 из 5 )
Загрузка ...