Меню

1с ошибка создания файла dbf

Странная ошибка при работе с ДБФ

Я
   ЧессМастер

05.07.18 — 17:16

Всем доброе время суток !

Столкнулся со странной ошибкой при работе с ДБФ.

При попытке программной переиндексации средствами 1С выдает ошибку

Error #: -20

Creating File

Temporary Working File

При этом сам файл ДБФ прекрасно открывается ДБФ редактором.

В файле 225 500 записей.

Кто сталкивался с подобной ошибкой — в чем может быть дело ?

   hogik

1 — 05.07.18 — 17:47

Надо бы глянуть текст программы. :-)

А вообще:

-20

Creating File

This error could be caused by specifying an illegal file name, attempting to create a file which is open, having a full directory, or by having a disk problem.

   ЧессМастер

2 — 05.07.18 — 18:29

(1) В тексте программы ничего необычного

Состояние("Ждите. Идет переиндексация файла таблицы соответствия ...");

Попытка 
БД_ТС.Переиндексировать();

Исключение
  Сообщить("ВНИМАНИЕ! Не удалось переиндексировать 
  таблицу соответствия: " + ИмяФайлаТС + "
                     |    " + 
 ОписаниеОшибки(), СтатусСообщения.ОченьВажное);

КонецПопытки;    


Ошибка возникает при разных именах файлов, разных каталогах и разных компьютерах.

Может проблема в том что при создании индекса не нравится содержимое поля записи ? Но ведь редактором файл открывается.

   hogik

3 — 05.07.18 — 20:30

Покажите текст про создание БД_ТС.

   Lama12

4 — 05.07.18 — 20:46

(0) Имя файла должно быть в формате 8.3 и желательно английскими буквами.

   Lama12

5 — 05.07.18 — 20:47

(4) 8.3 это не версия 1с.

   DES

6 — 05.07.18 — 20:54

имена полей (индексируемых) должны быть в верхнем регистре

   ice777

7 — 05.07.18 — 21:04

(0) индексный файл и дбф это два разные файлы, если что )

первый только ключи для поиска, второй- данные, которые у тебя «прекрасно открываются».

по тексту ошибки нет места на диске для индексного

   ice777

8 — 05.07.18 — 21:06

по жизни видал ситуации, когда индексный больше файла с данными, в выражение для поиска можно было включать и функции. Да и вообще- индексный- это дерево.

   ЧессМастер

9 — 06.07.18 — 09:33

(4) Имя файла ts.dbf
Имя индексного файла ts.cdx
   ЧессМастер

10 — 06.07.18 — 09:41

(3)

код создания ДБФ

    БД_ТС = Новый XBase;
    ФайлБД_ТС = Новый Файл(ФайлТС);
    ФайлИндексовБД_ТС = Новый Файл(ИмяФайлаИндексовТС);
    Если ФайлБД_ТС.Существует() Тогда
        Если НЕ БД_ТС.Открыта() Тогда            
    
        БД_ТС.индексы.Добавить("IndSource", "TRIM(ID_Source)", Истина);
                    
            Если ФайлИндексовБД_ТС.Существует() Тогда
                БД_ТС.ОткрытьФайл(ФайлТС, ИмяФайлаИндексовТС, Ложь);
            Иначе
                БД_ТС.ОткрытьФайл(ФайлТС,, Ложь);
                Если НЕ БД_ТС.СоздатьИндексныйФайл(ИмяФайлаИндексовТС) Тогда
                    Сообщить("ВНИМАНИЕ! Не удачная попытка создания индексного файла таблицы соответствия:
                             |    " + ИмяФайлаИндексовТС, СтатусСообщения.ОченьВажное);
                    Возврат Ложь;
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;        
    
    Иначе
        БД_ТС.поля.Добавить("ID_Source",  "S", 50);
        БД_ТС.поля.Добавить("ID_Receive", "S", 50);
        БД_ТС.поля.Добавить("Manager",    "S", 100);
        БД_ТС.поля.Добавить("DateAct",    "D", 8);
        БД_ТС.поля.Добавить("File",       "S", 20);
        БД_ТС.поля.Добавить("Update",        "N", 2);
        БД_ТС.поля.Добавить("Direct",        "N", 2);
        БД_ТС.поля.Добавить("ManagerRar",        "S", 100);     
        БД_ТС.индексы.Добавить("IndSource", "TRIM(ID_Source)", Истина);
                
        Попытка БД_ТС.СоздатьФайл(ФайлТС, ИмяФайлаИндексовТС);
        Исключение
            Сообщить("ВНИМАНИЕ! Нет возможности открыть файл таблицы соответствия: " + ФайлТС + "
                     |    " + ОписаниеОшибки(), СтатусСообщения.ОченьВажное);

            Возврат Ложь;
        КонецПопытки;    
    КонецЕсли;

   ЧессМастер

11 — 06.07.18 — 09:48

(7) «(0) индексный файл и дбф это два разные файлы, если что )

первый только ключи для поиска, второй- данные, которые у тебя "прекрасно открываются". "

Я это знаю.

У меня в файле ДБФ 225 500 записей (225 ТЫСЯЧ).ЮБез индексного файла поиск записей будет долго идти.

Вопрос почему стала возникать ошибка при переиндексации если места на диске полно, в названии файла все нормально, и ошибка возникает именно с этим файлом на разных компах.

   ЧессМастер

12 — 06.07.18 — 09:50

(8) "по жизни видал ситуации, когда индексный больше файла с данными"

Файл ДБФ чуть больше 73 Мб, файл индекса (при переиндексации он создается и дорастает до определенного размера а потом выскакивает ошибка в (0) - 18 Мб
   ЧессМастер

13 — 06.07.18 — 11:09

Какая то реально странность.

В каталоге оставляю только файл ДБФ. CDX удаляю.

Делаю переиндексацию.

Выскакивает ошибка

"Ошибка при вызове метода контекста (Переиндексировать): ошибка создания файла"

При этом в каталоге где лежит ДБФ появляется файл CDX (до переиндексации его не было).

Как может быть ошибка «ошибка создания файла» если файл CDX создается ?

   olegves

14 — 06.07.18 — 12:29

не знаю как в 8ке, но в клюшках помнится заголовок файла CDX, сформированного 1С, отличался от заголовка такого же в FoxPro. При этом Лис принимал 1Ский файл, но не мог по нему производить поиск.

   olegves

15 — 06.07.18 — 12:35

+ (14) как вариант, откажись от индексов в пользу Х+1 дбф. 1 — главная, там сделай имя таблицы (всего их будет Х). поиск будет в 2 таблицах:  в Главной по ключевому полю находишь имя таблицы, в которой продолжишь поиск

   ЧессМастер

16 — 06.07.18 — 13:07

(15) Вопрос решился.

Индекс убивался конструкцией БД_ТС.Сжать();


Всем спасибо за помощь !
   hogik

17 — 06.07.18 — 16:29

(15)

«Индекс убивался конструкцией БД_ТС.Сжать();»(с)

А где этот оператор в тексте, который Вы показываете? :-)

"Вопрос решился."(с)
Не решился. :-)

Вопрос решится после убирания TRIM в индексном выражении.

Т.к. длина ключей в xBase должна быть одинакова для ВСЕХ ключей.

   hogik

18 — 06.07.18 — 16:38

(16)

«Индекс убивался конструкцией БД_ТС.Сжать();»(с)

А где этот оператор в тексте, который Вы показываете? :-)

"Вопрос решился."(с)
Не решился. :-)

Вопрос решится после убирания TRIM в индексном выражении.

Т.к. длина ключей в xBase должна быть одинакова для ВСЕХ ключей.

   hogik

19 — 06.07.18 — 19:38

(16)

Поясню своё предыдущее сообщение в данной теме.

Есть странная 😉 информация, что «FoxPro не поддерживает переменную длину индексного ключа. Если вы попытаетесь построить индекс с ключом, который имеет различные длины, то ключ будет дополнен пробелами.»(с) Например, тут: http://www.foxclub.ru/rhproject/project/html/576a2953-04ff-4a66-9e38-3a3d9c990b72.hhtm

Но, движок из 1С для поддержки DBF не делает этого. Ну, до какой длины надо дополнять пробелы? 🙂 И возникает ошибка или строится «битый» индекс. Это очень старая ошибка в движке…

   hogik

20 — 06.07.18 — 21:36

   Злопчинский

