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

1. erus88 50 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. erus88 50 08.08.21 07:53 Сейчас в теме
(9)
        Если НЕ Отказ Тогда
                ЧтениеЕксель1();
        КонецЕсли; 

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

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

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

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

НаСервере
  ИВФ = ПолучитьИмяВременногоФайла( Расширение );
  ДД.Записать( ИВФ );
  ТД = Новый ТабличныйДокумент;
  ТД.Прочитать( ИВФ );
  Для Стр = 1 ПО ТД.ВыстотаТаблицы Цикл
     Для Кол = 1 По ТД.ШиринаТаблицы Цикл
        Сообщить( ТД.Олбасть(Стр, Кол ).Текст )
    КонецЦикла
  КонецЦикла;
 
Показать
3. erus88 50 06.08.21 05:44 Сейчас в теме
(2)не совсем понял про что вы?
библиотеку екселя я не знаю.
почему мне 1 вариант нравится, что через него не надо указывать первую строку и последнюю строку. назначил для каждого вида документа только столбце, а метод сам прочитает от начала до конца. Но через ВЕБ он не читает.
4. starik-2005 3033 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 235 07.08.21 19:23 Сейчас в теме +0.05 $m
Любопытно, что второй код, который отрабатывает на сервере
Excel.Application.Workbooks.Open(ИмяФайлаНаСервере);

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

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

КонецПроцедуры
Показать
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)