Имя: Пароль:
1C
1С v8
Странная ошибка при работе с ДБФ
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)

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


    БД_ТС = Новый 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 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
(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 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-а мало предсказуема и зависит от многих факторов - размера поля, количества записей с повторяющимся значением поля, количества записей/обновлений за одно открытие файлов и т.д.
При любом исходе - индекс становится "битым" с массой случайных эффектов.
И вопрос к Вам.
В Ваших алгоритмах обеспечивается уникальное значение поля по которому строится индекс с признаком уникальности?