Имя: Пароль:
1C
1C 7.7
v7: Не пойму почему код не работает
,
0 vova1122
 
24.06.13
22:58
И так, мне нужно переименовать файлы в определенном каталоге по определенной схеме.
Названия файлов примерно такое:
01_456545456.Название1.txt
02_564654_53656Название2.txt
03_546(646454)._456_Название3.txt
(два первых символа в названии это порядковый номер. Потом идет набор цыфр и символов которые нужно удалить из названия до первой встречающейся буквы)

Функцию обнаружения и удаления цыфр в середине текста я вынес отдельно за основную процедуру

Функция ВидалЧисла(имя)
Если НомПерш1>1 тогда      // из какой позиции удалять
Префикс=Лев(имя,НомПерш1-1);
иначе
Префикс="";
КонецЕсли;
имя=Сред(имя,НомПерш1);
готово=0;
Пока готово=0 цикл
   Если Найти("0123456789-_. ()",Лев(имя,1))>0 тогда
       имя=Сред(имя,2);
   Иначе
       готово=1;
   КонецЕсли;    
КонецЦикла;    
ИмяФнов=Префикс+имя;
Возврат ИмяФнов;
КонецФункции
// дальше основная процедура
Процедура Видалитичисла()  
   Каталог="";
   Если ФС.ВыбратьКаталог(Каталог, "Вибрати папку в якій переіменовувати файли")=1 Тогда
   КонецЕсли;    
       Каталог=Каталог+"\";    

       имяф=СокрЛП(фс.НайтиПервыйФайл(Каталог+"*.*"));  

пока 1=1 цикл    
          имяф=СокрЛП(фс.НайтиСледующийФайл());
   
       Если имяф="" Тогда
           Прервать;
       КонецЕсли;        
       
       Если (имяф=".") или (имяф="..") Тогда
           Продолжить;
       КонецЕсли;      
       Если ЭтоКаталог(имяф)=1 тогда    
           Продолжить;
       КонецЕсли;            
       
    ИмяФнов=ВидалЧисла(имяФ);  // вызываем функцию

   Фс.ПереименоватьФайл(имяф,ИмяФнов,1);

   Сообщить(ИмяФнов);    
       
КонецЦикла;    
КонецПроцедуры
 
Но так не работает. Вернее Сообщить(ИмяФнов) сообщает верное (переименованное название файла. а сам файл остается таким как был.

Когда я текст этой функции вставил в основное тело процедуры все отрабатывает как надо:

Процедура Видалитичисла()  
   Каталог="";
   Если ФС.ВыбратьКаталог(Каталог, "Вибрати папку в якій переіменовувати файли")=1 Тогда
   КонецЕсли;    
       Каталог=Каталог+"\";    
       имяф=СокрЛП(фс.НайтиПервыйФайл(Каталог+"*.*"));  

Пока 1=1 цикл    
          имяф=СокрЛП(фс.НайтиСледующийФайл());
       Если имяф="" Тогда
           Прервать;
       КонецЕсли;        
       
       Если (имяф=".") или (имяф="..") Тогда
           Продолжить;
       КонецЕсли;      
       Если ЭтоКаталог(имяф)=1 тогда    
           Продолжить;
       КонецЕсли;            
       
       
 имя=имяф;             //вставляю текст той же функции в тело процедуры
 Если НомПерш1>1 тогда
 Префикс=Лев(имя,НомПерш1-1);
 иначе
 Префикс="";
 КонецЕсли;
 имя=Сред(имя,НомПерш1);
 готово=0;
 Пока готово=0 цикл
   Если Найти("0123456789-_. ()",Лев(имя,1))>0 тогда
       имя=Сред(имя,2);
   Иначе
       готово=1;
   КонецЕсли;    
 КонецЦикла;    
 ИмяФнов=Префикс+имя;   // конец вставленой функции
 
   Фс.ПереименоватьФайл(имяф,ИмяФнов,1);
   
 Сообщить(ИмяФнов);    
       
КонецЦикла;    
       
КонецПроцедуры


Может кто-то объяснить такое поведение переименования?
1 zak555
 
24.06.13
23:04
что есть Видал/Видали ?
2 vova1122
 
24.06.13
23:07
(1) Если перевести с украинского на русский то это означает "Удалить" - тоисть удалить из названия файла лишние символы
3 zak555
 
24.06.13
23:08
(2) значит проблема в украинской региональной настройке
4 vova1122
 
24.06.13
23:11
(3) какая может быть проблема в региональных настройках? Тот же код (дословно во втором примере) вставлен в основную процедуру. И он работает (файлы переименовываются...
5 zak555
 
24.06.13
23:20
1с не понимает мову
6 vova1122
 
24.06.13
23:21
(5) стёб неуместен...
7 vova1122
 
24.06.13
23:23
+(5) проверьте этот код у себя (если желаете, названия перепишите на русские)
8 Nandarou
 
24.06.13
23:31
Отладчик что говорит?
9 vova1122
 
24.06.13
23:33
(8) что он может сказать? в коде же прописал:
Сообщить(ИмяФнов);
Имя верное. а в папке не переименовывается...
10 DES
 
24.06.13
23:49
формат 8.3 мешает ?
11 vova1122
 
24.06.13
23:52
(10) ничего не понял? Во втором примере те-же файлы переименовываются, а в первом нет.
12 Ёпрст
 
25.06.13
00:00
(0) всё не смотрел, в Фс.ПереименоватьФайл
указывай полные имена файлов вместе каталогами,типа

Фс.ПереименоватьФайл("D:\1.txt","c:\123.TXT")
13 Ёпрст
 
25.06.13
00:01
или задавай явно текущий каталог.
14 Ёпрст
 
25.06.13
00:02
до того как
15 vova1122
 
25.06.13
00:03
(12) пробовал и так. Не помогло.
Но ведь во втором варианте все работает и без полного пути...
16 Ёпрст
 
25.06.13
00:07
(15)
1.не верю
2.установлен тек каталог
17 Ёпрст
 
25.06.13
00:08
да, если каталога не существует (в который переименовываем), то тоже ничего работать не будет.
18 vova1122
 
25.06.13
00:10
(17)каталог ведь устанавливается функцией ФС.НайтиПервыйФайл.   после этого он никаким образом не меняется
(16) завтра на работе перепроверю еще 101-й раз. вдруг сработает....
19 vova1122
 
25.06.13
00:15
(17) в догонку. я привел два почти идентичных варианта кода. Первый не работает. а второй работает. немогу понять почему.....
20 vova1122
 
25.06.13
11:34
(16) (17) Разобрался почему не работает. Оказывается в моей функции которую я вызываю командой:

ИмяФнов=ВидалЧисла(имяФ);

Название самой функции я прописал как:

Функция ВидалЧисла(имя)
и делал манипуляции в функции с переменной "имя".
Поэтому в основной процедуре изменилось название файла который я хочу переименовать.

Нужно было в названии функции  добавить "знач"

Функция ВидалЧисла(знач имя)
21 vova1122
 
25.06.13
11:47
+(12) и всё работает без указания полного пути....