21 — 18.07.18 — 03:26

(16) тебе hogik дал реальную причину сбоя

Но реакции — нету.

Проблема решена?

   ЧессМастер

22 — 20.07.18 — 11:43

(19) Поясните пожалуйста один момент.

Вы пишите "Если вы попытаетесь построить индекс с ключом, который имеет различные длины, то ключ будет дополнен пробелами"

Смотрим программыный текст создания индекса.

// данные

БД_ТС.поля.Добавить("ID_Source",  "S", 50);

// индекс

БД_ТС.индексы.Добавить("IndSource", "TRIM(ID_Source)", 
Истина);


Что мы имеем в реальности при использовании ДБФ ?

В колонке «ID_Source» в ДБФ у меня хранится ГУИД объекта. У него фиксированная длина у всех объектов.

По этому полю выстроен индекс.

В результате получается
1. Данные - фиксированная строка

2. Индекс строится по фиксированной строке.

Почему в таком случае при конструкции  БД_ТС.Сжать()

происходило падение индекса ?

   ЧессМастер

23 — 20.07.18 — 11:45

(21) Извиняюсь что долго не отвечал. Сильно был занят, не было времени ответить.

Острота проблемы спала,  теперь можно спокойно подумать в чем была причина.

Я нашел метод устранения ошибки 
//Индекс убивался конструкцией БД_ТС.Сжать();


но остались вопросы в причине возникновения
   hogik

24 — 21.07.18 — 19:08

(22)

Дмитрий.

Сделайте индекс как: «IndSource», «ID_Source»

Обязательно с предварительным удалением CDX файла.

Попробуйте свою обработку. Включая БД_ТС.Сжать().

А потом будем обсуждать «вопросы в причине возникновения»(с).

   hogik

25 — 22.07.18 — 19:19

(22)

Дмитрий.

Я попытался промоделировать проблему/сбой.

При фиксированной длине значений всех ключей сбоя не происходит.

Мало того. 🙂 Движок DBF-ов из 1С 8.х нормально отрабатывает индексное выражение с TRIM и разной длиной значений ключей. Устанавливается фиксированная длина ключа в 50 байт — равная длине поля «аргумента» функции TRIM.

Если Вам интересно выяснить причину сбоя, то высылайте мне DBF файл.

Надо его смотреть, а не моё тестовое содержание файла…

  

hogik

26 — 24.07.18 — 00:42

(22)

Дмитрий.

Пока пытался моделировать проблему/сбой обнаружил замечательное явление. 🙂

Если индекс имеет признак уникальности и производится запись/обновление строк DBF с повторяющимся значением поля входящего в индексное выражение, то всё может выглядеть нормальным. А иногда возникает ошибка -310 или заваливается вся сессия 1С-а. Реакция движка DBF-а мало предсказуема и зависит от многих факторов — размера поля, количества записей с повторяющимся значением поля, количества записей/обновлений за одно открытие файлов и т.д.

При любом исходе — индекс становится «битым» с массой случайных эффектов.

И вопрос к Вам.

В Ваших алгоритмах обеспечивается уникальное значение поля по которому строится индекс с признаком уникальности?

Тамика

Котовчанин

942 / 482 / 200

Регистрация: 16.02.2010

Сообщений: 3,338

Записей в блоге: 37

1

06.03.2017, 13:32. Показов 4647. Ответов 4

Метки нет (Все метки)


Всем добрый день!

Пытаюсь написать обработку для выгрузки данных в dbf, нашла разные примеры. В итоге, при попытке записать обработку — выдает ошибку

1C
1
2
3
4
{Обработка.МояОбработка1.Форма.Форма.Форма(16)}: Ошибка при вызове метода контекста (СоздатьФайл)
    БД.СоздатьФайл("catalog.dbf"); //создаем файл физически
по причине:
Ошибка создания файла

Вот сама обработка

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Процедура Кнопка1Нажатие(Элемент)
    
    БД = Новый XBase;
    
    БД.Поля.Добавить("SUPPCODE", "S", 24);    
    БД.Поля.Добавить("DRUGNAME", "S", 255);
    БД.Поля.Добавить("MAKER", "S", 64);
    БД.Поля.Добавить("KOD_MORION", "S", 64);
    БД.Поля.Добавить("PRICE", "N", 6);
    
    БД.СоздатьФайл("catalog.dbf");
    БД.ЗакрытьФайл(); 
    
