Опять вопрос по Excel. Не читается через WEB

1. ShuSU 59 06.08.21 05:09 Сейчас в теме
Всем привет. Код приведённый ниже нормально отрабатывает при файловой подключение к базе, а иногда нужно через Веб, и он в пролете. Не выдает ни ошибок, не останавливается.
передача на сервер
&НаКлиенте
Процедура ПередатьФайлНаСервер(Отказ = Ложь)
	Если НЕ ЭтоАдресВременногоХранилища(АдресФайлаНаСервере) Тогда
		АдресФайлаНаСервере = "";
		Попытка
			ПоместитьФайл(АдресФайлаНаСервере, Объект.ПутьКФайлу, , Ложь, УникальныйИдентификатор);
		Исключение
			ТекстОшибки = "Не удалось прочитать файл " + Объект.ПутьКФайлу + "!";
			Сообщить(ТекстОшибки);
			Отказ = Истина;
		КонецПопытки; 
	КонецЕсли; 
КонецПроцедуры
 
&НаКлиенте
Процедура ПрочитатьФайл(Команда)
	Если Вариант=Ложь тогда
		Если НЕ ЗначениеЗаполнено(Объект.ПутьКФайлу) Тогда
			Сообщить("Необходимо выбрать файл!");
			Возврат;
		КонецЕсли; 
		Отказ = Ложь;
		ПередатьФайлНаСервер(Отказ);

		Если НЕ Отказ Тогда
				ЧтениеЕксель1();
		КонецЕсли; 
	КонецЕсли;
КонецПроцедуры


Показать

Сам код

&НаСервере
Процедура ЧтениеЕксель1()
	Сообщить("1");

	ИННПоставщика = ПолучитьИНННаСервере(Объект.Поставщик);
	Если Нрег(Прав(СокрЛП(Объект.ПутьКФайлу), 1)) = "x" Тогда
	    Расширение = "xlsx";
	Иначе
		Расширение = "xls";
	КонецЕсли; 
	
	ИмяФайлаНаСервере = ПолучитьИмяВременногоФайла(Расширение);
	ФайлНаСервере = ПолучитьИзВременногоХранилища(АдресФайлаНаСервере);
	ФайлНаСервере.Записать(ИмяФайлаНаСервере);


	xlLastCell=11;
	ВыбФайл= Новый Файл(ИмяФайлаНаСервере);

	Попытка
		Сообщить("2.1");

		Excel= Новый COMОбъект("Excel.Application");
		Сообщить("2.2");
		Excel.WorkBooks.Open(ВыбФайл);
		Сообщить("2.3");
		ExcelЛист=Excel.Sheets(1);
		Сообщить("2.4");
	Исключение
		СостояниеЗагрузки=Строка("Ошибка. Возможно неверно указан номер листа книги Excel.");
		Возврат;
	КонецПопытки;
	Сообщить("3.1");
	Объект.ДанныеЗагрузки.Очистить();
	Сообщить("3.2");
	ActiveCell=Excel.ActiveCell.SpecialCells(xlLastCell);
	Сообщить("3.3");
	RowCount=ActiveCell.Row;
	Сообщить("3.4");
	ColumnCount=ActiveCell.Column;
	Для Row=1 По RowCount Цикл
		Сообщить("4");

		Стр=СОКРЛП(ExcelЛист.Cells(Row,НачСтрока).Text);
		Если (СтрДлина(Стр)>0 И СтрДлина(Стр)<6) Тогда
			Попытка 
				НомерСтроки=Число(Стр);
			Исключение
				НомерСтроки=0;
			КонецПопытки;	
			Если НомерСтроки>0 Тогда
				Стр=СОКРЛП(ЧисткаСТРназвание(ExcelЛист.Cells(Row,кНаименование).Text));
				Если СтрДлина(Стр)>6 Тогда
					СтрокаТ=Объект.ДанныеЗагрузки.Добавить();
					СтрокаТ.Наименование=Стр;
					Если кАртикул>0 тогда
					СтрокаТ.Артикул=СОКРЛП(ExcelЛист.Cells(Row,кАртикул).Text); // Ячейка с кодом товара в текущей строке
					КонецЕсли;
............
	Excel.WorkBooks.Close();
	Excel=0;
КонецПроцедуры
Показать


При этом есть другая процедура которая нормально отрабатывает, но не удобная тем что нужно начало и конец таблицы указывать
&НаСервере
Процедура ЧтениеЕксель2()
	
	ИННПоставщика = ПолучитьИНННаСервере(Объект.Поставщик);
	Если Нрег(Прав(СокрЛП(Объект.ПутьКФайлу), 1)) = "x" Тогда
	    Расширение = "xlsx";
	Иначе
		Расширение = "xls";
	КонецЕсли; 
	
	ИмяФайлаНаСервере = ПолучитьИмяВременногоФайла(Расширение);
	ФайлНаСервере = ПолучитьИзВременногоХранилища(АдресФайлаНаСервере);
	ФайлНаСервере.Записать(ИмяФайлаНаСервере);
	Excel = Новый COMОбъект("Excel.Application");
	Excel.Application.Workbooks.Open(ИмяФайлаНаСервере);
	Excel.DisplayAlerts = 0;
	ExcelSheet = Excel.Sheets(1);
	ВсегоСтрок = ExcelSheet.Cells.SpecialCells(11).Row;
	ВсегоКолонок = ExcelSheet.Cells.SpecialCells(11).Column +  ExcelSheet.Cells.SpecialCells(11).Columns.Count - 1;
	ExcelSheetRange = ExcelSheet.Range(ExcelSheet.Cells(НачСтрока, 1), ExcelSheet.Cells(КонСтрока, ВсегоКолонок));
	Данные = ExcelSheetRange.Value.Выгрузить();
		Попытка
		Артикулы 		= ?(кАртикул <= 0, Неопределено, Данные[кАртикул - 1]);;
		Наименования 	= ?(кНаименование <= 0, Неопределено, Данные[кНаименование - 1]);
...............

	Исключение
		Сообщить(ОписаниеОшибки());
		Данные = Неопределено;
	КонецПопытки; 
	Объект.ДанныеЗагрузки.Очистить();
	Для Сч = 0 По КонСтрока - НачСтрока Цикл //- 1 Цикл
		Если Данные = Неопределено Тогда
			Прервать;
		КонецЕсли; 	
		СтрокаТЧ = Новый Структура("Артикул, Наименование, ШтрихКод1, ЕдиницаИзФайла, СтавкаНДСИзФайла, Количество, Цена, Сумма"); 
		СтрокаТЧ.Артикул 				= ?(Артикулы = Неопределено, "", СокрЛП(Артикулы[Сч]));
		СтрокаТЧ.Наименование 			= ?(Наименования = Неопределено, "", СокрЛП(Наименования[Сч]));
.............
		СтрокаЗагрузки = Объект.ДанныеЗагрузки.Добавить();
		ЗаполнитьЗначенияСвойств(СтрокаЗагрузки, СтрокаТЧ);
	КонецЦикла; 
	Данные = Неопределено;
	ExcelSheetRange = Неопределено;
	ВсегоСтрок = Неопределено;
	ExcelSheet = Неопределено;
	Excel.Application.Workbooks(1).Close();
	Excel.Quit();
	Excel = Неопределено;
КонецПроцедуры
Показать
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
8. spacecraft 07.08.21 20:05 Сейчас в теме
(1) если код на клиенте в обоих случаях одинаковый, то проблема не в самом коде на сервере. Для него не важно, web клиент или нет.
Начните с простого. С переменных.
В 1 случае, откуда получается переменная Расширение?
ИмяФайлаНаСервере = ПолучитьИмяВременногоФайла(Расширение);

Это при условии, что во 2 случае она таки формируется в коде:
Если Нрег(Прав(СокрЛП(Объект.ПутьКФайлу), 1)) = "x" Тогда
Расширение = "xlsx";
Иначе
Расширение = "xls";
КонецЕсли;

ИмяФайлаНаСервере = ПолучитьИмяВременногоФайла(Расширение);
9. spacecraft 07.08.21 20:18 Сейчас в теме +0.05 $m
(1)
ПоместитьФайл(АдресФайлаНаСервере, Объект.ПутьКФайлу, , Ложь, УникальныйИдентификатор);

В Веб-клиенте нельзя использовать ПоместитьФайл в неинтерактивном режиме.
Используйте НачатьПомещениеФайла или НачатьПомещениеФайлаНаСервер , в зависимости от релиза платформы.
11. ShuSU 59 08.08.21 07:53 Сейчас в теме
(9)
        Если НЕ Отказ Тогда
                ЧтениеЕксель1();
        КонецЕсли; 

если заменяю процедуру на второй вариант то все работает. неинтерактивный режим не причем значит.

это одна обработка, но по причине того что 1 процедура не работает в вебе приходится сейчас переключатся в зависимости от того как подключился к серверу.
2. starik-2005 3051 06.08.21 05:35 Сейчас в теме +0.05 $m
А зачем читать файл через ОЛЕ?

Просто читаете в табличный документ, конец таблицы = ТаблицчныйДокумент.ВысотаТаблицы/ШиринаТаблицы. Листы = области.

На клиенте
  ДД = Новый ДвоичныеДанные(ИмяФайла);
  ПрочитатьНаСерваке( ДД, Расширение );

НаСервере
  ИВФ = ПолучитьИмяВременногоФайла( Расширение );
  ДД.Записать( ИВФ );
  ТД = Новый ТабличныйДокумент;
  ТД.Прочитать( ИВФ );
  Для Стр = 1 ПО ТД.ВыстотаТаблицы Цикл
     Для Кол = 1 По ТД.ШиринаТаблицы Цикл
        Сообщить( ТД.Олбасть(Стр, Кол ).Текст )
    КонецЦикла
  КонецЦикла;
 
