Имя: Пароль:
1C
 
Ошибка открытия ДБФ
0 andiko
 
25.12.06
17:38
При попытке открыть ДБФ-файл вываливается с ошибкой: "Перед выполнением операции нужно закрыть базу!". Файлы не открыты

ДБФ = СоздатьОбъект("XBASE");
ПутьФ = "D:\obmen\";
ФС.УстТекКаталог(ПутьФ);
Файл = ФС.НайтиПервыйФайл("*.*");
Файл = ФС.НайтиСледующийФайл();
Пока ПустоеЗначение(Файл) = 0 Цикл // цикл по файлам в каталоге
 Файл = ФС.НайтиСледующийФайл();
 ИмяФайла = ПутьФ+Файл;
 ДБФ.ОткрытьФайл(ИмяФайла);
 Если ФС.СуществуетФайл(ИмяФайла) = 1 Тогда
  Если ДБФ.Открыта()=0 Тогда //проверяем, удалось ли открыть файл
   Сообщить("Не удалось открыть файл!");
  КонецЕсли;
1 ТелепатБот
 
гуру
25.12.06
17:38
2 andiko
 
25.12.06
17:39
(1) типа умный...
3 MAG
 
25.12.06
17:40
Путь = "D:\1СBases\NOM.dbf";
   Если ФС.СуществуетФайл(Путь) = 0 Тогда
       Сообщить("Файл базы не найден!","!");
       Возврат;
   КонецЕсли;    
   БД = СоздатьОбъект("XBase");
   Попытка
       БД.ОткрытьФайл(Путь);
   Исключение              
       БД.ЗакрытьФайл();
       БД.ОткрытьФайл(Путь);
   КонецПопытки;
   Если БД.Открыта() = 0 Тогда
       Сообщить("Ошибка открытия базы !","!");
       Возврат;
   КонецЕсли;
4 andiko
 
25.12.06
17:43
(3) прикольно...
а из-за чего ругаться может?
5 andiko
 
25.12.06
17:54
всеравно не работает

   ДБФ = СоздатьОбъект("XBASE");
   ПутьФ = "D:\БазыРеализации\Авиапро\obmen\";
   ФС.УстТекКаталог(ПутьФ);
   Файл = ФС.НайтиПервыйФайл("*.*");
   Файл = ФС.НайтиСледующийФайл();
   Пока ПустоеЗначение(Файл) = 0 Цикл // цикл по файлам в каталоге
       Файл = ФС.НайтиСледующийФайл();
       ИмяФайла = ПутьФ+Файл;
       
       Попытка
           ДБФ.ОткрытьФайл(ИмяФайла);
       Исключение
           ДБФ.ЗакрытьФайл();
           ДБФ.ОткрытьФайл(ИмяФайла);
       КонецПопытки;
       
       Если ФС.СуществуетФайл(ИмяФайла) = 1 Тогда
           Если ДБФ.Открыта()=0 Тогда //проверяем, удалось ли открыть файл
               Сообщить("Не удалось открыть файл!");
           КонецЕсли;
6 Каанкереде
 
25.12.06
17:55
(4) ты этот D:\1СBases\NOM.dbf случаем никаким dbfViewer' ом не открыл параллельно?
7 andiko
 
