Имя: Пароль:
1C
1С v8
Чтение Excel в регламентном задании УТ 11 клиент-сервер
0 PitNN
 
04.04.14
16:59
Добрый день, коллеги.
Решил автоматизировать загрузку данных от клиентов. Многие высылают в экселе, соответственно нужно читать и анализировать её. Чтобы менеджеры не заморачивались с этим, чтение экселя решил вынести в регламентное задание. Но тут возникла проблема с созданием ком-объекта Excel.Application. Почитал статьи, рекомендуют вынести вызов ком-объекта на клиент, но при выполнении регламентного задания нет никакого клиента, все выполняется сервером. Как быть? Посоветуйте
1 SUA
 
04.04.14
17:23
в регламентном без вариантов только сервер
или прайсы в csv перекидывать сначала и затем скармливать как текст если эксель тупить будет
2 ДенисЧ
 
04.04.14
17:32
"Почитал статьи, рекомендуют вынести вызов ком-объекта на клиент"

Выкинь эти статьи.
3 х86
 
04.04.14
17:39
(0)ексель на сервере установлен? )
4 PitNN
 
04.04.14
17:46
(2) Хороший совет, но а делать-то чего? ))
5 ДенисЧ
 
04.04.14
17:47
(4) а в чём конкретно проблема?
6 PitNN
 
04.04.14
17:47
(3) Да, установлен
7 lex-kex
 
04.04.14
17:47
(4) На серваке EXCEL установи
8 lex-kex
 
04.04.14
17:48
(6) Тогда должно все работать
9 PitNN
 
04.04.14
17:49
(5) создание ком объекта вызывает исключение
10 PitNN
 
04.04.14
17:49
Сервер работает как служба. Может в этом проблема?
11 lex-kex
 
04.04.14
17:51
(10) Скинь код как ты его вызываешь?
12 mdocs
 
04.04.14
17:52
может как xml читать.
13 PitNN
 
04.04.14
18:07
(11) Вот код:
    Попытка
        Эксель = Новый COMОбъект("Excel.Application");
    Исключение
        СообщениеОбОшибке = НСтр("ru = 'Не удалось прочитать Excel. Убедитесь, что на компьютере установлена программа Microsoft Excel. Подробности: '")
                          + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
        ВызватьИсключение СообщениеОбОшибке;
    КонецПопытки;
    
    //Следующая команда откроет книгу:
    Книга = Эксель.WorkBooks.Open(ИмяФайла); // <-- Здесь вылетает исключение
14 PitNN
 
04.04.14
18:07
(12) Покажи пример, пожалуйста
15 SUA
 
04.04.14
18:34
и какое исключение?
может файла нет?
доступа к папке откуда его тянуть?
или дальше гадать?
16 beholder
 
04.04.14
18:39
(13) права на папку? Что за ошибка?

Не рекомендуют на сервере наверное из-за того что по сети файл взад-назад тягать не комильфо.
17 Heckfy
 
04.04.14
18:39
Сдается мне, что нет прав у пользователя, под которым сервер 1С работает....
18 beholder
 
04.04.14
18:40
(14) на инфостарте есть примеры как парсить XSLX но могут возникнуть проблемы если сторонняя прога сохраняет в этот формат.
19 PitNN
 
05.04.14
12:52
(15) Вот такое исключение:
Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft Office Excel): Невозможно получить свойство Open класса Workbooks

Файл есть. Он лежит локально на сервере. Доступ к папке есть для всех.
20 PitNN
 
05.04.14
12:59
Тот же самый код, запущенный на клиенте выполняется без проблем.
21 Tateossian
 
05.04.14
12:59
(19) Значение имени файла в студию.
22 PitNN
 
05.04.14
13:03
(21) D:\1C\Inomarka\_ElDoc\NaklIn\[email protected]\СФ №00021194 от 21-03-14.XLS
23 alexei366
 
05.04.14
13:07
(22) попробуй путь с именем только из латиницы пока что
24 alexei366
 
05.04.14
13:08
(23) Если не получиться то мож чо ещё расскажу
25 alexei366
 
05.04.14
13:11
(19) И Для интереса, попробуй заместо Open использовать Add
26 PitNN
 
05.04.14
13:21
(23) (25) Ни то, ни другое не помогло
27 alexei366
 
05.04.14
13:28
(26) а просто Add без имени файла, пустой новый док добавить, и если получитьсязаписать его
28 PitNN
 
05.04.14
13:39
(27) Метод Add прошел, но при попытке сохранить документ опять исключение:
Ошибка при вызове метода контекста (SaveAs): Произошла исключительная ситуация (Microsoft Office Excel): Метод SaveAs из класса Workbook завершен неверно Файл не сохранен!
29 PitNN
 
