Ошибка доступа к файлу при попытке прочтения файла Excel на сервере

1. vitek77 14.05.21 16:13 Сейчас в теме
Уважаемые коллеги, подскажите как решить следующую проблему.
Есть Экселевский файл, мне его необходимо прочитать.
Делаю следующим образом:

&НаСервере
Функция СохранитьФайлНаСервере(Адрес, лб_ЭтоФайл1С, лстр_Результат)
	
	Если лб_ЭтоФайл1С Тогда
		лстр_ИмяФайла = ПолучитьИмяВременногоФайла("mxl");
	Иначе
		лстр_ИмяФайла = ПолучитьИмяВременногоФайла("xls");
	КонецЕсли;
	ДанныеХранилища = ПолучитьИзВременногоХранилища(Адрес);
	Попытка
		ДанныеХранилища.Записать(лстр_ИмяФайла);
	Исключение
		Возврат "Не удалось переместить файл на сервер по причине: " + ОписаниеОшибки();	
	КонецПопытки;
	Возврат лстр_ИмяФайла;
	
КонецФункции

&НаСервере
Функция ПрочитатьФайлНаСервере(лстр_ИмяФайлаНаСервере, ВхРезультат)
	
	ТабДокументЕксель = Новый ТабличныйДокумент;
	Попытка 
		ТабДокументЕксель.Прочитать(лстр_ИмяФайлаНаСервере);
	Исключение
		ВхРезультат = ("Не удалось прочитать указанный файл по причине: " + ОписаниеОшибки());
		Возврат Неопределено;
	КонецПопытки;
	Возврат ТабДокументЕксель;
	
КонецФункции

&НаКлиенте
Процедура ЗагрузитьДанныеИзЭксель(Команда)
	
	Если НЕ ЗначениеЗаполнено(ИмяФайла) Тогда
		ВывестиСообщениеПользователю("Не указн файл.");
		Возврат;
	КонецЕсли;
	лстр_ИмяФайла = СокрЛП(ИмяФайла);
	ТекФайл = Новый Файл(лстр_ИмяФайла);
	Если НЕ ТекФайл.Существует() Тогда
		ВывестиСообщениеПользователю("Указанный файл отсутствует.");
		Возврат;
	КонецЕсли;
	
	лстр_Расширение = НРег(Прав(лстр_ИмяФайла, 3));
	лб_ЭтоФайл1С = Ложь;
	Если лстр_Расширение = "mxl" Тогда
		лб_ЭтоФайл1С = Истина;
	КонецЕсли;
	
	//Передадим файл на сервер
	ДвоичныеДанные = Новый ДвоичныеДанные(лстр_ИмяФайла);
    Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные, Новый УникальныйИдентификатор);
	лстр_Результат = "";
	лстр_ИмяФайлаНаСервере = СохранитьФайлНаСервере(Адрес, лб_ЭтоФайл1С, лстр_Результат);
	Если лстр_Результат <> "" Тогда
		ВывестиСообщениеПользователю(лстр_Результат);
		Возврат;
	КонецЕсли;

	//Получим табличный документ на сервере из файла
	ТабДокументЕксель = ПрочитатьФайлНаСервере(лстр_ИмяФайлаНаСервере, лстр_Результат);
	Если лстр_Результат <> "" Тогда
		ВывестиСообщениеПользователю(лстр_Результат);
		Возврат;
	КонецЕсли;
	
	//Получим данные из табличного документа
	ПрочитатьДанныеИзТабличногоДокумента(ТабДокументЕксель);
	

Показать


В результате при попытке открыть файл mxl - все происходит нормально, а при попытке открыть файл xlsx сиситема выдает ошибку:
Ошибка при выполнении операции: ....<имя файла>...... Доступ к файлу не может быть получен.

Платформа: 1С:Предприятие 8.3 (8.3.18.1363)
По теме из базы знаний
Найденные решения
11. sinichenko_alex 179 14.05.21 17:17 Сейчас в теме
(7) Ваша проблема в Расширении файла. Вы читаете файл XLSX а присваиваете ему расширение:

ПолучитьИмяВременногоФайла("xls");

