Работа с Excel из 1С тонкий клиент

1. olafbond 23.05.17 22:46 Сейчас в теме
Добрый день.
Для работы с электронными таблицами открываю Excel стандартным кодом:
Excel = Новый COMОбъект("Excel.Application");
Книга = Excel.WorkBooks.Open(ФайлИмпорта);

С переходом на арендованную 1С обработки перестали работать на тонком клиенте.
Ошибка открытия MS Excel: {ВнешняяОбработка.Импорт.Форма.Форма.Форма(66)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft Excel): Не удалось найти "C:\Users\ХХХ\Desktop\1.xlsx". Проверьте правильность ввода имени и расположения файла. При попытке открытия файла из списка недавно использованных файлов убедитесь, что файл не был переименован, перемещен или удален.

Прошу помочь с интеграцией.
По теме из базы знаний
Найденные решения
14. olafbond 24.05.17 21:36 Сейчас в теме
(13) Отвечая вам, понял, что уже ни в чем не уверен). Провайдер предоставляет мне доступ к облачной 1С через тонкий клиент или через WEB-интерфейс на выбор.
Текущее решение такое:
Исходный файл XLS заменен на CSV, тем более, что в моем случае у него строже структура.
Из сети взят код помещения файла во временное хранилище сервера. Как это работает, не понимаю, но работает).
&НаКлиенте
Процедура Импорт(Команда)
Перем ВыбранноеИмя; 
Перем АдресВременногоХранилища; 
Если ПоместитьФайл(АдресВременногоХранилища, ВыбранноеИмя, ВыбранноеИмя, 
	Истина, УникальныйИдентификатор) Тогда 
	Формирование(АдресВременногоХранилища); 
КонецЕсли; 
КонецПроцедуры

&НаСервере
Процедура Формирование(АдресВременногоХранилища)
ПутьНаСервере = "Q:\Temp1csrvu\v8_F3A2_a7.tmp";
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);	
ДвоичныеДанные.записать(ПутьНаСервере);
Текст = Новый ЧтениеТекста(ПутьНаСервере, КодировкаТекста.Системная,Символы.ПС,,0);
ТекстСтрокиФайла = Текст.ПрочитатьСтроку();
Текст.Закрыть();
КонецПроцедуры
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. lefthander 23.05.17 23:06 Сейчас в теме
(1) Права на использование ком объекта и сам ком объект есть?
1С арендована в сервисе или в облаке терминальном?
8. starjevschik 24.05.17 09:21 Сейчас в теме
(1) С ComObject стало как-то сложно на новых платформах, сейчас всех перевожу на такое

	Попытка
		Книга = ПолучитьCOMОбъект(ИмяФайла,);
		Книга = ПолучитьCOMОбъект(ИмяФайла, "Excel.Application");
	Исключение
		Сообщить("НЕ удалось открыть Ексель или найти файл   " + ОписаниеОшибки());
		Возврат;
	КонецПопытки;

пока работает на всех платформах, клиентах, серверах и т.п. Почему-то надо именно обе строки, по одной они не работают ))
alean; olafbond; v3rter; +3 Ответить
2. spe1c 5 23.05.17 23:03 Сейчас в теме
Судя по сообщению у вас программа файлы не находит. 1С именно у вас на компьютере запускается, там случайно не терминал?
olafbond; +1 Ответить
9. olafbond 24.05.17 14:23 Сейчас в теме
(2) (7) Тонкий клиент запускается локально, обработка лежит локально, подгружаемый файл локальный. На удаленном сервере Excel недоступен (пров просит денег), но дело похоже не в этом, т.к. текстовый файл тоже не могу прочесть. См. (4)
(3) Про права не могу пока сказать. Сделал запрос в рарус. 1С арендована на сервисе, как понял - работаю через тонкий клиент.
(4) Похоже, так и есть. Пробую открыть локальный текстовый файл:
ЗагружаемыйФайл = Новый ТекстовыйДокумент;
ЗагружаемыйФайл.Прочитать(ФайлИмпорта); 
Ошибка при вызове метода контекста (Прочитать): Каталог не обнаружен
Интересно, как читаются файлы выписки из банк-клиента - такой же локальный файл.
В модуле ОбменСБанкомВФормате1С есть код, который приводит к той же ошибке:
ЧтениеТекста = Новый ЧтениеТекста(ФайлИмпорта, "windows-1251",,,Ложь);
13. lefthander 24.05.17 16:45 Сейчас в теме
(9)
1С арендована на сервисе, как понял - работаю через тонкий клиент.