КонецПроцедуры

Заранее спасибо!

Добавлено через 59 минут
Решено! Нужно указывать полный путь…



0



Dethmontt

07.03.2017, 01:32

Не по теме:

Тамика, рыжий, это твой натуральный цвет волос?



0



Тамика

07.03.2017, 17:21

 [ТС]

Не по теме:

Dethmontt, увы, да 😀



0



Dethmontt

07.03.2017, 18:05

Не по теме:

Цитата
Сообщение от Тамика
Посмотреть сообщение

Dethmontt, увы, да

а мне нравиться… :-[



0



Тамика

07.03.2017, 22:18

 [ТС]


    Создание обработки для выгрузки данных в dbf: Ошибка создания файла

Не по теме:

Цитата
Сообщение от Dethmontt
Посмотреть сообщение

а мне нравиться…

Рада слышать, спасибо :-[



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

07.03.2017, 22:18

5

  1. Здравствуйте! Создаю DBF файл по данным из документа

        Запрос = Новый Запрос;
        Запрос.Текст ="ВЫБРАТЬ
                      |    ПаспортныеДанныеФизЛицСрезПоследних.ДокументСерия,
                      |    ПаспортныеДанныеФизЛицСрезПоследних.ДокументНомер,
                      |    ФИОФизЛицСрезПоследних.Фамилия,
                      |    ФИОФизЛицСрезПоследних.Имя,
                      |    ФИОФизЛицСрезПоследних.Отчество,
                      |    ПеречислениеПодотчетныхСуммРаботникиОрганизации.НомерЛицевогоСчета,
                      |    ПеречислениеПодотчетныхСуммРаботникиОрганизации.Сумма,
                      |    ПеречислениеПодотчетныхСуммРаботникиОрганизации.ФизЛицо
                      |ИЗ
                      |    Документ.ПеречислениеПодотчетныхСумм.РаботникиОрганизации КАК ПеречислениеПодотчетныхСуммРаботникиОрганизации
                      |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПаспортныеДанныеФизЛиц.СрезПоследних КАК ПаспортныеДанныеФизЛицСрезПоследних
                      |        ПО ПеречислениеПодотчетныхСуммРаботникиОрганизации.ФизЛицо = ПаспортныеДанныеФизЛицСрезПоследних.ФизЛицо
                      |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизЛиц.СрезПоследних КАК ФИОФизЛицСрезПоследних
                      |        ПО ПеречислениеПодотчетныхСуммРаботникиОрганизации.ФизЛицо = ФИОФизЛицСрезПоследних.ФизЛицо
                      |ГДЕ
                      |    ПеречислениеПодотчетныхСуммРаботникиОрганизации.Ссылка = &Ссылка";
       
        Запрос.УстановитьПараметр("Ссылка", СсылкакНаДокумент);
       
        Выборка = Запрос.Выполнить().Выбрать();
           
            Если Не ЗначениеЗаполнено(ПутьКФайлу) Тогда
                Предупреждение("Не указан путь к файлу DBF!");
                Возврат;
            КонецЕсли;
           
            ДБФ = Новый XBase;
            ДБФ.ОткрытьФайл(ПутьКФайлу);
            ДБФ.ОчиститьФайл();
            ДБФ.Кодировка =КодировкаXBase.OEM;
            ДБФ.АвтоСохранение=Истина;
            Пока Выборка.Следующий() Цикл
               
                ДБФ.Добавить();
                ДБФ.FIOOWNER = ОбщегоНазначения.ПолучитьФамилиюИмяОтчество(Выборка.Фамилия, Выборка.Имя, Выборка.Отчество, Ложь);
                ДБФ.PASPORT = Строка(Выборка.ДокументСерия)+ " "+Строка(Выборка.ДокументНомер);
                ДБФ.ADDRESS = ПолучитьАдресИзКонтактнойИнформации(Выборка.ФизЛицо);
                ДБФ.INDEX   = "";
                ДБФ.PHONENM = ПолучитьТелефонИзКонтактнойИнформации(Выборка.ФизЛицо);
                ДБФ.VTYPE = "370";
                ДБФ.ACCOUNT = Выборка.НомерЛицевогоСчета;
                ДБФ.CASHVAL = Выборка.Сумма;
            КонецЦикла;
            ДБФ.ЗакрытьФайл();
    

    выскакивает ошибка

    {Документ.ПеречислениеПодотчетныхСумм.Форма.ФормаВыгрузкиВДБФ.Форма(142)}: Ошибка при вызове метода контекста (ОчиститьФайл)
    ДБФ.ОчиститьФайл();
    по причине:
    Перед выполнением операции нужно открыть базу

    в чем дело? Путь указан (ПутьКФайлу — D:Файл.dbf, запись на диск разрешена)


  2. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.890
    Симпатии:
    1.030
    Баллы:
    204

    Файла может не существовать вообще.

  3. т.е. эта процедура открывает уже готовый dbf очищает и добавляет туда записи?


  4. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.890
    Симпатии:
    1.030
    Баллы:
    204

  5. Так и подумал…всё же спасибо большое!


  6. pavl_vs

    Offline

    pavl_vs
    Профессионал в 1С

    Регистрация:
    18 июн 2011
    Сообщения:
    507
    Симпатии:
    42
    Баллы:
    54

    Фрагмент кода создания и записи в ДБФ должен быть таким:

    ДБФ = Новый XBase;
    ДБФ.Кодировка = КодировкаXBase.OEM;
    ДБФ.АвтоСохранение = Истина; 
    ДБФ.СоздатьФайл(ПутьКФайлу);
    ДБФ.Записать(); 
    ДБФ.ОчиститьФайл();
    
    Пока Выборка.Следующий() Цикл 
        ДБФ.Добавить(); 
        ДБФ.FIOOWNER = ОбщегоНазначения.ПолучитьФамилиюИмяОтчество(Выборка.Фамилия, Выборка.Имя, Выборка.Отчество, Ложь); 
        ДБФ.PASPORT = Строка(Выборка.ДокументСерия)+ " "+Строка(Выборка.ДокументНомер); 
        ДБФ.ADDRESS = ПолучитьАдресИзКонтактнойИнформации(Выборка.ФизЛицо); ДБФ.INDEX = ""; 
        ДБФ.PHONENM = ПолучитьТелефонИзКонтактнойИнформации(Выборка.ФизЛицо); 
        ДБФ.VTYPE = "370"; 
        ДБФ.ACCOUNT = Выборка.НомерЛицевогоСчета; 
        ДБФ.CASHVAL = Выборка.Сумма; 
        ДБФ.Записать();
    КонецЦикла;
    
    ДБФ.ЗакрытьФайл();
    

    Помимо ошибки, связанной с очисткой файла, в оригинале есть ошибка в цикле обработки выборки — запись каждой строки начинается с «Добавить» и заканчивается «Записать».


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 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", // выражение индекса
        Истина  // уникальность создаваемого индекса
    );
 
    КаталогДляЭкспериментов = КаталогДокументов() + "helpme1s.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 - число
 
    КаталогДляЭкспериментов = КаталогДокументов() + "helpme1s.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С программистов и разработчик обновлятора).

Владимир Милькин

Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

Нажмите одну из кнопок, чтобы поделиться:

44889

Анна Викулина

Руководитель Центра
сопровождения 1С

25 июля 2019

Интеграция

Актуальность проверена: 26.01.2023

Получить консультацию
Бесплатно

Консультации по 1С

Консультации по 1С

Протестируйте качество нашей работы — получите первую консультацию в подарок.

Одним из самых распространенных форматов баз данных до сих пор остается формат DBF. И неумение работать с ним из 1С – серьезное ограничение профессиональных навыков для любого специалиста. Тем более изучение теории и практика по этому вопросу потребует совсем немного времени. К тому же работа с DBF файлом никаких дополнительных библиотек не требует – все инструменты встроены в платформу 1С 8.3.

Чтение, создание DBF и запись в данный формат

Вся работа с DBF в 1С происходит с помощью специального объекта – xBase. Рассмотрим основные действия с файлами, начав с чтения из конкретного DBF. В первую очередь необходимо расположить файл базы данных в каталоге, куда есть доступ у пользователя. Код для считывания данных в 1С достаточно прост:

  1. Указываем путь к базе в формате DBF;
    
    ПутьКФайлу = "D:Nom.DBF";
    

  2. Создаем объект для взаимодействия с файлом, открываем его и устанавливаем указатель на первую строку с данными;
    
    ФайлDBF = Новый XBase;
    ФайлDBF.ОткрытьФайл(ПутьКФайлу,,Истина);
    

  3. В цикле обходим всю базу и производим действия с элементами. В данном случае просто отражаем их на экране пользователя;
    
    Пока НЕ ФайлDBF.ВКонце() Цикл
    Сообщить("" + ФайлDBF.NAIM +" - "+ФайлDBF.ARTI);
    ФайлDBF.Следующая();
    КонецЦикла;
    

  4. Закрываем файл.
    
    ФайлDBF.ЗакрытьФайл();
    

Вторая часто встречающаяся задача по взаимодействию с объектом – выгрузка DBF из 1С 8.3. Здесь намного легче создать конечный файл нужного формата программно, чем использовать дополнительно программное обеспечение. Этот алгоритм в 1С тоже достаточно прост и состоит из нескольких строк кода:

  1. Создаем объект XBase;
    
    НовыйФайл = Новый XBase;
    

  2. Определяем кодировку нового файла. Существует кодировка для Windows – ANSI и OEM предназначенная для DOS;
    
    НовыйФайл.Кодировка = КодировкаXBase.ANSI;
    

  3. Необходимо описать все колонки будущего файла DBF, указав их тип;
    
    НовыйФайл.Поля.Добавить("Naim","S",100);
    НовыйФайл.Поля.Добавить("KOD","N",10);
    

  4. Укажем каталог, в котором будет происходить создание DBF и запишем итоговый файл.
    
    Путь = "D:Clients.DBF";
    НовыйФайл.СоздатьФайл(Путь);
    НовыйФайл.Записать();
    

Рис.1 Расположение файлов DBF
Рис.1 Расположение файлов DBF

После того как мы создали файл нужного формата, потребуется выгрузка в DBF данных. Программируя этот процесс, помните о том, что данные ИБ находятся на сервере. Чтобы записать имеющиеся данные из 1С необходимо к предыдущему коду добавить следующий алгоритм:

  1. Получаем информацию из справочника;
    
    Контрагенты = Справочники.Контрагенты.Выбрать();
    

  2. В цикле последовательно добавляем по 1строчке и записываем;
    
    Пока Контрагенты.Следующий() Цикл
    НовыйФайл.Добавить();
    НовыйФайл. Naim = Контрагенты.Наименование;
    НовыйФайл. KOD = Контрагенты.Код;
    НовыйФайл.Записать();
    КонецЦикла;
    

  3. Закрываем файл и проверяем, что запись прошла удачно.
    
    НовыйФайл.ЗакрытьФайл();
    

Это основы работы с данным форматом. Существуют и другие способы открыть из 1С DBF, но xBase остается самым простым по синтаксису и пониманию. Поняв, как осуществляется простейшая выгрузка и загрузка из DBF, можно приступать к более сложным элементам, например, использованию индексов для поиска, удалению или изменению конкретных записей в DBF, а также применению технологии ADO.

Другие статьи по теме

Конфликт блокировок при выполнении транзакции в 1С

Конфликт блокировок при выполнении транзакции в 1С

Для большинства пользователей сообщение о конфликте блокировок 1С означает лишь ошибку, мешающую им выполнять свою работу. Они хотят поскорее избавиться от этой проблемы и осаждают IT-отдел жалобами на…

Бесшовная интеграция с 1С:Документооборот

Бесшовная интеграция с 1С:Документооборот

Ведение основной и дополнительной деятельности компанией требуется сопровождать процессом обработки документов, который в свою очередь требует не только использования систем бухгалтерского учета или к…

Первоначальная настройка параметров в 1С Управление торговлей 11.4

Первоначальная настройка параметров в 1С Управление торговлей 11.4

Настройку 1С можно выполнить в процессе работы, но правильнее реализовать данный шаг до момента создания основных документов и проводок, поскольку от корректности настройки параметров в системе зависи…

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • 1с ошибка совместного доступа к файлу e1cib tempstorage
  • 1с ошибка совместного доступа к файлу depot dat new