Показать
3. ShuSU 59 06.08.21 05:44 Сейчас в теме
(2)не совсем понял про что вы?
библиотеку екселя я не знаю.
почему мне 1 вариант нравится, что через него не надо указывать первую строку и последнюю строку. назначил для каждого вида документа только столбце, а метод сам прочитает от начала до конца. Но через ВЕБ он не читает.
4. starik-2005 3051 06.08.21 05:46 Сейчас в теме
(3) дополнил свое сообщение примером чтения экселя без экселя.
5. Aitbay 06.08.21 06:39 Сейчас в теме
&НаКлиенте
Процедура Загрузить(Команда) /// кнопка на форме
	
	Двоичное = Новый ДвоичныеДанные(ПутьКФайлу);
	Адрес = ПоместитьВоВременноеХранилище(Двоичное, ЭтаФорма.УникальныйИдентификатор);
	
	ЗагрузитьНаСервере(Адрес);
	
КонецПроцедуры

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

	ТабличныйДокумент.Прочитать(врмМяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
	ПЗ = Новый ПостроительЗапроса;

	ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());

	ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;

	ПЗ.ЗаполнитьНастройки();

	ПЗ.Выполнить();

	Результат = ПЗ.Результат.Выгрузить();
	
	Для каждого стрТаб Из Результат Цикл
        *****************/// здесь код обработки //колонки в таблице екселя это колонки ТЗ Результат
        КонецЦикла
Показать
6. Roflik 06.08.21 12:55 Сейчас в теме
Прикладываю пример реализации. Прочитать эксельку и положить все колонки по колонкам. На место "ВременныйФайл" устанавливаешь путь до эксельки.
  
        ТабДокумент = Новый ТабличныйДокумент;
	ТабДокумент.Прочитать(ВременныйФайл);
	
	
	ВсегоСтрок = ТабДокумент.ВысотаТаблицы;
	ВсегоКолонок = ТабДокумент.ШиринаТаблицы;
	
	Если ВсегоСтрок = 0 Тогда
		Возврат;
	КонецЕсли;
	
	Область = ТабДокумент.Область(1,1,ВсегоСтрок,ВсегоКолонок);
	
	ИсточникДанных = Новый ОписаниеИсточникаДанных(Область);
	
	ПостроительОтчета = Новый ПостроительОтчета; 
	ПостроительОтчета.ИсточникДанных = ИсточникДанных;
	
	
	ПостроительОтчета.Выполнить();
	
	//в таблице значений - таблица загруженных данных
	ТабЗначений = ПостроительОтчета.Результат.Выгрузить();

Показать
7. uno-c 237 07.08.21 19:23 Сейчас в теме +0.05 $m
Любопытно, что второй код, который отрабатывает на сервере
Excel.Application.Workbooks.Open(ИмяФайлаНаСервере);

А тот, что отрабатывает только на файловой
Excel.WorkBooks.Open(ВыбФайл);

При этом в обоих случаях Excel = Новый COMОбъект("Excel.Application");
10. ShuSU 59 08.08.21 07:03 Сейчас в теме
(7)ВыбФайл= Новый Файл(ИмяФайлаНаСервере);
12. ShuSU 59 08.08.21 08:37 Сейчас в теме +0.15 $m
Опять моя слепошарость подвела. XML отправляю в на сервер а ексель нет. Сто одну базу для тестов зря заводил.
&НаКлиенте
Процедура ПрочитатьФайл(Команда)
	Если Вариант=Ложь тогда
		ДвоичныеДанные=Новый ДвоичныеДанные(Объект.ПутьКФайлу);
		Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
		Если НЕ ЗначениеЗаполнено(Объект.ПутьКФайлу) Тогда
			Сообщить("Необходимо выбрать файл!");
			Возврат;
		КонецЕсли; 
		Отказ = Ложь;
		ПередатьФайлНаСервер(Отказ);
		Если НЕ Отказ Тогда
			ЧтениеЕксель1();
		КонецЕсли;		
	КонецЕсли;
	Если Вариант=Истина тогда
		ДвоичныеДанные=Новый ДвоичныеДанные(Объект.ПутьКФайлу);
		Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
		Если НЕ ЗначениеЗаполнено(Объект.ПутьКФайлу) Тогда
			Сообщить("Необходимо выбрать файл!");
			Возврат;
		КонецЕсли; 
		Отказ = Ложь;
		ПередатьФайлНаСервер(Отказ);
		Если НЕ Отказ Тогда
			ЧтениеИксмл(Адрес);
		КонецЕсли; 
	КонецЕсли;

КонецПроцедуры
Показать
Оставьте свое сообщение

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