Имя: Пароль:
1C
 
Ошибка при работе с DBF, xbase, cdx
0 assest
 
17.02.16
15:42
Есть файл соответствия .DBF и индексы в .cdx.
Есть цикл
ВКонцеТС        = БД_ТС.ВКонце();
Пока НЕ ВКонцеТС Цикл
    ТекущееИмяМенеджера    = СокрЛП(БД_ТС.Manager);
    ТекущийИсточник        = СокрЛП(БД_ТС.ID_Source);
    ТекущийПриемник        = СокрЛП(БД_ТС.ID_Receive);
    
    Если МетаданныеДокументы.Найти(ТекущееИмяМенеджера)<>Неопределено Тогда
        НоваяСтрокаТС                = ВременнаяТС.Добавить();                
        НоваяСтрокаТС.ИмяМенеджера    = ТекущееИмяМенеджера;
        НоваяСтрокаТС.Источник        = ТекущийИсточник;
        НоваяСтрокаТС.Приемник        = ТекущийПриемник;
        
        Состояние("Просмотр таблицы соответствий: запись    "+Строка(СчетчикСоответствий)+"    из "+Строка(ВсегоСоответствий));
    КонецЕсли;
    БД_ТС.Следующая();                        
    ВКонцеТС    = БД_ТС.ВКонце();
    СчетчикСоответствий    = СчетчикСоответствий + 1;    
КонецЦикла;
1 assest
 
17.02.16
15:44
На итерации 4110 строка БД_ТС.Следующая(); перестает работать, не переходит к следующей строке xBase, цикл становется бесконечным
2 vde69
 
17.02.16
15:44
1. в какой строке ошибка
2. описание ошибки
3 Ёпрст
 
17.02.16
15:45
Продолжайте наблюдение
4 assest
 
17.02.16
15:45
Ошибки нет, просто цикл уходит в бесконечность (2)
5 Garykom
 
гуру
17.02.16
15:46
(4) а если использвать БД.КоличествоЗаписей() и БД.Перейти(НомерЗаписи) ?
6 vde69
 
17.02.16
15:47
ВКонцеТС        = БД_ТС.ВКонце();
Пока НЕ БД_ТС.EOF() Цикл
    ТекущееИмяМенеджера    = СокрЛП(БД_ТС.Manager);
    ТекущийИсточник        = СокрЛП(БД_ТС.ID_Source);
    ТекущийПриемник        = СокрЛП(БД_ТС.ID_Receive);
    
    Если МетаданныеДокументы.Найти(ТекущееИмяМенеджера)<>Неопределено Тогда
        НоваяСтрокаТС                = ВременнаяТС.Добавить();                
        НоваяСтрокаТС.ИмяМенеджера    = ТекущееИмяМенеджера;
        НоваяСтрокаТС.Источник        = ТекущийИсточник;
        НоваяСтрокаТС.Приемник        = ТекущийПриемник;
        
        Состояние("Просмотр таблицы соответствий: запись    "+Строка(СчетчикСоответствий)+"    из "+Строка(ВсегоСоответствий));
    КонецЕсли;
    СчетчикСоответствий    = СчетчикСоответствий + 1;    
    БД_ТС.Следующая();                        
КонецЦикла;
7 assest
 
17.02.16
15:47
Я открыл файл Excel'ем с таблицей вроде все в порядке, строка 4110 ничем не отличается, если пройти отладкой до этой строки данные меняются, т. е. есть переход к следующей строке, а после данные не меняются
8 vde69
 
17.02.16
15:51
точнее так

Пока БД_ТС.ВКонце() = ложь Цикл
9 assest
 
17.02.16
15:53
(8) (6) Та же ситуация
10 assest
 
17.02.16
15:55
Пробовал восстановить файл несколькими программками, все сказали что проблем нет. У Xbase есть метод переиндексировать. он выдает ошибку создания файла, директория без символов, руских букв и пробелов и доступна для записи из 1С
11 vde69
 
17.02.16
15:59
тогда что-то в базе не то...

для начала попробуй пройтись по файлу CDBF

потом можно попробовать пропатчить реестр

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Xbase]
"DataCodePage"="ANSI"
"BDE"=dword:00000002
12 assest
 
17.02.16
16:01
Дело точно в файле соответствия или в cdx, так как у меня есть старая копия этих файлов и с ними загрузка проходит
13 assest
 
17.02.16
16:02
(11) Что за патч реестра?
14 vde69
 
17.02.16
16:05
(13) это патч драйвера,

выравнивание границы записи на 2 байта и присвоение кодировки по дефолту...

патч позволяет корректно работать со старыми форматами дбф созданных драйверами фокса и 1с
15 assest
 
17.02.16
16:07
(14) Прости за наглость, можешь перевести (11) в текст батника?
16 Mikeware
 
17.02.16
16:11
(15) сохрани в файле с расширением reg, и пкм...
17 assest
 
17.02.16
16:12
(5) Идея БД.Перейти(НомерЗаписи) на строке 4110 сработала, но что это было?
18 assest
 
17.02.16
16:12
Сейчас попробую реестр
19 assest
 
17.02.16
16:14
(16) (14) Могут быть проблемы при добавлении этих записей?
20 vde69
 
17.02.16
16:20
(19) на всякий случай сохрани старое из реестра...
на 10 винде не юзал...

и еще, изменения вступают в силу после перезагрузки драйвера (гарантировано при перезргрузки компа)
21 Garykom
 
гуру
17.02.16
16:23
(17) суть вместо цикла с проверкой "на конец файла/последнюю запись" проще использовать позиционирование по номеру записи
это надежнее и проще
22 assest
 
17.02.16
16:27
Пока Дальше <>Ложь Цикл
            
Если СчетчикСоответствий    < ВсегоСоответствий Тогда
СчетчикСоответствий    = СчетчикСоответствий + 1;
                БД_ТС.Перейти(СчетчикСоответствий)
Иначе    
    Дальше=Ложь;
КонецЕсли;
23 assest
 
17.02.16
16:27
Сделал так
24 Garykom
 
гуру
17.02.16
16:32
(22) как бы не проще


КолЗап = БД.КоличествоЗаписей();
Для НомЗап = 1 По КолЗап Цикл
   БД.Перейти(НомЗап);
   ...
КонецЦикла;
25 Vlad_69
 
17.02.16
16:38
И индекс не открывать, раз он все равно битый. А сортировать уже потом ВременнуюТС.
26 assest
 
17.02.16
16:56
Вроде все сработало, но что там было не поянтно
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс