|
Странная ошибка при работе с ДБФ | ☑ | ||
---|---|---|---|---|
0
ЧессМастер
05.07.18
✎
17:16
|
Всем доброе время суток !
Столкнулся со странной ошибкой при работе с ДБФ. При попытке программной переиндексации средствами 1С выдает ошибку Error #: -20 Creating File Temporary Working File При этом сам файл ДБФ прекрасно открывается ДБФ редактором. В файле 225 500 записей. Кто сталкивался с подобной ошибкой - в чем может быть дело ? |
|||
1
hogik
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
hogik
05.07.18
✎
20:30
|
Покажите текст про создание БД_ТС.
|
|||
4
Lama12
05.07.18
✎
20:46
|
(0) Имя файла должно быть в формате 8.3 и желательно английскими буквами.
|
|||
5
Lama12
05.07.18
✎
20:47
|
(4) 8.3 это не версия 1с.
|
|||
6
DES
05.07.18
✎
20:54
|
имена полей (индексируемых) должны быть в верхнем регистре
|
|||
7
ice777
05.07.18
✎
21:04
|
(0) индексный файл и дбф это два разные файлы, если что )
первый только ключи для поиска, второй- данные, которые у тебя "прекрасно открываются". по тексту ошибки нет места на диске для индексного |
|||
8
ice777
05.07.18
✎
21:06
|
по жизни видал ситуации, когда индексный больше файла с данными, в выражение для поиска можно было включать и функции. Да и вообще- индексный- это дерево.
|
|||
9
ЧессМастер
06.07.18
✎
09:33
|
(4) Имя файла ts.dbf
Имя индексного файла ts.cdx |
|||
10
ЧессМастер
06.07.18
✎
09:41
|
(3)
код создания ДБФ
|
|||
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
olegves
06.07.18
✎
12:29
|
не знаю как в 8ке, но в клюшках помнится заголовок файла CDX, сформированного 1С, отличался от заголовка такого же в FoxPro. При этом Лис принимал 1Ский файл, но не мог по нему производить поиск.
|
|||
15
olegves
06.07.18
✎
12:35
|
+ (14) как вариант, откажись от индексов в пользу Х+1 дбф. 1 - главная, там сделай имя таблицы (всего их будет Х). поиск будет в 2 таблицах: в Главной по ключевому полю находишь имя таблицы, в которой продолжишь поиск
|
|||
16
ЧессМастер
06.07.18
✎
13:07
|
(15) Вопрос решился.
Индекс убивался конструкцией БД_ТС.Сжать(); Всем спасибо за помощь ! |
|||
17
hogik
06.07.18
✎
16:29
|
(15)
"Индекс убивался конструкцией БД_ТС.Сжать();"(с) А где этот оператор в тексте, который Вы показываете? :-) "Вопрос решился."(с) Не решился. :-) Вопрос решится после убирания TRIM в индексном выражении. Т.к. длина ключей в xBase должна быть одинакова для ВСЕХ ключей. |
|||
18
hogik
06.07.18
✎
16:38
|
(16)
"Индекс убивался конструкцией БД_ТС.Сжать();"(с) А где этот оператор в тексте, который Вы показываете? :-) "Вопрос решился."(с) Не решился. :-) Вопрос решится после убирания TRIM в индексном выражении. Т.к. длина ключей в xBase должна быть одинакова для ВСЕХ ключей. |
|||
19
hogik
06.07.18
✎
19:38
|
(16)
Поясню своё предыдущее сообщение в данной теме. Есть странная ;-) информация, что "FoxPro не поддерживает переменную длину индексного ключа. Если вы попытаетесь построить индекс с ключом, который имеет различные длины, то ключ будет дополнен пробелами."(с) Например, тут: http://www.foxclub.ru/rhproject/project/html/576a2953-04ff-4a66-9e38-3a3d9c990b72.hhtm Но, движок из 1С для поддержки DBF не делает этого. Ну, до какой длины надо дополнять пробелы? :-) И возникает ошибка или строится "битый" индекс. Это очень старая ошибка в движке... |
|||
20
hogik
06.07.18
✎
21:36
|
||||
21
Злопчинский
18.07.18
✎
03:26
|
||||
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
hogik
21.07.18
✎
19:08
|
(22)
Дмитрий. Сделайте индекс как: "IndSource", "ID_Source" Обязательно с предварительным удалением CDX файла. Попробуйте свою обработку. Включая БД_ТС.Сжать(). А потом будем обсуждать "вопросы в причине возникновения"(с). |
|||
25
hogik
22.07.18
✎
19:19
|
(22)
Дмитрий. Я попытался промоделировать проблему/сбой. При фиксированной длине значений всех ключей сбоя не происходит. Мало того. :-) Движок DBF-ов из 1С 8.х нормально отрабатывает индексное выражение с TRIM и разной длиной значений ключей. Устанавливается фиксированная длина ключа в 50 байт - равная длине поля "аргумента" функции TRIM. Если Вам интересно выяснить причину сбоя, то высылайте мне DBF файл. Надо его смотреть, а не моё тестовое содержание файла... |
|||
26
hogik
24.07.18
✎
00:42
|
(22)
Дмитрий. Пока пытался моделировать проблему/сбой обнаружил замечательное явление. :-) Если индекс имеет признак уникальности и производится запись/обновление строк DBF с повторяющимся значением поля входящего в индексное выражение, то всё может выглядеть нормальным. А иногда возникает ошибка -310 или заваливается вся сессия 1С-а. Реакция движка DBF-а мало предсказуема и зависит от многих факторов - размера поля, количества записей с повторяющимся значением поля, количества записей/обновлений за одно открытие файлов и т.д. При любом исходе - индекс становится "битым" с массой случайных эффектов. И вопрос к Вам. В Ваших алгоритмах обеспечивается уникальное значение поля по которому строится индекс с признаком уникальности? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |