Опять вопрос по Excel. Не читается через WEB
Всем привет. Код приведённый ниже нормально отрабатывает при файловой подключение к базе, а иногда нужно через Веб, и он в пролете. Не выдает ни ошибок, не останавливается.
передача на сервер
Сам код
При этом есть другая процедура которая нормально отрабатывает, но не удобная тем что нужно начало и конец таблицы указывать
передача на сервер
&НаКлиенте
Процедура ПередатьФайлНаСервер(Отказ = Ложь)
Если НЕ ЭтоАдресВременногоХранилища(АдресФайлаНаСервере) Тогда
АдресФайлаНаСервере = "";
Попытка
ПоместитьФайл(АдресФайлаНаСервере, Объект.ПутьКФайлу, , Ложь, УникальныйИдентификатор);
Исключение
ТекстОшибки = "Не удалось прочитать файл " + Объект.ПутьКФайлу + "!";
Сообщить(ТекстОшибки);
Отказ = Истина;
КонецПопытки;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПрочитатьФайл(Команда)
Если Вариант=Ложь тогда
Если НЕ ЗначениеЗаполнено(Объект.ПутьКФайлу) Тогда
Сообщить("Необходимо выбрать файл!");
Возврат;
КонецЕсли;
Отказ = Ложь;
ПередатьФайлНаСервер(Отказ);
Если НЕ Отказ Тогда
ЧтениеЕксель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 = Неопределено;
КонецПроцедуры
ПоказатьПо теме из базы знаний
- Инфостарт. Восьмерка. Лучшее
- 1С8:борьба - личный опыт работы с платформой 1с8
- Разработка внешних компонент на ассемблере goAsm
- Зачем и как читать чужой код? Какой результат ожидаем получить? Основные подходы
- Поговорим о доверии... А надо ли давать его в кредит?! Часть 1. Этап знакомства и начала отношений
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) если код на клиенте в обоих случаях одинаковый, то проблема не в самом коде на сервере. Для него не важно, web клиент или нет.
Начните с простого. С переменных.
В 1 случае, откуда получается переменная Расширение?
Это при условии, что во 2 случае она таки формируется в коде:
Начните с простого. С переменных.
В 1 случае, откуда получается переменная Расширение?
ИмяФайлаНаСервере = ПолучитьИмяВременногоФайла(Расширение);
Это при условии, что во 2 случае она таки формируется в коде:
Если Нрег(Прав(СокрЛП(Объект.ПутьКФайлу), 1)) = "x" Тогда
Расширение = "xlsx";
Иначе
Расширение = "xls";
КонецЕсли;
ИмяФайлаНаСервере = ПолучитьИмяВременногоФайла(Расширение);
Расширение = "xlsx";
Иначе
Расширение = "xls";
КонецЕсли;
ИмяФайлаНаСервере = ПолучитьИмяВременногоФайла(Расширение);
(1)
В Веб-клиенте нельзя использовать ПоместитьФайл в неинтерактивном режиме.
Используйте НачатьПомещениеФайла или НачатьПомещениеФайлаНаСервер , в зависимости от релиза платформы.
ПоместитьФайл(АдресФайлаНаСервере, Объект.ПутьКФайлу, , Ложь, УникальныйИдентификатор);
В Веб-клиенте нельзя использовать ПоместитьФайл в неинтерактивном режиме.
Используйте НачатьПомещениеФайла или НачатьПомещениеФайлаНаСервер , в зависимости от релиза платформы.
(9)
если заменяю процедуру на второй вариант то все работает. неинтерактивный режим не причем значит.
это одна обработка, но по причине того что 1 процедура не работает в вебе приходится сейчас переключатся в зависимости от того как подключился к серверу.
Если НЕ Отказ Тогда
ЧтениеЕксель1();
КонецЕсли;
если заменяю процедуру на второй вариант то все работает. неинтерактивный режим не причем значит.
это одна обработка, но по причине того что 1 процедура не работает в вебе приходится сейчас переключатся в зависимости от того как подключился к серверу.
А зачем читать файл через ОЛЕ?
Просто читаете в табличный документ, конец таблицы = ТаблицчныйДокумент.ВысотаТаблицы/ШиринаТаблицы. Листы = области.
На клиенте
НаСервере
Просто читаете в табличный документ, конец таблицы = ТаблицчныйДокумент.ВысотаТаблицы/ШиринаТаблицы. Листы = области.
На клиенте
ДД = Новый ДвоичныеДанные(ИмяФайла);
ПрочитатьНаСерваке( ДД, Расширение );
НаСервере
ИВФ = ПолучитьИмяВременногоФайла( Расширение );
ДД.Записать( ИВФ );
ТД = Новый ТабличныйДокумент;
ТД.Прочитать( ИВФ );
Для Стр = 1 ПО ТД.ВыстотаТаблицы Цикл
Для Кол = 1 По ТД.ШиринаТаблицы Цикл
Сообщить( ТД.Олбасть(Стр, Кол ).Текст )
КонецЦикла
КонецЦикла;
Показать
(2)не совсем понял про что вы?
библиотеку екселя я не знаю.
почему мне 1 вариант нравится, что через него не надо указывать первую строку и последнюю строку. назначил для каждого вида документа только столбце, а метод сам прочитает от начала до конца. Но через ВЕБ он не читает.
библиотеку екселя я не знаю.
почему мне 1 вариант нравится, что через него не надо указывать первую строку и последнюю строку. назначил для каждого вида документа только столбце, а метод сам прочитает от начала до конца. Но через ВЕБ он не читает.
&НаКлиенте
Процедура Загрузить(Команда) /// кнопка на форме
Двоичное = Новый ДвоичныеДанные(ПутьКФайлу);
Адрес = ПоместитьВоВременноеХранилище(Двоичное, ЭтаФорма.УникальныйИдентификатор);
ЗагрузитьНаСервере(Адрес);
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьНаСервере(Адрес)
врмМяФайла = КаталогВременныхФайлов()+ "врем" + ".xls";
врм_файл = ПолучитьИзВременногоХранилища(Адрес);
врм_файл.Записать(врмМяФайла);
Результат = Новый ТаблицаЗначений;
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Прочитать(врмМяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
ПЗ = Новый ПостроительЗапроса;
ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());
ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
ПЗ.ЗаполнитьНастройки();
ПЗ.Выполнить();
Результат = ПЗ.Результат.Выгрузить();
Для каждого стрТаб Из Результат Цикл
*****************/// здесь код обработки //колонки в таблице екселя это колонки ТЗ Результат
КонецЦикла
Показать
Прикладываю пример реализации. Прочитать эксельку и положить все колонки по колонкам. На место "ВременныйФайл" устанавливаешь путь до эксельки.
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.Прочитать(ВременныйФайл);
ВсегоСтрок = ТабДокумент.ВысотаТаблицы;
ВсегоКолонок = ТабДокумент.ШиринаТаблицы;
Если ВсегоСтрок = 0 Тогда
Возврат;
КонецЕсли;
Область = ТабДокумент.Область(1,1,ВсегоСтрок,ВсегоКолонок);
ИсточникДанных = Новый ОписаниеИсточникаДанных(Область);
ПостроительОтчета = Новый ПостроительОтчета;
ПостроительОтчета.ИсточникДанных = ИсточникДанных;
ПостроительОтчета.Выполнить();
//в таблице значений - таблица загруженных данных
ТабЗначений = ПостроительОтчета.Результат.Выгрузить();
Показать
Любопытно, что второй код, который отрабатывает на сервере
Excel.Application.Workbooks.Open(ИмяФайлаНаСервере);
А тот, что отрабатывает только на файловой
Excel.WorkBooks.Open(ВыбФайл);
При этом в обоих случаях Excel = Новый COMОбъект("Excel.Application");
Excel.Application.Workbooks.Open(ИмяФайлаНаСервере);
А тот, что отрабатывает только на файловой
Excel.WorkBooks.Open(ВыбФайл);
При этом в обоих случаях Excel = Новый COMОбъект("Excel.Application");
Опять моя слепошарость подвела. XML отправляю в на сервер а ексель нет. Сто одну базу для тестов зря заводил.
&НаКлиенте
Процедура ПрочитатьФайл(Команда)
Если Вариант=Ложь тогда
ДвоичныеДанные=Новый ДвоичныеДанные(Объект.ПутьКФайлу);
Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
Если НЕ ЗначениеЗаполнено(Объект.ПутьКФайлу) Тогда
Сообщить("Необходимо выбрать файл!");
Возврат;
КонецЕсли;
Отказ = Ложь;
ПередатьФайлНаСервер(Отказ);
Если НЕ Отказ Тогда
ЧтениеЕксель1();
КонецЕсли;
КонецЕсли;
Если Вариант=Истина тогда
ДвоичныеДанные=Новый ДвоичныеДанные(Объект.ПутьКФайлу);
Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
Если НЕ ЗначениеЗаполнено(Объект.ПутьКФайлу) Тогда
Сообщить("Необходимо выбрать файл!");
Возврат;
КонецЕсли;
Отказ = Ложь;
ПередатьФайлНаСервер(Отказ);
Если НЕ Отказ Тогда
ЧтениеИксмл(Адрес);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот