Странная ошибка при работе с ДБФ |
Я |
ЧессМастер
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, нашла разные примеры. В итоге, при попытке записать обработку — выдает ошибку
Вот сама обработка
Заранее спасибо! Добавлено через 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 в 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С можно выполнить в процессе работы, но правильнее реализовать данный шаг до момента создания основных документов и проводок, поскольку от корректности настройки параметров в системе зависи…
Тамика Котовчанин 942 / 482 / 200 Регистрация: 16.02.2010 Сообщений: 3,338 Записей в блоге: 37 |
||||||||
1 |
||||||||
06.03.2017, 13:32. Показов 5157. Ответов 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 |
10.10.12 — 14:46
Здравствуйте! Помогите, пожалуйста, разобраться…
Есть схема:
<?xml version=»1.0″ encoding=»windows-1251″?>
<xs:schema xmlns:xs=»http://www.w3.org/2001/XMLSchema» xmlns:sch=»http://purl.oclc.org/dsdl/schematron» xmlns:usch=»http://www.unisoftware.ru/schematron-extensions» elementFormDefault=»qualified» attributeFormDefault=»unqualified»>
<xs:element name=»Файл»>
<xs:annotation>
<xs:documentation>Файл обмена</xs:documentation>
…
Пишу:
Фабрика = СоздатьФабрикуXDTO(ПутьКСхеме);
Тип_Файл = Фабрика.Тип(«http://www.w3.org/2001/XMLSchema», «Файл»);
Файл_XDTO = Фабрика.Создать(Тип_Файл);
Ошибка:
Ошибка при вызове метода контекста (Создать)
Файл_XDTO = Фабрика.Создать(Тип_Файл);
по причине:
Несоответствие типов (параметр номер ‘1’)
Очень прошу помочь разобраться
1 — 10.10.12 — 14:48
И что тебе непонятно?
2 — 10.10.12 — 14:49
3 — 10.10.12 — 14:51
И правда смешно) я такая глупая, не догадалась в википедии сразу посмотреть)
4 — 10.10.12 — 14:57
(3)Отладчик что содержит в переменной «Тип_Файл»?
5 — 10.10.12 — 14:58
ФабрикаXDTO (XDTOFactory)
Создать (Create)
Вариант синтаксиса: Создание значения из значения
Синтаксис:
Создать(<Тип>, <Значение>)
Параметры:
<Тип> (обязательный)
Тип: ТипЗначенияXDTO.
Тип, значение которого необходимо создать.
<Значение> (обязательный)
Тип: Произвольный.
Произвольное значение, на основе которого должно быть создано значение XDTO.
Вариант синтаксиса: Создание значения по лексическому представлению
Синтаксис:
Создать(<Тип>, <Строка>)
Параметры:
<Тип> (обязательный)
Тип: ТипЗначенияXDTO.
Тип, значение которого необходимо создать.
<Строка> (обязательный)
Тип: Строка.
Лексическое представление значения.
Вариант синтаксиса: Создание объекта
Синтаксис:
Создать(<Тип>)
Параметры:
<Тип> (обязательный)
Тип: ТипОбъектаXDTO.
Тип, объект которого необходимо создать.
Возвращаемое значение:
Тип: ЗначениеXDTO.
Описание:
Создает значение XDTO на основе строки (лексического представления значения).
Доступность:
Тонкий клиент, сервер, толстый клиент, внешнее соединение.
Примечание:
Лексическое представление значения должно удовлетворять ограничениям, определяемым данным типом значения XDTO.
6 — 10.10.12 — 15:00
ТипЗначенияXDTO (XDTOValueType)
Свойства:
URIПространстваИмен (NamespaceURI)
БазовыйТип (BaseType)
Имя (Name)
ТипыЧленовОбъединения (MemberTypes)
ТипЭлементаСписка (ListItemType)
Фасеты (Facets)
Методы:
Проверить (Validate)
ЭтоПотомок (IsDescendant)
Описание:
Определяет тип значений модели XDTO.
Доступность:
Тонкий клиент, сервер, толстый клиент, внешнее соединение.
См. также:
ЗначениеXDTO, метод Тип
КоллекцияТиповЗначенийXDTO, метод Получить
ТипЗначенияXDTO, свойство БазовыйТип
ТипЗначенияXDTO, свойство ТипЭлементаСписка
ТипЗначенияXDTO, метод ЭтоПотомок
ФабрикаXDTO, метод Привести
ФабрикаXDTO, метод Создать
7 — 10.10.12 — 15:01
ФабрикаXDTO.Тип (XDTOFactory.Type)
ФабрикаXDTO (XDTOFactory)
Тип (Type)
Вариант синтаксиса: По имени и URI пространства имен
Синтаксис:
Тип(<URIПространстваИмен>, <Имя>)
Параметры:
<URIПространстваИмен> (обязательный)
Тип: Строка.
URI пространства имен запрашиваемого типа.
<Имя> (обязательный)
Тип: Строка.
Имя запрашиваемого типа.
Вариант синтаксиса: По раширенному имени XML
Синтаксис:
Тип(<ИмяXML>)
Параметры:
<ИмяXML> (обязательный)
Тип: РасширенноеИмяXML.
Расширенное имя XML.
Вариант синтаксиса: По типу данных XML
Синтаксис:
Тип(<ТипДанных>)
Параметры:
<ТипДанных> (обязательный)
Тип: ТипДанныхXML.
Тип данных XML, по которому запрашивается тип XDTO.
Возвращаемое значение:
Тип: ТипЗначенияXDTO; ТипОбъектаXDTO; Неопределено.
Описание:
Получение типа XDTO.
Доступность:
Тонкий клиент, сервер, толстый клиент, внешнее соединение.
8 — 10.10.12 — 15:02
Судя по ошибки, у тебя должен быть тип «ТипОбъектаXDTO»
9 — 10.10.12 — 15:03
+ Потому что команда
Тип_Файл = Фабрика.Тип(«http://www.w3.org/2001/XMLSchema», «Файл»);
Вернет одно из значений
Возвращаемое значение:
Тип: ТипЗначенияXDTO; ТипОбъектаXDTO; Неопределено.
10 — 10.10.12 — 15:08
Тип_Файл — неопределено
11 — 10.10.12 — 15:15
Тип_Файл = Фабрика.Тип(«http://www.unisoftware.ru/schematron-extensions», «Файл»);
или
Тип_Файл = Фабрика.Тип(«http://purl.oclc.org/dsdl/schematron», «Файл»);
в зависимости где определено «Файл»
по моему так.
12 — 10.10.12 — 15:34
Я часть схемы вверху привела
Фабрика.Тип(«http://purl.oclc.org/dsdl/schematron», «Файл») = Истина
Фабрика.Создать(Тип_Файл) всё равно выдаёт ошибку
13 — 10.10.12 — 15:45
Совершенно не понимаю ничего в этом синтаксисе( помогите, пожалуйста…
14 — 10.10.12 — 15:47
где тип Файл определен?
15 — 10.10.12 — 15:56
Правильно понимаю, что в этой строке надо описать тип значений?
<xs:element name=»Файл»>
16 — 10.10.12 — 15:59
выложи где нибудь файл схемы и файл хмл который читаешь. а там посмотрим как тебе это все читать…
17 — 10.10.12 — 16:03
Я пытаюсь создать файл хмл
Схема тут:
http://files.mail.ru/YMUE92
18 — 10.10.12 — 16:28
схему с таким определением 1С не прочтет. Вынеси определения типов, сделай их именоваными и явно свяжи.
19 — 10.10.12 — 16:41
Что-то сложное видимо мне сейчас предстоит)))
спасибо за помощь…
20 — 10.10.12 — 17:02
да нет там ничего сложного… просто свою писалку хмл сделай (за пример можно взять любой пример из инета про ЗаписьXML)
тебе никакого смысла от этой схемы нет на этапе создания, а валидацию можешь потом на скрипте сделать.
21 — 10.10.12 — 17:14
да уж))) легко вам, умным так говорить))
22 — 10.10.12 — 17:16
(0)
encoding=»windows-1251″
quest
23 — 10.10.12 — 17:48
(21) пиши. плюнь на все и пиши. сперва получиться фигня, потом перепишешь и станет лучше, потом еще раз перепишешь…
А потом вопросов подобных в 0 не будет возникать
В платформе 1С сообщения об ошибках бывают достаточно запутаны, и без должных навыков разобраться в причинах достаточно сложно. Вот и сообщение об ошибке при вызове контекста может ввести в ступор начинающего разработчика. Однако в подавляющем большинстве случаев мы видим подобное сообщение, если разработчик допустил ошибку в своем коде. Причем речь зачастую идет не об орфографических ошибках, а о логических.
Исправляем ситуацию
Чтобы избавиться от этого неприятного сообщения об ошибке при вызове метода контекста, следует понимать, что контекстом называют методы платформы 1С. Значит в определенной строке кода воспользовались методом с неверными параметрами или вызвали его не от того владельца. Всегда внимательно и полностью читайте сообщения об ошибках – часто в них содержится указание на строку и метод, вызвавший ошибку. Это поможет сэкономить время на отладку и поиск проблемного места в коде.
Приглашаем на
бесплатный вебинар!
06 июня в 11:00 мск
1 час
Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| ";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
КонецЦикла;
Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.
Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.
Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа ";
НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
КонецЦикла;
1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.
В конфигураторе находим строку и метод, на который указывало сообщение об ошибке, и нажимаем на него правой кнопкой мыши. Выбираем пункт «Поиск в синтакс-помощнике» и платформа самостоятельно ищет справочную информацию по выделенному методу. В справке мы видим не только подробное описание параметров и самого метода, но и пример. Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает.
Чаще всего причиной подобных ошибок выступают следующие факторы:
- Невнимательность;
- Отсутствие опыта или знаний;
- Несогласованность действий разработчиков друг с другом;
- Изменения в методах контекста в новых версиях платформы.
Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.
Сделала внешний отчет — формируется все хорошо, но когда пытаешься сделать расшифровку какой-либо строки выдает следующее: {Отчет.УниверсальныйОтчет(5748)}: Ошибка при вызове метода контекста (Создать): Файл не обнаружен ‘C:Documents and SettingsuserLocal SettingsTempv8_12_19.tmp’ ОтчетРасшифровка = ВнешниеОтчеты.Создать(Отчет.ИспользуемоеИмяФайла); по причине: Файл не обнаружен ‘C:Documents and SettingsuserLocal SettingsTempv8_12_19.tmp’ Если делать расшифровку через открытие формы настройки, то все хорошо. Также ошибка не выходит, если делать через Файл-Открыть. В чем ошибка? То же самое происходит, если полностью типовой отчет сохранить как внешний, а потом прикрепить к базе через внешние обработки и отчеты. В некоторых случаях удобнее пользоваться быстрым вызовом расшифровки
Temp в корень диска вынеси.
Кто-нить может проверить у себя, на любом отчете?
Вообщем проблема в том, что если ты сохраняешь отчет как внешний в конфе, то типовой механизм внешних отчетов/обработок при его открытии создает временный файл, сохраняет туда ХранилищеЗначения, затем открывает форму, затем !удаляет файл!. Но, временное имя внешнего отчета уже сохранилось в открытом отчете и соотв. при вызове расшифровки этого файла не будет и расшифровка не выполнится … ЗЫ Это я в поледней УПП посмотрел.
да это везде в типовых так…
Наверное. Раньше я туда не лазил, а вот теперь появился повод С СКД таких проблем нет.
Тэги:
Комментарии доступны только авторизированным пользователям