Работа в сервисе, и работа в тонком клиенте, и работа в терминальном доступе - это все разные технологии подключения к 1С.
Без понимания по какой технологии Вы работаете можно только угадать почему не запускается. Если работаете в сервисе, то обработка должна быть сертифицирована поддержкой сервиса. Обратитесь к ним и предоставьте обработку.
Если терминальный доступ, или терминальный доступ к облаку, то на сервере терминалов должен быть установлен Эксель.
14. olafbond 24.05.17 21:36 Сейчас в теме
(13) Отвечая вам, понял, что уже ни в чем не уверен). Провайдер предоставляет мне доступ к облачной 1С через тонкий клиент или через WEB-интерфейс на выбор.
Текущее решение такое:
Исходный файл XLS заменен на CSV, тем более, что в моем случае у него строже структура.
Из сети взят код помещения файла во временное хранилище сервера. Как это работает, не понимаю, но работает).
&НаКлиенте
Процедура Импорт(Команда)
Перем ВыбранноеИмя; 
Перем АдресВременногоХранилища; 
Если ПоместитьФайл(АдресВременногоХранилища, ВыбранноеИмя, ВыбранноеИмя, 
	Истина, УникальныйИдентификатор) Тогда 
	Формирование(АдресВременногоХранилища); 
КонецЕсли; 
КонецПроцедуры

&НаСервере
Процедура Формирование(АдресВременногоХранилища)
ПутьНаСервере = "Q:\Temp1csrvu\v8_F3A2_a7.tmp";
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);	
ДвоичныеДанные.записать(ПутьНаСервере);
Текст = Новый ЧтениеТекста(ПутьНаСервере, КодировкаТекста.Системная,Символы.ПС,,0);
ТекстСтрокиФайла = Текст.ПрочитатьСтроку();
Текст.Закрыть();
КонецПроцедуры
Показать
16. denisros 24.04.18 03:34 Сейчас в теме
(14) На всякий случай дополню: если планируется использование в внешней обработке с безопасным режимом, то запись временного файла будет производиться только с разрешением РазрешениеНаИспользованиеКаталогаВременныхФайлов в ф-ции СведенияОВнешнейОбработке.

ПараметрыРегистрации.Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина,Истина,"Для корректной работы с временными файлами"));
4. quick 583 23.05.17 23:08 Сейчас в теме
Правильно! Т.к. СОМ объекты создаются на сервере и файлы ищутся на сервере, а у вас тонкий клиент.
Для того что бы заработало надо посношаться с передачей файлов с тонкого клиента на сервер (для веб версии со спецификой) и грузить там файлы из темпа. А так же на сервере должен стоять MS Excel :)
olafbond; +1 Ответить
5. lefthander 23.05.17 23:13 Сейчас в теме
(4)Код из поста старттопика выполняется на клиенте
17. serko8547 110 04.08.22 15:48 Сейчас в теме
Улучшил ваш код, для чтения на тонком клиенте

&НаКлиенте
Процедура ПутьНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) //необходимо в событии "НачалоВыбора" поля ввода вызвать ДиалогВыбораФайла

    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Заголовок = "Выберите файл Excel";
    Диалог.ПредварительныйПросмотр = Ложь;
    Диалог.Фильтр = "(*.xls,*.xlsx)|*.xls;*.xlsx;|Microsoft Excel 97/2000/XP/2003 (*.xls)|*.xls|Microsoft Excel 2007/2010 (*.xlsx)|*.xlsx";

    Если Диалог.Выбрать() Тогда
        ВыбранныйФайл = Диалог.ПолноеИмяФайла;
        Объект.Путь = ВыбранныйФайл;
		ТабДок = Новый ТабличныйДокумент;
    	ТабДок.Прочитать(ВыбранныйФайл, СпособЧтенияЗначенийТабличногоДокумента.Текст);
		 
		 
;
		 ////1) Выводим Excel в табличн.документ
		 
		 НачальнаяСтрока = 2; // внимание, тут мы начинаем перед начальной строкой, назначая имена в таблице!!!
		 
		 Для а=1 по ТабДок.ШиринаТаблицы Цикл
			 
		 // делаем что то типа такого:
		 //ТабДок.Область(2,1).Текст = "Столбец1";
		 //ТабДок.Область(2,2).Текст = "Столбец2";
		 //ТабДок.Область(2,3).Текст = "Столбец3";
		 //ТабДок.Область(2,4).Текст = "Столбец4";
		 
		 ТабДок.Область(НачальнаяСтрока,а).Текст = "Столбец"+а;
		 
	 КонецЦикла;
	 
        ЧтениеExcel_через_ТД(ТабДок);
    КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ЧтениеExcel_через_ТД(ТабДок)


	
	////2) Выгружаем в таблицу значений
	
	НачСтрока = 2; столбцов = ТабДок.ШиринаТаблицы; ВсегоСтрок = ТабДок.Области.Лист1.Низ; НачальныйСтолбец = 1; 
	
	ПЗ = Новый ПостроительЗапроса;
	ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область(НачСтрока,НачальныйСтолбец,ВсегоСтрок,столбцов));
	ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
	ПЗ.ЗаполнитьНастройки();
	ПЗ.Выполнить();

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

КонецПроцедуры
Показать

(4)
6. quick 583 23.05.17 23:27 Сейчас в теме
В процедуре с декоратором &НаКлиенте ?
11. lefthander 24.05.17 16:37 Сейчас в теме
7. E_Johnny 24.05.17 02:38 Сейчас в теме
Есть несколько вариантов:
ФайлИмпорта у вас где находится?
каким образом подключаетесь к арендованной 1С?
Установлен ли Excel на удаленном сервере?

Также могу посоветовать использовать или взять за образец штатную обработку 1С в БП "ЗагрузкаДанныхИзВнешнегоИсточника"
olafbond; +1 Ответить
10. olafbond 24.05.17 15:47 Сейчас в теме
В модуле загрузки Классификатора найден код:
ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(АдресФайла);
ДвоичныеДанныеФайла.Записать(ИмяВременногоФайла );
ФайлЧтение.ОткрытьФайл(ИмяВременногоФайла);

1. Как понимаю, создается временный файл на сервере провайдера.
2. Создается ссылка(?) на импортируемый файл
3. Запись содержимого во временный файл.
4. Обработка временного файла.
Повторить не удалось:
Ошибка создания документов: {ВнешняяОбработка.Импорт.Форма.Форма.Форма(113)}: Ошибка при вызове метода контекста (ПолучитьИзВременногоХранилища): Ошибка получения значения из временного хранилища: Неправильный путь к файлу 'C:\Users\...
12. olafbond 24.05.17 16:39 Сейчас в теме
Передача файла во временное хранилище на сервере это называется.
Пошел читать.
15. olafbond 26.05.17 09:23 Сейчас в теме
Вот ответ провайдера:
Обработки выполняющие загрузку файлов в базу при работе через тонкий клиент будут использовать com-объекты на том ПК где они исполняются,т.е com-объекты Excel или Open Office должны быть установлены на этом ПК. В коде обработки должно быть указано выполнение процедуры "На клиенте".
Т.к. мне неудобно пересылать на сервер файл построчно, остановился на приведенном выше варианте текстового CSV документа, передаваемого целиком во временное хранилище сервера.
Оставьте свое сообщение

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