Странная ошибка при работе с ДБФ |
Я |
05.07.18 — 17:16
Всем доброе время суток !
Столкнулся со странной ошибкой при работе с ДБФ.
При попытке программной переиндексации средствами 1С выдает ошибку
Error #: -20
Creating File
Temporary Working File
При этом сам файл ДБФ прекрасно открывается ДБФ редактором.
В файле 225 500 записей.
Кто сталкивался с подобной ошибкой — в чем может быть дело ?
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) В тексте программы ничего необычного
Состояние("Ждите. Идет переиндексация файла таблицы соответствия ...");
Попытка
БД_ТС.Переиндексировать();
Исключение
Сообщить("ВНИМАНИЕ! Не удалось переиндексировать
таблицу соответствия: " + ИмяФайлаТС + "
| " +
ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
КонецПопытки;
Ошибка возникает при разных именах файлов, разных каталогах и разных компьютерах.
Может проблема в том что при создании индекса не нравится содержимое поля записи ? Но ведь редактором файл открывается.
3 — 05.07.18 — 20:30
Покажите текст про создание БД_ТС.
4 — 05.07.18 — 20:46
(0) Имя файла должно быть в формате 8.3 и желательно английскими буквами.
5 — 05.07.18 — 20:47
(4) 8.3 это не версия 1с.
6 — 05.07.18 — 20:54
имена полей (индексируемых) должны быть в верхнем регистре
7 — 05.07.18 — 21:04
(0) индексный файл и дбф это два разные файлы, если что )
первый только ключи для поиска, второй- данные, которые у тебя «прекрасно открываются».
по тексту ошибки нет места на диске для индексного
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 создается ?
14 — 06.07.18 — 12:29
не знаю как в 8ке, но в клюшках помнится заголовок файла CDX, сформированного 1С, отличался от заголовка такого же в FoxPro. При этом Лис принимал 1Ский файл, но не мог по нему производить поиск.
15 — 06.07.18 — 12:35
+ (14) как вариант, откажись от индексов в пользу Х+1 дбф. 1 — главная, там сделай имя таблицы (всего их будет Х). поиск будет в 2 таблицах: в Главной по ключевому полю находишь имя таблицы, в которой продолжишь поиск
16 — 06.07.18 — 13:07
(15) Вопрос решился.
Индекс убивался конструкцией БД_ТС.Сжать(); Всем спасибо за помощь !
17 — 06.07.18 — 16:29
(15)
«Индекс убивался конструкцией БД_ТС.Сжать();»(с)
А где этот оператор в тексте, который Вы показываете? :-) "Вопрос решился."(с) Не решился. :-)
Вопрос решится после убирания TRIM в индексном выражении.
Т.к. длина ключей в xBase должна быть одинакова для ВСЕХ ключей.
18 — 06.07.18 — 16:38
(16)
«Индекс убивался конструкцией БД_ТС.Сжать();»(с)
А где этот оператор в тексте, который Вы показываете? :-) "Вопрос решился."(с) Не решился. :-)
Вопрос решится после убирания TRIM в индексном выражении.
Т.к. длина ключей в xBase должна быть одинакова для ВСЕХ ключей.
19 — 06.07.18 — 19:38
(16)
Поясню своё предыдущее сообщение в данной теме.
Есть странная 😉 информация, что «FoxPro не поддерживает переменную длину индексного ключа. Если вы попытаетесь построить индекс с ключом, который имеет различные длины, то ключ будет дополнен пробелами.»(с) Например, тут: http://www.foxclub.ru/rhproject/project/html/576a2953-04ff-4a66-9e38-3a3d9c990b72.hhtm
Но, движок из 1С для поддержки DBF не делает этого. Ну, до какой длины надо дополнять пробелы? 🙂 И возникает ошибка или строится «битый» индекс. Это очень старая ошибка в движке…
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) Извиняюсь что долго не отвечал. Сильно был занят, не было времени ответить.
Острота проблемы спала, теперь можно спокойно подумать в чем была причина.
Я нашел метод устранения ошибки
//Индекс убивался конструкцией БД_ТС.Сжать();
но остались вопросы в причине возникновения
24 — 21.07.18 — 19:08
(22)
Дмитрий.
Сделайте индекс как: «IndSource», «ID_Source»
Обязательно с предварительным удалением CDX файла.
Попробуйте свою обработку. Включая БД_ТС.Сжать().
А потом будем обсуждать «вопросы в причине возникновения»(с).
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, нашла разные примеры. В итоге, при попытке записать обработку — выдает ошибку
Вот сама обработка
Заранее спасибо! Добавлено через 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 [ТС] |
|
Не по теме:
а мне нравиться… Рада слышать, спасибо :-[
0 |
|
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
07.03.2017, 22:18 |
|
5 |
-
Здравствуйте! Создаю DBF файл по данным из документа
Запрос = Новый Запрос; Запрос.Текст ="ВЫБРАТЬ | ПаспортныеДанныеФизЛицСрезПоследних.ДокументСерия, | ПаспортныеДанныеФизЛицСрезПоследних.ДокументНомер, | ФИОФизЛицСрезПоследних.Фамилия, | ФИОФизЛицСрезПоследних.Имя, | ФИОФизЛицСрезПоследних.Отчество, | ПеречислениеПодотчетныхСуммРаботникиОрганизации.НомерЛицевогоСчета, | ПеречислениеПодотчетныхСуммРаботникиОрганизации.Сумма, | ПеречислениеПодотчетныхСуммРаботникиОрганизации.ФизЛицо |ИЗ | Документ.ПеречислениеПодотчетныхСумм.РаботникиОрганизации КАК ПеречислениеПодотчетныхСуммРаботникиОрганизации | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПаспортныеДанныеФизЛиц.СрезПоследних КАК ПаспортныеДанныеФизЛицСрезПоследних | ПО ПеречислениеПодотчетныхСуммРаботникиОрганизации.ФизЛицо = ПаспортныеДанныеФизЛицСрезПоследних.ФизЛицо | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизЛиц.СрезПоследних КАК ФИОФизЛицСрезПоследних | ПО ПеречислениеПодотчетныхСуммРаботникиОрганизации.ФизЛицо = ФИОФизЛицСрезПоследних.ФизЛицо |ГДЕ | ПеречислениеПодотчетныхСуммРаботникиОрганизации.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", СсылкакНаДокумент); Выборка = Запрос.Выполнить().Выбрать(); Если Не ЗначениеЗаполнено(ПутьКФайлу) Тогда Предупреждение("Не указан путь к файлу DBF!"); Возврат; КонецЕсли; ДБФ = Новый XBase; ДБФ.ОткрытьФайл(ПутьКФайлу); ДБФ.ОчиститьФайл(); ДБФ.Кодировка =КодировкаXBase.OEM; ДБФ.АвтоСохранение=Истина; Пока Выборка.Следующий() Цикл ДБФ.Добавить(); ДБФ.FIOOWNER = ОбщегоНазначения.ПолучитьФамилиюИмяОтчество(Выборка.Фамилия, Выборка.Имя, Выборка.Отчество, Ложь); ДБФ.PASPORT = Строка(Выборка.ДокументСерия)+ " "+Строка(Выборка.ДокументНомер); ДБФ.ADDRESS = ПолучитьАдресИзКонтактнойИнформации(Выборка.ФизЛицо); ДБФ.INDEX = ""; ДБФ.PHONENM = ПолучитьТелефонИзКонтактнойИнформации(Выборка.ФизЛицо); ДБФ.VTYPE = "370"; ДБФ.ACCOUNT = Выборка.НомерЛицевогоСчета; ДБФ.CASHVAL = Выборка.Сумма; КонецЦикла; ДБФ.ЗакрытьФайл();выскакивает ошибка
{Документ.ПеречислениеПодотчетныхСумм.Форма.ФормаВыгрузкиВДБФ.Форма(142)}: Ошибка при вызове метода контекста (ОчиститьФайл)
ДБФ.ОчиститьФайл();
по причине:
Перед выполнением операции нужно открыть базув чем дело? Путь указан (ПутьКФайлу — D:Файл.dbf, запись на диск разрешена)
-
Offline
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.890
- Симпатии:
- 1.030
- Баллы:
- 204
Файла может не существовать вообще.
-
т.е. эта процедура открывает уже готовый dbf очищает и добавляет туда записи?
-
Offline
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.890
- Симпатии:
- 1.030
- Баллы:
- 204
-
Так и подумал…всё же спасибо большое!
-
Offline
pavl_vs
Профессионал в 1С- Регистрация:
- 18 июн 2011
- Сообщения:
- 507
- Симпатии:
- 42
- Баллы:
- 54
Фрагмент кода создания и записи в ДБФ должен быть таким:
ДБФ = Новый XBase; ДБФ.Кодировка = КодировкаXBase.OEM; ДБФ.АвтоСохранение = Истина; ДБФ.СоздатьФайл(ПутьКФайлу); ДБФ.Записать(); ДБФ.ОчиститьФайл(); Пока Выборка.Следующий() Цикл ДБФ.Добавить(); ДБФ.FIOOWNER = ОбщегоНазначения.ПолучитьФамилиюИмяОтчество(Выборка.Фамилия, Выборка.Имя, Выборка.Отчество, Ложь); ДБФ.PASPORT = Строка(Выборка.ДокументСерия)+ " "+Строка(Выборка.ДокументНомер); ДБФ.ADDRESS = ПолучитьАдресИзКонтактнойИнформации(Выборка.ФизЛицо); ДБФ.INDEX = ""; ДБФ.PHONENM = ПолучитьТелефонИзКонтактнойИнформации(Выборка.ФизЛицо); ДБФ.VTYPE = "370"; ДБФ.ACCOUNT = Выборка.НомерЛицевогоСчета; ДБФ.CASHVAL = Выборка.Сумма; ДБФ.Записать(); КонецЦикла; ДБФ.ЗакрытьФайл();Помимо ошибки, связанной с очисткой файла, в оригинале есть ошибка в цикле обработки выборки — запись каждой строки начинается с «Добавить» и заканчивается «Записать».
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 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С
Протестируйте качество нашей работы — получите первую консультацию в подарок.
Одним из самых распространенных форматов баз данных до сих пор остается формат DBF. И неумение работать с ним из 1С – серьезное ограничение профессиональных навыков для любого специалиста. Тем более изучение теории и практика по этому вопросу потребует совсем немного времени. К тому же работа с DBF файлом никаких дополнительных библиотек не требует – все инструменты встроены в платформу 1С 8.3.
Чтение, создание DBF и запись в данный формат
Вся работа с DBF в 1С происходит с помощью специального объекта – xBase. Рассмотрим основные действия с файлами, начав с чтения из конкретного DBF. В первую очередь необходимо расположить файл базы данных в каталоге, куда есть доступ у пользователя. Код для считывания данных в 1С достаточно прост:
- Указываем путь к базе в формате DBF;
ПутьКФайлу = "D:Nom.DBF"; - Создаем объект для взаимодействия с файлом, открываем его и устанавливаем указатель на первую строку с данными;
ФайлDBF = Новый XBase; ФайлDBF.ОткрытьФайл(ПутьКФайлу,,Истина); - В цикле обходим всю базу и производим действия с элементами. В данном случае просто отражаем их на экране пользователя;
Пока НЕ ФайлDBF.ВКонце() Цикл Сообщить("" + ФайлDBF.NAIM +" - "+ФайлDBF.ARTI); ФайлDBF.Следующая(); КонецЦикла; - Закрываем файл.
ФайлDBF.ЗакрытьФайл();
Вторая часто встречающаяся задача по взаимодействию с объектом – выгрузка DBF из 1С 8.3. Здесь намного легче создать конечный файл нужного формата программно, чем использовать дополнительно программное обеспечение. Этот алгоритм в 1С тоже достаточно прост и состоит из нескольких строк кода:
- Создаем объект XBase;
НовыйФайл = Новый XBase; - Определяем кодировку нового файла. Существует кодировка для Windows – ANSI и OEM предназначенная для DOS;
НовыйФайл.Кодировка = КодировкаXBase.ANSI; - Необходимо описать все колонки будущего файла DBF, указав их тип;
НовыйФайл.Поля.Добавить("Naim","S",100); НовыйФайл.Поля.Добавить("KOD","N",10); - Укажем каталог, в котором будет происходить создание DBF и запишем итоговый файл.
Путь = "D:Clients.DBF"; НовыйФайл.СоздатьФайл(Путь); НовыйФайл.Записать();

После того как мы создали файл нужного формата, потребуется выгрузка в DBF данных. Программируя этот процесс, помните о том, что данные ИБ находятся на сервере. Чтобы записать имеющиеся данные из 1С необходимо к предыдущему коду добавить следующий алгоритм:
- Получаем информацию из справочника;
Контрагенты = Справочники.Контрагенты.Выбрать(); - В цикле последовательно добавляем по 1строчке и записываем;
Пока Контрагенты.Следующий() Цикл НовыйФайл.Добавить(); НовыйФайл. Naim = Контрагенты.Наименование; НовыйФайл. KOD = Контрагенты.Код; НовыйФайл.Записать(); КонецЦикла; - Закрываем файл и проверяем, что запись прошла удачно.
НовыйФайл.ЗакрытьФайл();
Это основы работы с данным форматом. Существуют и другие способы открыть из 1С DBF, но xBase остается самым простым по синтаксису и пониманию. Поняв, как осуществляется простейшая выгрузка и загрузка из DBF, можно приступать к более сложным элементам, например, использованию индексов для поиска, удалению или изменению конкретных записей в DBF, а также применению технологии ADO.
Другие статьи по теме

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

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

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