05.04.14
13:40
Не помог и привелигированый режим
30 alexei366
 
05.04.14
13:40
(28) А есть папка C:\Users\Default\Desktop ?
31 alexei366
 
05.04.14
13:41
(30) когда оффис исполняется на сервере от службы, то он вроде использует эту папку для вр файлов
32 PitNN
 
05.04.14
13:41
Скорее всего тут суть в том, что на сервере, на уровне платформы, запрещены файловые операции
33 alexei366
 
05.04.14
13:42
(32) чувак у меня так везде работает, и с вордом и с экселем, попробуй (30)
34 Denyk
 
05.04.14
13:42
(0) ADO не рассматривали?
35 alexei366
 
05.04.14
13:44
(34) Ну если ток для чтения то покатит наверно, я просто для чтения, изменения и записи юзаю, так что мне COM нужен был
36 PitNN
 
05.04.14
13:46
(30) Да, папка такая есть на сервере
37 alexei366
 
05.04.14
13:47
(36) а сервер 1С скольки битный
38 PitNN
 
05.04.14
13:52
(34) Да, пробовал.
    db = Новый COMОбъект("ADODB.Connection");
    Rs = Новый COMОбъект("ADODB.RecordSet");
    
    Попытка
        db.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\1C\Inomarka\_ElDoc\NaklIn\[email protected]\00021194.XLS;Extended Properties="Excel 8.0;HDR=NO; IMEX=1;";
        db.Open();  <-- Исключение
    Исключение
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;

Текст исключения:
Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (ADODB.Connection): Не удается найти указанный поставщик. Вероятно, он установлен неправильно.
39 PitNN
 
05.04.14
13:53
(37) Сервер x64
40 alexei366
 
05.04.14
13:55
(39) ОООООООО, а попробу C:\Users\Default\Desktop64 создать
41 alexei366
 
05.04.14
13:58
42 PitNN
 
05.04.14
14:00
(40) Не помогло
(41) Там и брал строку соединения
43 alexei366
 
05.04.14
14:01
(42) А может C:\Users\Default64\Desktop
44 alexei366
 
05.04.14
14:02
(43) Или тогда от кого служба 1С запущена?
45 PitNN
 
05.04.14
14:06
(44) От пользователя домена
46 alexei366
 
05.04.14
14:08
(45) И если зайти от него то все в интерактиве получается?
47 alexei366
 
05.04.14
14:09
(46) я имею ввиду на серваке
48 PitNN
 
05.04.14
14:11
Нет возможности сейчас проверить.
49 PitNN
 
05.04.14
14:12
Если код открытия вызывать на стороне клиента, то все работает.
50 etc
 
05.04.14
14:12
(42) а если так?:

    dbCon = Новый COMОбъект("ADODB.Connection");
    
    Если НРег(Файл.Расширение) = ".xls" Тогда
        dbCon.Provider = "Microsoft.Jet.OLEDB.4.0";
        dbCon.Properties("Data Source").Value = Файл.ПолноеИмя;
        dbCon.Properties("Extended Properties").Value = "Excel 4.0;HDR="+?(ИменаКолонокВПервойСтроке,"Yes","No")+";IMEX=1";
    ИначеЕсли НРег(Файл.Расширение) = ".xlsx" Тогда
        dbCon.Provider = "Microsoft.ACE.OLEDB.12.0";
        dbCon.Properties("Data Source").Value = Файл.ПолноеИмя;
        dbCon.Properties("Extended Properties").Value = "Excel 12.0;HDR="+?(ИменаКолонокВПервойСтроке,"Yes","No")+";IMEX=1";
    ИначеЕсли НРег(Файл.Расширение) = ".csv" Тогда
        dbCon.Provider = "Microsoft.Jet.OLEDB.4.0";
        dbCon.Properties("Data Source").Value = Файл.Путь;
        dbCon.Properties("Extended Properties").Value = "text;HDR="+?(ИменаКолонокВПервойСтроке,"Yes","No")+";FMT=Delimited";
    КонецЕсли;
        
    Попытка
        dbCon.Open();
    Исключение
        ТекстОшибки = ИнформацияОбОшибке().Описание;
        dbCon = Неопределено;
        ВызватьИсключение("Не удалось открыть файл "+Файл.Имя+" : "+ТекстОшибки);
    КонецПопытки;
51 alexei366
 
05.04.14
14:13
(48) Как так, ты же смотрел наличие папки, создавал новую на серваке, почему проверить не можешь?
52 alexei366
 
05.04.14
14:13
(49) На стороне клиента на сервере?
53 alexei366
 
05.04.14
14:14
(52) Всмсле запущеного экземпляра предпрития на сервере?
54 PitNN
 
05.04.14
14:17
(51) Чтобы проверить, нужно авторизоваться под пользователем от которого запущен сервер 1С. Я не могу под ним авторизоваться в силу отсутствия пароля
(53) Запускаю экземпляр приложения, вызываю внешнюю обработку и там прописываю процедуру открытия с ключом &НаКлиенте
55 alexei366
 
05.04.14
14:23
(54) ООООООООО, я походу тебя обманывал и сам забыл
56 alexei366
 
05.04.14
14:24
(55) Попробуй эти создать))))

C:\Windows\System32\Config\Systemprofile

C:\Windows\SysWOW64\Config\Systemprofile
57 alexei366
 
05.04.14
14:25
(56) Всмысле в этих папках папку Desktop
58 alexei366
 
05.04.14
14:26
(56) И вроде нужно только там какой битности оффис, пофиг на 1С
59 PitNN
 
05.04.14
14:47
(56) Вот ты добрый человек! Гений, по другому и не сказать )))
60 alexei366
 
05.04.14
14:49
(59) Да блин ты меня заставил на сервак зайти и вспомнить чо да как))))
61 PitNN
 
05.04.14
14:54
Единственное что осталось, это команда

    Эксель.Application.Quit();

не завершает процесс. Экселька продолжает висеть в диспетчере задач на сервере. В чем может быть дело, подскажи пожалуйста
62 PitNN
 
05.04.14
14:58
За твои заслуги готов поддержать тебя материально. Переводом либо на телефон
63 alexei366
 
05.04.14
16:00
(61) У тя исключение не выскакиевает при закрытии?
64 Torquader
 
06.04.14
00:30
(61) Так сначала нужно закрыть все документы, так как иначе мы видим вопрос о необходимости что-то сохранить, только, на самом деле, мы его не видим, так как рабочий стол записи SYSTEM невидим, но, если очень хочется, там окно можно найти и даже нажать кнопку "Нет".
65 PitNN
 
07.04.14
09:17
(63) Нет, код исполняется без исключений
66 alexei366
 
07.04.14
09:51
(65) Ну в теории не должно ругаться если ты в доке ничо не менял (типа букву в ячейке добавил).
Ну чтобы на точняк, погугли на msdn там или используешь метод Close(0) у WorkSheet или Эксель.Application.Quit(0) (или просто Эксель.Quit(0)).
Нули как разтаки определяют закрытие документа или приложения без лишних проверок.
Я конеш хз у себя сразу писал с нулями, а вот помню когда один из первых разов таким образом с Word работал, то он у меня с исключением вылетал (я имею ввиду на сервере)
67 ProProg
 
07.04.14
09:54
УУУ. В сказку попал человек.
Обратись ко мне. Есть решение.

Я уже все грабли протоптал с этим делом.

Есть у нас решение. Можешь даже не парится.
У нас компонента чтения эксель, нативная.
Работает во всех режимах серверных на любых осях.
68 ProProg
 
07.04.14
09:55
Гарантируем поддержку.
Да и собственно задачу импорта решена целой подсистемой.
69 PitNN
 
07.04.14
09:57
(66) спасибо, попробую, сейчас пока некогда
70 PitNN
 
07.04.14
09:58
(67) Есть где почитать о решении?
71 ProProg
 
07.04.14
10:02
Лови http://subsystems.ru/catalog/43/595/
Будут вопросы - там есть мой скайп
72 PitNN
 
07.04.14
10:08
(71) хорошо, спасибо
73 PitNN
 
07.04.14
11:04
Сделал вот так и все нормально стало:

    Эксель.DisplayAlerts = 0;
    Эксель.Workbooks.Close();
    Эксель.DisplayAlerts = 1;    
    
    Эксель.Application.Quit();
74 Lama12
 
07.04.14
11:36
(56) Объясните про эти папки. Не понял :)
75 alexei366
 
07.04.14
15:49
(74) Когда приложение оффиса (Word, Exel) запускается от сервиса винды, коем в частности является служба 1С сервера, то для временных файлов используются данные каталоги взавизимости от разрядности оффиса.
76 alexei366
 
07.04.14
15:55
(73) а зачем Эксель.DisplayAlerts = 1?
это свойство вообще задавай после создания кома
77 Torquader
 
08.04.14
00:44
(76) Если его не поставить, то в следующий раз, когда Excel откроется, сообщения не будут появляться.