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

1. BuryMeInVegas 15.06.20 11:21 Сейчас в теме
И снова всем привет от неофита. Начал читать файлик Excel для дальнейшей сверки номенклатуры из этого файла с номенклатурой в базе. Читаю при помощи табдок (не люблю COMОбъект). Пытаюсь прочитать, 1ска выкидывает с ошибкой "Ошибка доступа к файлу". Я так понимаю, что серверная сторона 1ски не может прочитать мой файлик, лежащий на рабочем столе. С клиента так же этого сделать невозможно, ибо метод ТабДок.Прочитать() на клиенте недоступен. Отсюда вопрос: как прочитать файлик на клиенте, чтобы преодолеть ограничение доступа, а потом отдать его на сервак для дальнейшей обработки данных? Ниже код:

&НаСервере
Функция СверитьНаСервере()
	
	ПутьКФайлу = Объект.Папка;
	
	ТабДок = Новый ТабличныйДокумент;
	Попытка
		ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Текст);
		Возврат ТабДок;
	Исключение
		Сообщить(ОписаниеОшибки());
		Возврат Неопределено;
	КонецПопытки;
	
	ТЗ = Новый ТаблицаЗначений;
	ТЗ.Колонки.Добавить("Предопределенный", Новый ОписаниеТипов("Булево"));
	ТЗ.Колонки.Добавить("Родитель", Новый ОписаниеТипов("Строка"));
	ТЗ.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
	
	КоличествоСтрок = ТабДок.ВысотаТаблицы;
	
	Для Сч = 2 По КоличествоСтрок Цикл
		Попытка
			ТБ = ТЗ.Добавить();
			ТБ.Предопределенный = Булево(ТабДок.ПолучитьОбласть("R" + Формат(Сч, "ЧГ=0") + "С" + 1).ТекущаяОбласть.Текст);
			ТБ.Родитель 		= Строка(ТабДок.ПолучитьОбласть("R" + Формат(Сч, "ЧГ=0") + "С" + 2).ТекущаяОбласть.Текст);
			ТБ.Наименование 	= Строка(ТабДок.ПолучитьОбласть("R" + Формат(Сч, "ЧГ=0") + "С" + 3).ТекущаяОбласть.Текст);
		Исключение
			Сообщить(ОписаниеОшибки());
		КонецПопытки;
	КонецЦикла;
	
КонецФункции
Показать


Путь к файлу заполняется в другой процедуре, там проблем нет.

При попытке изменить формат файлика на .xslx, вылетает ошибка "Каталог недоступен". Даже если файлик сохранить в формате .xlsx.
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. andy_zhav 197 15.06.20 13:39 Сейчас в теме
(1) Воспроизвел код. Получилось прочитать на сервере без проблем. Есть предположение, что ошибка возникает в неправильном пути к файлу. Я указывал полный сетевой путь типа \\SRVOiAPP\srv\Andy\Список.xls

Если база клиент-серверная, то файл должен быть доступен на сервере. Для файловой базы должно работать при любом раскладе

Пы.Сы. А зачем в приведенном листинге код после попытки - исключения? Судя по коду он никогда не сработает
6. BuryMeInVegas 15.06.20 20:20 Сейчас в теме
(4) Там именно, что клиент-сервис. Но полный сетевой путь я не пробовал указывать, я, честно говоря, даже не знал, что нужно указывать его именно в этом формате. Сейчас попробую сделать так.
8. Vlan 36 17.06.20 07:52 Сейчас в теме
(6) Насколько я помню, в клиент-серверном варианте доступ к файлу должен быть у пользователя, под которым крутится сервер 1С. Попробуйте ради эксперимента расположить файл не на клиентской машине, а на самом сервере или расшаренной для общего доступа папке.
2. N0t_F0und 10 15.06.20 12:48 Сейчас в теме
Посмотрите через диспетчер, сколько экземпляров Экселя у вас уже запущено. Закройте все...не поможет, вы не создаете объект
3. BuryMeInVegas 15.06.20 12:53 Сейчас в теме
(2)Ни одного, ошибка та же.
5. andy_zhav 197 15.06.20 13:50 Сейчас в теме
можно обойтись без абсолютных путей, но для этого нужно передавать файл с клиента на сервер с использованием двоичных данных и хранилища значений
&НаКлиенте
Процедура ПрочитатьФайл()
  ДвоичныеДанные = Новый ДвоичныеДанные(ПолныйПутьКФайлуНаКлиенте);
  АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор)
  ТабличныйДокумент = СверитьНаСервере(АдресХранилища);
КонецПроцедуры

&НаСервере
Функция СверитьНаСервере(АдресХранилища)
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
    ИмяФайла = ПолучитьИмяВременногоФайла("xls");
    ДвоичныеДанные.Записать(ИмяФайла);
    Попытка
        ТабДок.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Текст);
		Возврат ТабДок;
    Исключение
        Сообщить(ОписаниеОшибки());
		Возврат Неопределено;
    КонецПопытки;
КонецФункции
Показать
Alex1c; softmaker; Alex_E; +3 Ответить
7. BuryMeInVegas 15.06.20 20:23 Сейчас в теме
(5) Мне не нужен оптимальный код, только прочитать файлик.) Дело в том, что у нас при переносе номенклатуры вытянулись позиции из совсем старой базы (есть подозрение, что из неё напрямую и тянули). Что я делаю: гружу всю номенклатуру с родителями в файлик Excel, оттуда хочу прочитать его в КА и поглядеть, какие соответствия по номенклатуре установятся в результате сравнения. Не вошедшую номенклатуру, не участвующую в проводках пометить на удаление и снести. Однако, как видите, словил ступор на этапе чтения файлика.
9. Alex_E 2360 17.06.20 08:01 Сейчас в теме
(7)
гружу всю номенклатуру с родителями в файлик Excel
- есть понимание, в Excel грузятся строки, а не элементы справочника? Если есть дубли с одинаковыми наименованиями (и/или кодами) то идентифицировать элемент справочника в базе не получится... Совет - в Excel выгружайте помимо наименований итд ГУИДы номенклатуры, и по ним следует искать элементы в базе...

ЗЫ Для открытия в клиент - сервере в (5) правильно советуют...
Оставьте свое сообщение

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