diadocsdk-1c-docs
diadocsdk-1c-docs copied to clipboard
Метод SaveContent не отпускает каталог
После использования метод SaveContent() невозможно удалить каталог, куда сохранялся файл. Сам файл удаляется, а на каталог ругается "открыт в другой программе". Код примерно такой:
Задача = Организация.CreatePackageSendTask2();
...
ДокументУПД = Задача.AddDocument(_TypeNamedId,_DocumentFunction,_DocumentVersion);
...
ДанныеДокументаУПД = Задача.DocumentsToSend.GetItem(0);
ДанныеДокументаУПД.SaveContent(Организация.Id,СохранитьВФайл);
Диадок API версии: AddIn x86 5.45.0.912
Здравствуйте!
Повторил у себя, баг не воспроизвелся. Возможно доступ к директории блокирует другой процесс. Это можно посмотреть следующим образом:
- Win+R
- В открывшемся окошке ввести: resmon
- В открывшемся окне монитора ресурсов перейти на вкладку ЦП, и внутри окна будет вкладка связанные дескрипторы, в ней ввести название директории. Ниже будут показаны процессы, в которых открыта эта директория
Если директория блокируется все-таки 1с-ным процессом, то нужно знать немного больше: Как этот каталог создается? Если не вызывать метод SaveContent, каталог удаляется?
Каталог блокирует именно SaveContent. Если заремарить вызов этого метода, то никакой блокировки каталога нет. Каталог создается вручную в "проводнике".
А какая версия Windows?
Windows Server 2016 Datacenter на виртуальной машине под Hyper-V. На хосте Windows Server 2019 Datacenter. Работа идет в терминале.
А в какой момент баг возник: при переходе в связи с чем-то на 5.45, или в принципе при первом использовании SaveContent? И если с переходом, то какая версия стояла до этого? Проблема в том, что не получается воспроизвести ту же ошибку, и само поведение странное, т.к. в компоненте отдельно каталог нигде не открывается Также хотелось бы точно удостовериться, что каталог блочит именно 1сный процесс, а не, к примеру, антивирус или что-то еще при записи в этот каталог
Баг этот был замечен, когда понадобилось выгружать пакет из нескольких документов на отправку. Ранее использовали сохранение и проблем не возникало.
ДанныеДокументаУПД = Задача.DocumentsToSend.GetItem(0);
ДанныеДокументаУПД.SaveContent(Организация.Id,СохранитьВФайл);
КаталогДляСохранения = СохранитьВФайл;
Пока 1=1 Цикл
Если Прав(КаталогДляСохранения,1) = "\" Тогда
Прервать;
КонецЕсли;
КаталогДляСохранения = Лев(КаталогДляСохранения, СтрДлина(КаталогДляСохранения)-1);
Если СокрЛП(КаталогДляСохранения) = "" Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Если СокрЛП(КаталогДляСохранения) <> "" Тогда
Для поз = 1 По Задача.DocumentsToSend.Count-1 Цикл
ДанныеДокументаПакета = Задача.DocumentsToSend.GetItem(поз);
Попытка
ДанныеДокументаПакета.SaveContent(Организация.Id,КаталогДляСохранения + ДанныеДокументаПакета.FileName);
Исключение
Сообщить(ОписаниеОшибки());
Сообщить("Ошибка сохранения документа из пакета");
КонецПопытки;
КонецЦикла;
КонецЕсли;
Какие-то дополнительные от меня требуются данные?
Не удаётся ни воспроизвести, ни аналитически найти что может захватывать репозиторий
До версии 5.49.0 не было вообще никакой логики, в которой бы захватывался хэндл папки - были только хэндлы на файлы. Пока мыслей, кроме предложения обновить компоненту нет
Может быть есть какой-то тестовый стенд, где можно воспроизвести и посмотреть?
Может быть есть какой-то тестовый стенд, где можно воспроизвести и посмотреть?
К сожалению, нет.
Не удаётся ни воспроизвести, ни аналитически найти что может захватывать репозиторий
До версии 5.49.0 не было вообще никакой логики, в которой бы захватывался хэндл папки - были только хэндлы на файлы. Пока мыслей, кроме предложения обновить компоненту нет
Понятно, спасибо.