Имя: Пароль:
1C
1С v8
Как выбрать файл, а затем переместить его (Ошибка совместного доступа к файлу).
0 turrist
 
02.07.15
09:30
Задача: дать пользователю выбрать файл. Переместить выбранный файл в другой каталог.

Код кратко:

ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Если ДиалогОткрытияФайла.Выбрать() Тогда
    СтароеПолноеИмяФайла = ДиалогОткрытияФайла.ПолноеИмяФайла;
    ДиалогОткрытияФайла = Неопределено;
    ПереместитьФайл(СтароеПолноеИмяФайла, НовоеПолноеИмяФайла);
КонецЕсли;

Получаю ошибку: Ошибка совместного доступа к файлу.
Получается метод ДиалогОткрытияФайла.Выбрать() блокирует файл.
Как решить эту проблему?
1 ДенисЧ
 
02.07.15
09:33
Либо прав нет, либо кто-то ещё его держит
2 dsdred
 
02.07.15
09:35
1 Проверь уровень доступа к файлу
(Если нет прав можно получить их
FSO = Новый COMОбъект("Scripting.FileSystemObject");
FileFSO = FSO.GetFile(ИмяФайлаПриемника);                                    FileFSO.Attributes=0;)

2 КопироватьФайл(ИмяФайлаИсточника, ИмяФайлаПриемника);
3 turrist
 
02.07.15
09:50
Права есть. файл доступен для удаления до вызова
ДиалогОткрытияФайла.Выбрать()
Блокировка снимается только после закрытия сессии 1С.
4 turrist
 
02.07.15
09:52
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Если ДиалогОткрытияФайла.Выбрать() Тогда
    СтароеПолноеИмяФайла = ДиалогОткрытияФайла.ПолноеИмяФайла;
    ДиалогОткрытияФайла = Неопределено;
    FSO = Новый COMОбъект("Scripting.FileSystemObject");
    FileFSO = FSO.GetFile(ФайлПользователяПолноеИмя);
    FileFSO.Attributes=0;    
    ПереместитьФайл(СтароеПолноеИмяФайла, НовоеПолноеИмяФайла);
КонецЕсли;    

Что это дает?
Проблема осталась.
5 turrist
 
02.07.15
09:53
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Если ДиалогОткрытияФайла.Выбрать() Тогда
    СтароеПолноеИмяФайла = ДиалогОткрытияФайла.ПолноеИмяФайла;
    ДиалогОткрытияФайла = Неопределено;
    FSO = Новый COMОбъект("Scripting.FileSystemObject");
    FileFSO = FSO.GetFile(СтароеПолноеИмяФайла);
    FileFSO.Attributes=0;    
    ПереместитьФайл(СтароеПолноеИмяФайла, НовоеПолноеИмяФайла);
КонецЕсли;    


Что это дает?
Проблема осталась.
6 Господин ПЖ
 
02.07.15
09:53
>Получается метод ДиалогОткрытияФайла.Выбрать() блокирует файл.

настроить Process Monitor и посмотреть что происходит
7 AllJoke
 
02.07.15
09:56
Если ДиалогОткрытияФайла.Выбрать() Тогда
    СтароеПолноеИмяФайла = ДиалогОткрытияФайла.ПолноеИмяФайла;
    ДиалогОткрытияФайла = Неопределено;
    
КонецЕсли;

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

если так?
8 turrist
 
02.07.15
09:56
Process Monitor  это https://ru.wikipedia.org/wiki/FileMon ?
9 Господин ПЖ
 
02.07.15
09:57
(8) нету уже давно никакого filemon
10 turrist
 
02.07.15
09:59
(7) В полном коде у меня примерно так и есть.
Не то.
11 turrist
 
02.07.15
09:59
12 Лефмихалыч
 
02.07.15
10:05
(3) Выбрать() ни чего не блокирует. Просто у тебя там вокруг еще какой-то код есть, который ты не показываешь и который, собственно, виноват в просиходящем
13 stix2010
 
02.07.15
10:06
ПереместитьФайл() за конструкцию Выбрать(), не?
14 turrist
 
02.07.15
10:06
(12) ОК. Сейчас попробую выполнить краткий пример.
15 Господин ПЖ
 
02.07.15
10:06
(11) ага
16 turrist
 
02.07.15
10:07
(13) Да. Удаление файлов у меня отложено до других событий.
17 AllJoke
 
02.07.15
10:17
смотри код, у меня всё рабоатет, только я вот это
18 AllJoke
 
02.07.15
10:17
(+17) ДиалогОткрытияФайла = Неопределено; - закомментировал
19 AllJoke
 
02.07.15
10:19
(+18) да оно даже и не имеет значения.
20 turrist
 
02.07.15
10:28
(12) Выполнил тестовый пример.

        ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
        Если ДиалогОткрытияФайла.Выбрать() Тогда // при этом блокирует выбранный файл
            СтароеПолноеИмяФайла = ДиалогОткрытияФайла.ПолноеИмяФайла;
            ДиалогОткрытияФайла = Неопределено;            
        КонецЕсли;
        НовоеПолноеИмяФайла = СокрЛП(Константы.КаталогОбщихФайлов.Получить()) + "\1.jpg";
        ПереместитьФайл(СтароеПолноеИмяФайла, НовоеПолноеИмяФайла);


Действительо работает!
Буду дальше смотреть что его блокирует.
По результату отпишу.
Всем спасибо.
21 turrist
 
02.07.15
11:54
Опытным путем установил что блокировка файла происходит при выполнении
ДиалогОткрытияФайла.Выбрать()
если установлено свойство
ДиалогОткрытияФайла.ПредварительныйПросмотр = Истина;
22 turrist
 
02.07.15
11:57
Релиз 8.3 (8.3.5.1517)
Возникает вопрос как совместить предварительный просмотр при открытии файла и отсутствие блокировки для последующего перемещения выбранного файла.
23 Fedor-1971
 
02.07.15
12:36
(21) возможно, у тебя в проводнике включено окно автопросмотра. Позакрывай все окна с расположением твоего файла и смотри на его перемещение, например, через TotalCommander.
24 turrist
 
02.07.15
13:00
(23) Именно так.  Включено окно автопросмотра. Файл блокируется в момент отображения в окне предпросмотра.
25 Fedor-1971
 
02.07.15
13:07
(24) я про другое, если открыта папка (не из 1С, а просто так с винды) с твоим файлом и в ней указан автопросмотр, то он блокирует твой файл, даже если ничего не показывает.
Признак сей бороды у (17) работает, правда он не указал версию 1С (на 8.2 работает без проблем и с автопросмотром и без оного)