diadocsdk-1c-docs icon indicating copy to clipboard operation
diadocsdk-1c-docs copied to clipboard

Метод SaveContent не отпускает каталог

Open dorexpro opened this issue 1 year ago • 10 comments

После использования метод SaveContent() невозможно удалить каталог, куда сохранялся файл. Сам файл удаляется, а на каталог ругается "открыт в другой программе". Код примерно такой:

Задача = Организация.CreatePackageSendTask2();
...
ДокументУПД = Задача.AddDocument(_TypeNamedId,_DocumentFunction,_DocumentVersion);
...
ДанныеДокументаУПД = Задача.DocumentsToSend.GetItem(0);
ДанныеДокументаУПД.SaveContent(Организация.Id,СохранитьВФайл);

Диадок API версии: AddIn x86 5.45.0.912

dorexpro avatar Feb 15 '24 09:02 dorexpro

Здравствуйте!

Повторил у себя, баг не воспроизвелся. Возможно доступ к директории блокирует другой процесс. Это можно посмотреть следующим образом:

  1. Win+R
  2. В открывшемся окошке ввести: resmon
  3. В открывшемся окне монитора ресурсов перейти на вкладку ЦП, и внутри окна будет вкладка связанные дескрипторы, в ней ввести название директории. Ниже будут показаны процессы, в которых открыта эта директория

Если директория блокируется все-таки 1с-ным процессом, то нужно знать немного больше: Как этот каталог создается? Если не вызывать метод SaveContent, каталог удаляется?

NickZubashevskiy avatar Mar 25 '24 04:03 NickZubashevskiy

Каталог блокирует именно SaveContent. Если заремарить вызов этого метода, то никакой блокировки каталога нет. Каталог создается вручную в "проводнике".

dorexpro avatar Mar 25 '24 05:03 dorexpro

А какая версия Windows?

NickZubashevskiy avatar Mar 25 '24 07:03 NickZubashevskiy

Windows Server 2016 Datacenter на виртуальной машине под Hyper-V. На хосте Windows Server 2019 Datacenter. Работа идет в терминале.

dorexpro avatar Mar 25 '24 07:03 dorexpro

А в какой момент баг возник: при переходе в связи с чем-то на 5.45, или в принципе при первом использовании SaveContent? И если с переходом, то какая версия стояла до этого? Проблема в том, что не получается воспроизвести ту же ошибку, и само поведение странное, т.к. в компоненте отдельно каталог нигде не открывается Также хотелось бы точно удостовериться, что каталог блочит именно 1сный процесс, а не, к примеру, антивирус или что-то еще при записи в этот каталог

NickZubashevskiy avatar Mar 25 '24 07:03 NickZubashevskiy

Баг этот был замечен, когда понадобилось выгружать пакет из нескольких документов на отправку. Ранее использовали сохранение и проблем не возникало.

			ДанныеДокументаУПД = Задача.DocumentsToSend.GetItem(0);
			ДанныеДокументаУПД.SaveContent(Организация.Id,СохранитьВФайл);
			КаталогДляСохранения = СохранитьВФайл;
			Пока 1=1 Цикл
				Если Прав(КаталогДляСохранения,1) = "\" Тогда
					Прервать;
				КонецЕсли;
				КаталогДляСохранения = Лев(КаталогДляСохранения, СтрДлина(КаталогДляСохранения)-1);
				Если СокрЛП(КаталогДляСохранения) = "" Тогда
					Прервать;
				КонецЕсли;
			КонецЦикла;
			Если СокрЛП(КаталогДляСохранения) <> "" Тогда
				Для поз = 1 По Задача.DocumentsToSend.Count-1 Цикл
					ДанныеДокументаПакета = Задача.DocumentsToSend.GetItem(поз);
					Попытка
						ДанныеДокументаПакета.SaveContent(Организация.Id,КаталогДляСохранения + ДанныеДокументаПакета.FileName);
					Исключение
						Сообщить(ОписаниеОшибки());
						Сообщить("Ошибка сохранения документа из пакета");
					КонецПопытки;
				КонецЦикла;
			КонецЕсли;

dorexpro avatar Mar 25 '24 07:03 dorexpro

Какие-то дополнительные от меня требуются данные?

dorexpro avatar May 17 '24 09:05 dorexpro

Не удаётся ни воспроизвести, ни аналитически найти что может захватывать репозиторий

До версии 5.49.0 не было вообще никакой логики, в которой бы захватывался хэндл папки - были только хэндлы на файлы. Пока мыслей, кроме предложения обновить компоненту нет

GilimkhanovDenis avatar May 17 '24 10:05 GilimkhanovDenis

Может быть есть какой-то тестовый стенд, где можно воспроизвести и посмотреть?

GilimkhanovDenis avatar May 17 '24 10:05 GilimkhanovDenis

Может быть есть какой-то тестовый стенд, где можно воспроизвести и посмотреть?

К сожалению, нет.

Не удаётся ни воспроизвести, ни аналитически найти что может захватывать репозиторий

До версии 5.49.0 не было вообще никакой логики, в которой бы захватывался хэндл папки - были только хэндлы на файлы. Пока мыслей, кроме предложения обновить компоненту нет

Понятно, спасибо.

dorexpro avatar May 17 '24 10:05 dorexpro