На сервере. У вас табличный документ пытается читать XLSX файл как XLS так как он зависим в данном случае от расширения.
Я прикрепил обработку которая нагляднно демонстрирует как прочитать любые EXCEL файлы (как xls так и xlsx) а также mxl одновременно
Прикрепленные файлы:
ЧтениеИзEXCEL.epf
Sana555; nickstrelets; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. sinichenko_alex 179 14.05.21 16:21 Сейчас в теме
Вместо

ТабДокументЕксель.Прочитать(лстр_ИмяФайлаНаСервере);

попробуйте
3. vitek77 14.05.21 16:24 Сейчас в теме
(2)
попробуйте

Что попробовать?
4. sinichenko_alex 179 14.05.21 16:26 Сейчас в теме
(3) Прошу прощения не дописал, отправилось недописанным. Хотел предложить прочитать добавив параметр "ТипФайлаТабличногоДокумента" но при чтении он не используется, а только при записи. Здесь больше похоже на то, что при попытке чтения файл параллельно открыт и занят чем-то. Сейчас попробую понять из кода где ошибка.
5. sinichenko_alex 179 14.05.21 16:32 Сейчас в теме
(3) Вообще попробуйте для начала избавиться от разделения операций.
Сначала вы сохраняете файл на сервере потом его читаете в табдок и возвращаете.
Из кода видно что все происходит в контексте формы. Гораздо правильнее положить на форму реквизит "ТабДокументЕксель" с типом "ТабличныйДокумент" и уже на сервере организовать одну функцию которая будет сразу получив файл с клиента сохранять его на диск на сервере и сразу же читать значения в этот табличный документ, после чего вы уже обрабатываете его на сервере или как-то еще
6. vitek77 14.05.21 16:42 Сейчас в теме
(5)Я специально разделил, от безысходности. Раньше все было в одной процедуре. Думал, что при записи двоичных данных он файл не отпускает. Поэтому чтение сделал во второй процедуре.
7. vitek77 14.05.21 16:43 Сейчас в теме
(5)Такая проблема есть Только с экселевскими файлами.
С файлом mxl проблем нет. Все читается.
8. sinichenko_alex 179 14.05.21 17:11 Сейчас в теме
(7) я понял в чем Ваша проблема. Сейчас опишу подробнее
11. sinichenko_alex 179 14.05.21 17:17 Сейчас в теме
(7) Ваша проблема в Расширении файла. Вы читаете файл XLSX а присваиваете ему расширение:

ПолучитьИмяВременногоФайла("xls");

На сервере. У вас табличный документ пытается читать XLSX файл как XLS так как он зависим в данном случае от расширения.
Я прикрепил обработку которая нагляднно демонстрирует как прочитать любые EXCEL файлы (как xls так и xlsx) а также mxl одновременно
Прикрепленные файлы:
ЧтениеИзEXCEL.epf
Sana555; nickstrelets; +2 Ответить
13. vitek77 14.05.21 17:39 Сейчас в теме
(11) Ура!!!
Все именно так и оказалось.
Исправил процедуру. Теперь анализирую расширение и при сохранении файла указываю то же расширение, которое было у начального файла.

Вот не ожидал, что 1С не разберется когда читать xls, а когда xlsx
12. sinichenko_alex 179 14.05.21 17:18 Сейчас в теме
(7) в вашем конкретном случае если поменяете строку

лстр_ИмяФайла = ПолучитьИмяВременногоФайла("xls");

на

лстр_ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");

то все заработает, но если вдруг попадется все же XLS файл то будет снова беда
9. rybusha 98 14.05.21 17:12 Сейчас в теме
На сервере должна быть установлена программа ,которая читает файлы XLS
10. sinichenko_alex 179 14.05.21 17:15 Сейчас в теме
(9) глупости, ничего там не должно быть установлено. Человек читает файл средствами 1С а не COM объектом Excel-я. Для этого никаких программ сторонних не надо.
14. vitek77 14.05.21 17:41 Сейчас в теме
Еще одно наблюдение:
Файл для загрузки формировался в 1С 77. Из 77 я его сохранил в Excel.
8 его не воспринимает, говорит: Формат файла не поддерживается.
Пришлось открыть Экселем и пересохранить в новую версию.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот