Добрый день, написал обработку по загрузке из экселя в табличную часть, но вылетает ошибка COM объекта

1. user973528 16.02.21 17:57 Сейчас в теме
Добрый день, написал обработку по загрузке из экселя в табличную часть, но при попытке подключиться к экселю вылетает ошибка
Ошибка при вызове конструктора (COMОбъект): -2147221005(0x800401F3): Недопустимая строка с указанием класса
Код на клиенте, если делаю на сервере то ошибка ком объект не определен

База серверная, куда копать? Заранее спасибо!

Попытка
		Excel = Новый COMОбъект("Excel.Application");
		Excel.WorkBooks.Open(Объект.Каталог);
		//Состояние("Обработка файла Microsoft Excel...");
	Исключение
		Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
		Сообщить(ОписаниеОшибки());                                                      
		Возврат;
	КонецПопытки;
	
	Попытка
		//Открываем необходимый лист
		Excel.Sheets(1).Select(); // лист 1, по умолчанию
	Исключение
		//Закрываем Excel
		Excel.ActiveWorkbook.Close();
		Excel = 0;
		Сообщить("Файл "+Строка(Объект.Каталог)+" не соответствует необходимому формату! Первый лист не найден!");
		Возврат;
	КонецПопытки;
Показать
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. spacecraft 16.02.21 18:08 Сейчас в теме
(1) на сервере Excel совсем не установлен, а на клиенте возможно разрядности не совпадают. Предположу, что клиент 64 бит.
3. user973528 16.02.21 18:10 Сейчас в теме
(2) Попробовать установить эксель на сервере?
На Сервере эксель не установлен вроде бы

Тип файла определяет как файл XLS, а вот в приложение в свойствах файла пишет "Неизвестное приложение"

На клиентском компьютере есть эксель но не помогает, он попросту не видит
7. danjer74 3 16.02.21 19:18 Сейчас в теме
(1) Разбирай через построитель. Только надо в файле колонки обозвать одним словом без пробелов.

ТабличныйДокумент = Новый ТабличныйДокумент;

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

ПЗ = Новый ПостроительЗапроса;

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

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

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

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

ТаблицаЗначений = ПЗ.Результат.Выгрузить();
Показать
Anchoret; Torin; +2 Ответить
8. user973528 16.02.21 20:43 Сейчас в теме
(7) На клиенте делать или на сервере?
9. danjer74 3 16.02.21 20:50 Сейчас в теме
(8)На сервере, но есть одно НО - нужно, чтобы путь Файл существовал на сервере, где развернута 1С.
В общем лучше сделать открытие файла как здесь
10. user973528 16.02.21 20:59 Сейчас в теме
(9) Вываливается ошибка "Тип не определен" Построитель запроса
12. danjer74 3 16.02.21 21:06 Сейчас в теме
13. user973528 16.02.21 21:09 Сейчас в теме
4. starjevschik 16.02.21 18:36 Сейчас в теме
надо зарегистрировать длл
regsvr32 C:\путь к 1с\comcntr.dll
5. user973528 16.02.21 18:40 Сейчас в теме
(4) На сервере или у меня на клиентском?
11. danjer74 3 16.02.21 21:01 Сейчас в теме
(5)Откуда сейчас запускаете - оттуда и делайте. только с рекомендациями из (8)
15. user973528 16.02.21 21:13 Сейчас в теме
(11) Параллельно пытался зарегистрировать DLL на клиентском компьютере, зарегистрировалась, но ошибка осталась. 64 разрядная ось на клиентском компьютере, но разные версии платформ, на клиентском 8.3.16, на сервере 8.3.18. может ли быть из-за этого? Не знаете?
16. danjer74 3 16.02.21 21:15 Сейчас в теме
(15)Все должно отработать норм. У меня крутиться на 8.3.15
17. user973528 16.02.21 21:16 Сейчас в теме
(16) Не, не взлетело, компонента зарегистрировалась, а всё равно ошибка по COM осталась
6. user973528 16.02.21 18:41 Сейчас в теме
(4) На моем клиентском другая платформа стоит, подключаюсь к базе через RDP
14. user973528 16.02.21 21:09 Сейчас в теме
(4) Вопрос такой, версии платформ должны совпадать между клиентом и сервером?
18. danjer74 3 16.02.21 21:30 Сейчас в теме
(14)Конечно. Но платформа об этом сообщает.
19. user973528 16.02.21 21:33 Сейчас в теме
(18) Правильно понимаю что искать исправление ошибки по COM нужно на моём компьютере а не на сервере?
20. danjer74 3 16.02.21 21:35 Сейчас в теме
(19)Насколько я помню, такая ошибка выходит, когда на сервере не установлен EXCEL. Лучше всего делать через построитель отчета или построитель запроса. Поищите в инете - информация там есть. Так быстрее будет, я думаю. И Excel не надо будет ставить на сервер.
21. Max_Max 17.02.21 06:41 Сейчас в теме
&НаСервере
Функция ЗагрузкаНоменклатуры_ПрочитатьФайл(ИмяФайла)
    ТабДокумент = Новый ТабличныйДокумент;
    ТабДокумент.Прочитать(ИмяФайла);
    
    
    ВсегоСтрок = ТабДокумент.ВысотаТаблицы;
    ВсегоКолонок = ТабДокумент.ШиринаТаблицы;
    
    
    Область = ТабДокумент.Область(1,1,ВсегоСтрок,ВсегоКолонок);
    
    ИсточникДанных = Новый ОписаниеИсточникаДанных(Область);
    
    ПостроительОтчета = Новый ПостроительОтчета;
    ПостроительОтчета.ИсточникДанных = ИсточникДанных;
    
    
    ПостроительОтчета.Выполнить();
    
    
    ТабЗначений = ПостроительОтчета.Результат.Выгрузить();
    Возврат ТабЗначений;

КонецФункции
Показать


У меня вот так любой Ексель файл читает.
22. user973528 17.02.21 07:39 Сейчас в теме
(21) в модуле формы ругается на построитель отчета
23. Max_Max 17.02.21 07:43 Сейчас в теме
24. user973528 17.02.21 07:53 Сейчас в теме
(23) Тип не определен, Построитель отчета
25. user973528 17.02.21 09:15 Сейчас в теме
(23)
Тип не определен (ОписаниеИсточникаДанных)
	ИсточникДанных = Новый <<?>>ОписаниеИсточникаДанных(Область); (Проверка: Мобильное приложение-сервер)


На построитель отчета аналогично выдаёт
34. Max_Max 17.02.21 09:52 Сейчас в теме
(25)
Проверка: Мобильное приложение-сервер

Убери проверку Мобильное приложение-сервер
Прикрепленные файлы:
35. user973528 17.02.21 09:56 Сейчас в теме
(34)
{(1, 1)}: Ожидается выражение "ВЫБРАТЬ"
{ВнешняяОбработка.ЗагрузкаИзЭксель.Форма.Форма.Форма(171)}:	ТабЗначений = ПостроительОтчета.Результат.Выгрузить();
{ВнешняяОбработка.ЗагрузкаИзЭксель.Форма.Форма.Форма(17)}:	ТЗ = Построитель(Объект.Каталог);

по причине:
{(1, 1)}: Ожидается выражение "ВЫБРАТЬ"
36. Max_Max 17.02.21 10:07 Сейчас в теме
37. user973528 17.02.21 10:11 Сейчас в теме
Спасибо, получилось вытащить ТЗ, Код отработал, как я понял ошибка с "Выбрать" была из-за некорректных полей в файле. Убрал пробелы и вроде подгрузилось
26. user973528 17.02.21 09:25 Сейчас в теме
(23) База запущена в тонком клиенте, это может играть роль?
38. XelOla 17 07.09.22 14:25 Сейчас в теме
(21)
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.Прочитать(ИмяФайла);


ВсегоСтрок = ТабДокумент.ВысотаТаблицы;
ВсегоКолонок = ТабДокумент.ШиринаТаблицы;


Область = ТабДокумент.Область(1,1,ВсегоСтрок,ВсегоКолонок);

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

ПостроительОтчета = Новый ПостроительОтчета;
ПостроительОтчета.ИсточникДанных = ИсточникДанных;


ПостроительОтчета.Выполнить();


ТабЗначений = ПостроительОтчета.Результат.Выгрузить();
Возврат ТабЗначений;
Показать

а у меня ругается
[ОшибкаВоВремяВыполненияВстроенногоЯзыка]
по причине:
{(1, 1)}: Ожидается выражение "ВЫБРАТЬ"
27. Max_Max 17.02.21 09:26 Сейчас в теме
28. user973528 17.02.21 09:29 Сейчас в теме
(27)
&НаСервере
Функция Построитель(ИмяФайла)
	
	ТабДокумент = Новый ТабличныйДокумент;
    ТабДокумент.Прочитать(ИмяФайла);
	
	ВсегоСтрок = ТабДокумент.ВысотаТаблицы;
	ВсегоКолонок = ТабДокумент.ШиринаТаблицы;
	
	Область = ТабДокумент.Область(1,1,ВсегоСтрок,ВсегоКолонок);
	
	ИсточникДанных = Новый ОписаниеИсточникаДанных;//(Область);
	
	ПостроительОтчета = Новый ПостроительОтчета;
	ПостроительОтчета.ИсточникДанных = ИсточникДанных;
	
	
	ПостроительОтчета.Выполнить();
	
	
	ТабЗначений = ПостроительОтчета.Результат.Выгрузить();
	
	Возврат ТабЗначений;

КонецФункции
Показать


На сервере всё, ошибка не уходит
29. Max_Max 17.02.21 09:32 Сейчас в теме
Скинь файл обработки. Посмотрю.
30. user973528 17.02.21 09:33 Сейчас в теме
31. user973528 17.02.21 09:38 Сейчас в теме
(29) У меня тонкий клиент запущен, это может быть проблемой в этом решении?
32. Max_Max 17.02.21 09:39 Сейчас в теме
У меня все работает. Только ты Таблицу значений на клиент возвращаешь. Так не получится


&НаКлиенте
Процедура ЗаполнитьТабличнуюЧасть(Команда)
	
	ТЗ = Построитель(Объект.Каталог);-----------Здесь возврат из функции таблицы значений
	
	Объект.ТЧ.Очистить();
33. user973528 17.02.21 09:45 Сейчас в теме
(32) Я подозреваю что из-за тонкого клиента всё не работает
39. nuno21 2 04.07.23 10:20 Сейчас в теме
Дополню обсуждение. У меня возникла ошибка как описано выше. Что я только не делал: и регистрировал, и отменял регистрацию компоненты. А в итоге выяснил, что дело было в платформе 8.3.22.1750. Она, как я выяснил, выдаёт ошибку как выше. А платформы 8.3.18.1363 и 8.3.23.1596 на том же коде работает без проблем. Может кому полезно будет
40. user1135816 4 05.07.23 13:16 Сейчас в теме
(39) Вам необходимо было устанавливать эту платформу от имени администратора, чтобы все dll зарегистрировались. Либо вручную зарегистрировать comcntr.dll (папка bin необходимой платформы)
42. nuno21 2 14.07.23 14:54 Сейчас в теме
(39) Upd. Разобрался с ошибкой. Итак она возникала не из-за платформы. Дело было в том, что режим работы клиент-серверный, а Excel на сервере установлен не был. То есть на клиенте установленный Excel не влияет на работу кода на сервере. И да, передаваемый адрес расположения файла на локальной машине на сервере просто не найдётся.
44. vadim1011985 99 15.07.23 02:08 Сейчас в теме
(42) Вот именно поэтому читать excel следует на клиенте , а прочитанные данные уже передавать на сервер и работать с ними.
45. nuno21 2 17.07.23 13:03 Сейчас в теме
(44) Отличный совет. Спасибо
49. nuno21 2 17.07.23 15:56 Сейчас в теме
(44) Не подскажете как победить ошибку
Ошибка при вызове конструктора (COMОбъект): Установлен безопасный режим. Выполнение операции запрещено?
Выполняю под обычным пользователем с неполными правами
41. nuno21 2 05.07.23 18:33 Сейчас в теме
(40) Регистрацию от имени администратора я делал. Это косяк именно этой платформы. Иначе как объяснить, что на этом же самом компьютере две другие платформы код отрабатывают без ошибок? Причем для других платформ я никаких регистраций специально не делал.
43. polax 14.07.23 19:32 Сейчас в теме
(41) 1750 Точно не причем. Имею две нужные обработки именно на построителе (самый быстрый и простой способ читать эксель в ТЗ, по моим замерам в файле на 1000 срок быстрее примерно в 4 раза), работают на 8.3.22.1750 без каких-либо проблем
46. nuno21 2 17.07.23 13:04 Сейчас в теме
(43) А можете показать код как это на построителе?
47. polax 17.07.23 14:28 Сейчас в теме
(46) Диалог выбора файла, помещение во временное хранилище и передача на сервер. Далее
&НаСервере
Процедура ОбработатьФайлНаСервере(АдресФайла,СтрокиДанныхНачалоКонец)
	
	ПолноеИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайла);
	ДвоичныеДанные.Записать(ПолноеИмяФайла);
	
	ТабДокумент = Новый ТабличныйДокумент;
	ТабДокумент.Прочитать(ПолноеИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
	ПЗ = Новый ПостроительЗапроса;
	ПараметрыЗагрузки = ПолучитьПараметрыЗагрузки(ТабДокумент);
	ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ПараметрыЗагрузки.ТабДокумент.Область(СтрокиДанныхНачалоКонец.ПерваяСтрока,1,СтрокиДанныхНачалоКонец.ПоследняяСтрока,100));
	ПЗ.ЗаполнитьНастройки();
	ПЗ.Выполнить();
	ТЗ = ПЗ.Результат.Выгрузить();
	УдалитьФайлы(ПолноеИмяФайла);
	
	ОбработатьФайлНаСервереЗавершение(ТЗ,ПараметрыЗагрузки.ПартнерЯндекс);
	
КонецПроцедуры 
Показать

Читает 100+ строк чуть дольше мгновения
48. nuno21 2 17.07.23 15:13 Сейчас в теме
(47) Да, этот код работает просто супер. Но вот с чем я не смог разобраться. Под пользователем с полными правами всё отлично работает. Но под обычным пользователем на строке
ДвоичныеДанные.Записать(ПолноеИмяФайла);
Выдаётся ошибка:
Ошибка при вызове метода контекста (Записать)

по причине:
Установлен безопасный режим. Выполнение операции запрещено

Не подскажете как справиться?
50. polax 17.07.23 16:55 Сейчас в теме
Внешняя обработка? В модуле объекта функция сведения о внешней обработке, поставить БезопасныйРежим в Ложь
51. nuno21 2 18.07.23 08:46 Сейчас в теме
(50) Сведения ставятся если я подключаю обработку как внешнюю. Я до этого пока не дошёл, делаю через Файл-Открыть, чтобы отлаживать было удобнее
Оставьте свое сообщение

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