25.12.06
17:58
(6) так в том-то и дело: перезагружался, удалял - ничего не помогает :(
8 Каанкереде
 
25.12.06
18:03
(7) а пробовал этот файл еще чем нибудь открыть? тем же dbfViewer или dbfNavigator
9 andiko
 
25.12.06
18:04
(8) нормально открывается
10 Прохожий
 
25.12.06
18:13
(9) Есть программа, unlocker, вроде...
11 andiko
 
25.12.06
18:14
(10) файл ничем/никем не заблокирован: нормально удаляется
12 Прохожий
 
25.12.06
18:14
А зачем ты его удаляешь? Не удаляй...
13 Прохожий
 
25.12.06
18:15
У тебя именно этот файл не открывается или вообще ни один?
14 andiko
 
25.12.06
18:20
(13) у меня их в папке два, не один не открывается. перезагружался - не помогло. из внешней обработки, такой же в ноль код работает, из глобальника - нет
15 Tymoha
 
25.12.06
18:25
(14)атрибуты файла проверь
16 andiko
 
25.12.06
18:52
(15) пучком все с атрибутами...
17 andiko
 
25.12.06
19:24
неужели ни у кого такого небыло ?
18 DrShad
 
25.12.06
19:28
имена файлов давай?
19 andiko
 
25.12.06
19:32
(18) не понял?
20 DrShad
 
25.12.06
19:35
у меня так было когда файлы имели кирилические символы или были больше 8 символов в названии
21 andiko
 
25.12.06
19:36
(20) у меня файлы называются 1.dbf, 2.dbf, 3.dbf и т.д.
причем обработкой открываются, а из глобальника нет
22 DrShad
 
25.12.06
19:38
какой обработкой?
23 andiko
 
25.12.06
19:39
(22)точной копией процедуры из глобальника. написал чтобы удобнее было отладить
24 DrShad
 
25.12.06
19:42
та что в (0)
25 DrShad
 
25.12.06
19:42
а ты ее из глобальника убрал?
26 DrShad
 
25.12.06
19:44
+(25) т.е. они у тебя не пытаются дважды открыться? ты их после пользования закрываешь?
27 andiko
 
25.12.06
19:46
(26) написал во внешней обработке, отладил. все гуд
впихнул в глобальник - выдает ошибку. удалил файлы - пофиг. перегрузился - пофиг, атрибуты файлов - гуд
28 DrShad
 
25.12.06
19:48
а отладчиком что показывает?
29 andiko
 
25.12.06
19:50
(28) а отладчик куда пихать?
30 mun2
 
25.12.06
19:50
У тебя переменные в глобальнике не пересекаются?
31 DrShad
 
25.12.06
19:55
а что ты вообще в них пишешь?
32 andiko
 
26.12.06
10:37
(30) переменные не пересекаются
(31) в файле содержится структура справочника другой базы
33 A_M-ko
 
26.12.06
11:37
Был у меня такой прикол. Для открытия файла запустил цикл, так вот файл открылся с четвертой попытки. Платформа 1С рулит.
34 andiko
 
26.12.06
11:40
(33) а лечить как?
35 A_M-ko
 
26.12.06
11:42
Платформу лечить нужно. Не ожидает она момента открытия, спешит куда-то.
36 andiko
 
26.12.06
11:43
(35) а конкретные предложения? ведь из внешней обработки все работает
37 A_M-ko
 
26.12.06
11:43
Ха. А уменя как раз во внешней обработке не работало.
38 andiko
 
26.12.06
11:44
(37) а в глобальном все пучком?
39 A_M-ko
 
26.12.06
11:45
Не заморачивайся. Поставь цикл и все срастется. Секунда туда секунда сюда. Все остальное работает дольше.
40 andiko
 
26.12.06
11:47
цикл с 1 по 100 000 хватит?
41 A_M-ko
 
26.12.06
11:49
Да я же говорю с четвертой попытки. Цикл
ДБ.ОткрытьФайл(ИмяФайла);
Пока ДБ.Открыта()=0 Цикл
   ДБ.ОткрытьФайл(ИмяФайла);
КонецЦикла;
42 andiko
 
26.12.06
11:51
(41) т.е. этот кусок в цикл на 4-5 раз?
43 Один С
 
26.12.06
11:56
(40) Поставь перед словом "Попытка"  строчку Сообщить(Файл);
44 A_M-ko
 
26.12.06
11:57
Да нет, это все. Просто я там счетчик при отладке вставлял и его потом смотрел при выходе из цикла.
45 andiko
 
26.12.06
12:00
(43) поставил. сообщает имя файла который там есть
(44) понял, спасибо. буду пробывать (бредятина какая-то)
46 andiko
 
26.12.06
12:15
прокрутилось чуть больше 10 раз, толку 0
47 andiko
 
26.12.06
12:42
уже минут 40 крутится и не читает
48 A_M-ko
 
26.12.06
12:44
Ну извини. Я описал как было у меня.
49 A_M-ko
 
26.12.06
12:48
У меня правда проблема была в том, что файл создавался в обработке. Перед открытием стоял цикл задержки по условию наличия файла в каталоге. Так вот слету файл не открывался, а с четвертой попытки все получалось. Может у тебя он действительно чем-то он блокируется?
50 andiko
 
26.12.06
12:49
(49)  я так понимаю, что если файл блокируется, то с ним ничего нельзя сделать: не удалить, не переместить, но! у меня и удаляется и перемещается
51 A_M-ko
 
26.12.06
12:52
А нет ли ограничения на количество открытых файлов xBase? Я не знаю, просто предположение?
52 andiko
 
26.12.06
12:58
(51) это как?
53 A_M-ko
 
26.12.06
13:00
И еще. Когда я в глобальном модуле при начале работы запустил небольшую обработку справочника на 23000 элементов, то работа системы продолжилась, а справочник продолжал обрабатываться, и меню осталось недоступным. Как у тебя вызывается эта процедура?
54 A_M-ko
 
26.12.06
13:03
(52) Сколько одновременно можно создать объектов xBase?
55 andiko
 
26.12.06
13:12
(53) вызывается по таймеру
(54) как узнать?
56 Один С
 
26.12.06
13:18
Че то я не понял. Зачем ты файлы открываешь, закрываешь?
А строчка "Если ФС.СуществуетФайл(ИмяФайла) = 1 Тогда"
вообще непонятно для чего.
57 andiko
 
26.12.06
13:21
(56) цикл по файлам в каталоге
58 Иде я
 
26.12.06
13:30
Нука отпость сюда путь к каталогу...
и код обработки
59 andiko
 
26.12.06
13:33
ДБФ = СоздатьОбъект("XBASE");
   ПутьФ = "D:\obmen\";
   ФС.УстТекКаталог(ПутьФ);
   Файл = ФС.НайтиПервыйФайл("*.*");
   Файл = ФС.НайтиСледующийФайл();
   Пока ПустоеЗначение(Файл) = 0 Цикл // цикл по файлам в каталоге
       Файл = ФС.НайтиСледующийФайл();
       ИмяФайла = ПутьФ+Файл;
       
       ДБФ.ОткрытьФайл(ИмяФайла);

       Если ФС.СуществуетФайл(ИмяФайла) = 1 Тогда
           Если ДБФ.Открыта()=0 Тогда //проверяем, удалось ли открыть файл
               Сообщить("Не удалось открыть файл!");
           КонецЕсли;


и так далее
60 A_M-ko
 
26.12.06
13:34
Може все дело в вызове по таймеру? Может что-то с синхронизацией событий открытия-закрытия? Эх отладчик тупой.
61 Иде я
 
26.12.06
13:35
"*.*" Че эт за лажа ?
Ты все подряд пытаешься открывать ? может отфильтруешь по "*.dbf" ?
62 Иде я
 
26.12.06
13:37
И блин, нафига ты вначале пытаешься открыть файл, а потом только проверяешь существование его ?
63 Иде я
 
26.12.06
13:37
Файл = ФС.НайтиСледующийФайл();
сообщить(Файл);
       ИмяФайла = ПутьФ+Файл;
Сообщить(ИмяФайла);
64 andiko
 
26.12.06
14:10
(61) у меня там только дбф
(62) исправил - пофиг
65 andiko
 
26.12.06
15:14
спецы иссякли...
66 Один С
 
26.12.06
15:26
Выложи процедуру целиком.
67 vpetrov
 
26.12.06
15:32
Возможно, что у тебя неправильно отрабатывает путь... Попробуй полностью прописать путь, с учетом сетевого адреса, либо попробуй перекинуть этот каталог на диск С, и соответственно в коде поменять путь с Д на С.
68 andiko
 
26.12.06
15:33
ДБФ = СоздатьОбъект("XBASE");
   ПутьФ = "D:\БазыРеализации\Авиапро\obmen\";
   ФС.УстТекКаталог(ПутьФ);
   Файл = ФС.НайтиПервыйФайл("*.*");
   Файл = ФС.НайтиСледующийФайл();
   Пока ПустоеЗначение(Файл) = 0 Цикл // цикл по файлам в каталоге
       Файл = ФС.НайтиСледующийФайл();
       ИмяФайла = ПутьФ+Файл;
       
       ДБФ.ОткрытьФайл(ИмяФайла);
       
       Если ФС.СуществуетФайл(ИмяФайла) = 1 Тогда
           Если ДБФ.Открыта()=0 Тогда //проверяем, удалось ли открыть файл
               Сообщить("Не удалось открыть файл!");
           КонецЕсли;
           
           Состояние("Загружаем данные...");
           
           тз = СоздатьОбъект("ТаблицаЗначений");
           тз1 = СоздатьОбъект("ТаблицаЗначений");
           ДБФ.Первая(); //позиционируемся на первой записи
           Пока ДБФ.ВКонце()=0 Цикл //пока не дошли до конца, крутим цикл
               тз.НоваяСтрока();
               тз1.НоваяСтрока();
               // шапка документа
               тз.NOMERDOC = ДБФ.NOMERDOC;   // номер документа
...
               тз.KOLVO    = ДБФ.KOLVO;       // количество
               ДБФ.Следующая();
           КонецЦикла;
           ДБФ.ЗакрытьФайл();
           ФС.УдалитьФайл(ИмяФайла);
       КонецЕсли; // проверка на наличе файла    
   КонецЦикла; // конец цикла по файлам в папке
69 andiko
 
26.12.06
15:33
(67) с путем все ок
70 Казанская Сирота
 
26.12.06
15:37
Попробуй из пути убрать Кириллицу. C:\DBFfiles\obmen
71 Казанская Сирота
 
26.12.06
15:39
Кста у тя поиск пропускает первые два файла.

Файл = ФС.НайтиПервыйФайл("*.*");  //ты уже на файл спозиционировался
Файл = ФС.НайтиСледующийФайл(); // гоп на второй
Пока ПустоеЗначение(Файл) = 0 Цикл
Файл = ФС.НайтиСледующийФайл(); // гоп на третий ;)
ИмяФайла = ПутьФ+Файл;
72 Казанская Сирота
 
26.12.06
15:41
Делай

Пока 1=1 Цикл
...

Файл = ФС.НайтиСледующийФайл(); // гоп на третий ;)
Если ПустоеЗначение(Файл)=1 Тогда
 Прервать;
КонецЕсли;
КонецЦикла;
73 Казанская Сирота
 
26.12.06
15:41
// гоп на третий ;)  не отсюда
74 Shaman100M
 
26.12.06
15:42
(21) Не начинай файл с цифры. Сделай хотя бы F1.dbf F2.dbf ...
75 Shaman100M
 
26.12.06
15:47
В фоксе такие файлы не открываются
76 Один С
 
26.12.06
16:20
ДБФ = СоздатьОбъект("XBASE");
   ПутьФ = "D:\БазыРеализации\Авиапро\obmen\";
   ФС.УстТекКаталог(ПутьФ);
   Файл = ФС.НайтиПервыйФайл("*.dbf");
   Пока ПустоеЗначение(Файл) = 0 Цикл
       ИмяФайла = ПутьФ+Файл;    
       ДБФ.ОткрытьФайл(ИмяФайла);    
       Состояние("Загружаем данные...");    
           тз = СоздатьОбъект("ТаблицаЗначений");
           тз1 = СоздатьОбъект("ТаблицаЗначений");
           ДБФ.Первая(); //позиционируемся на первой записи
           Пока ДБФ.ВКонце()=0 Цикл //пока не дошли до конца, крутим цикл
               тз.НоваяСтрока();
               тз1.НоваяСтрока();
               тз.NOMERDOC = ДБФ.NOMERDOC;   // номер документа
               тз.KOLVO    = ДБФ.KOLVO;       // количество
               ДБФ.Следующая();
           КонецЦикла;
           ДБФ.ЗакрытьФайл();
           ФС.УдалитьФайл(ИмяФайла);
           Файл = ФС.НайтиСледующийФайл();
   КонецЦикла;
77 andiko
 
26.12.06
16:29
(76) в таком варианте работает, только загружает один файл, а остальные удаляет
78 A_M-ko
 
26.12.06
16:33
А может dbf-файлы не одного типа (FoxPro, dBase), например файлы типа Fox2x открываются а выше версий нет.
79 Shaman100M
 
26.12.06
16:34
(77) Не нарушай выборку удалением, сделай так:

Спс1=СоздатьОбъект("СписокЗначений");
Файл=ФС.НайтиПервыйФайл("*.*");

Пока пустоеЗначение(Файл)=0 Цикл
   Спс1.ДобавитьЗначение(Файл);
   Файл=ФС.НайтиСледующийФайл();
КонцЦИкла;

а потом обрабатывай список.
80 andiko
 
26.12.06
16:39
(78) файлы созданы в 1С
(79) а не черезчур запутанно и сложно?
81 Один С
 
26.12.06
16:41
Вот тебе окончательный вариант. Он работает.

   ДБФ = СоздатьОбъект("XBASE");
   ПутьФ = "D:\БазыРеализации\Авиапро\obmen\";
   ФС.УстТекКаталог(ПутьФ);
   Файл = ФС.НайтиПервыйФайл("*.dbf");
   Пока ПустоеЗначение(Файл) = 0 Цикл
       ИмяФайла = ПутьФ+Файл;    
       ДБФ.ОткрытьФайл(ИмяФайла);    
       Состояние("Загружаем данные...");    
           тз = СоздатьОбъект("ТаблицаЗначений");
           тз1 = СоздатьОбъект("ТаблицаЗначений");
           ДБФ.Первая(); //позиционируемся на первой записи

           Пока ДБФ.ВКонце()=0 Цикл //пока не дошли до конца, крутим цикл

               тз.НоваяСтрока();
               тз1.НоваяСтрока();
               тз.NOMERDOC = ДБФ.NOMERDOC;   // номер документа

               тз.KOLVO    = ДБФ.KOLVO;       // количество

               ДБФ.Следующая();
           КонецЦикла;
           ДБФ.ЗакрытьФайл();
           Файл = ФС.НайтиСледующийФайл();
           ФС.УдалитьФайл(ИмяФайла);          
   КонецЦикла;
82 andiko
 
26.12.06
16:59
(81) блин... не работает
83 Один С
 
26.12.06
17:06
(82) Где не работает?
84 Иде я
 
26.12.06
17:06
Первые два файла будут "." и ".."
85 andiko
 
26.12.06
17:08
(84) угу
86 andiko
 
26.12.06
17:12
(83) загружает один из двух файлов и все
87 A_M-ko
 
27.12.06
11:01
А может не удалять в цикле файлы, а удалить потом после загрузки?
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан