Произошла исключительная ситуация microsoft excel невозможно получить свойство open класса workbooks

Произошла исключительная ситуация (Microsoft Office Excel): Невозможно получить свойство Open класса Workbooks

При разработке в 1С, при попытке выполнить открытие COM-объекта Microsoft Excel на серверной базе данных 1С появляется ошибка «Произошла исключительная ситуация (Microsoft Office Excel): Невозможно получить свойство Open класса Workbooks».

Запуск обработки, вызвавшей данную ошибку, производится на серверной операционной системе Microsoft Windows 2012. Также возможна при запуске на ОС Windows 2008 Server. Права пользователя полные. Причем, запуск на операционной системе не относящейся к семейству серверных происходит без возникновения исключительной ситуации.

Сообщить(«Выгрузка в файл Microsoft Excel…»);

Путь= КаталогВременныхФайлов() + «FILENAME.xls»;

Файл= Новый Файл(Путь);

Если Файл.Существует() = 0 Тогда

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

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

КонецЕсли;

Попытка

ExcelПриложение = Новый COMОбъект(«Excel.Application»);

Исключение

Сообщить(«Ошибка при загрузке Microsoft Excel.» + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);

Возврат;

КонецПопытки;

ExcelФайл = ExcelПриложение.WorkBooks.Open(Путь);

ExcelЛист = ExcelФайл.Worksheets(1);

Возникновение ошибки происходит на предпоследней строке кода.

Решение для устранения исключительной ситуации:

Для нормальной работы MS Office, папка «Desktop» должна находиться в каталоге «systemprofile» системного каталога ОС. Причем, Windows 2003 имеет в своем составе такие папки.

Поэтому необходимо их создать в каталоге «Windows» операционной системы.

— для Windows 2008 Server x64:

C:WindowsSysWOW64configsystemprofileDesktop

— для Windows 2008 Server x86:

C:WindowsSystem32configsystemprofileDesktop

Оцените статью:

Загрузка…

Если Вы заметили ошибку, то выделите ее мышью и нажмите Ctrl+Enter

   PitNN

04.04.14 — 16:59

Добрый день, коллеги.

Решил автоматизировать загрузку данных от клиентов. Многие высылают в экселе, соответственно нужно читать и анализировать её. Чтобы менеджеры не заморачивались с этим, чтение экселя решил вынести в регламентное задание. Но тут возникла проблема с созданием ком-объекта Excel.Application. Почитал статьи, рекомендуют вынести вызов ком-объекта на клиент, но при выполнении регламентного задания нет никакого клиента, все выполняется сервером. Как быть? Посоветуйте

   SUA

1 — 04.04.14 — 17:23

в регламентном без вариантов только сервер

или прайсы в csv перекидывать сначала и затем скармливать как текст если эксель тупить будет

   ДенисЧ

2 — 04.04.14 — 17:32

«Почитал статьи, рекомендуют вынести вызов ком-объекта на клиент»

Выкинь эти статьи.

   х86

3 — 04.04.14 — 17:39

(0)ексель на сервере установлен? )

   PitNN

4 — 04.04.14 — 17:46

(2) Хороший совет, но а делать-то чего? ))

   ДенисЧ

5 — 04.04.14 — 17:47

(4) а в чём конкретно проблема?

   PitNN

6 — 04.04.14 — 17:47

(3) Да, установлен

   lex-kex

7 — 04.04.14 — 17:47

(4) На серваке EXCEL установи

   lex-kex

8 — 04.04.14 — 17:48

(6) Тогда должно все работать

   PitNN

9 — 04.04.14 — 17:49

(5) создание ком объекта вызывает исключение

   PitNN

10 — 04.04.14 — 17:49

Сервер работает как служба. Может в этом проблема?

   lex-kex

11 — 04.04.14 — 17:51

(10) Скинь код как ты его вызываешь?

   mdocs

12 — 04.04.14 — 17:52

может как xml читать.

   PitNN

13 — 04.04.14 — 18:07

(11) Вот код:

    Попытка

        Эксель = Новый COMОбъект(«Excel.Application»);

    Исключение

        СообщениеОбОшибке = НСтр(«ru = ‘Не удалось прочитать Excel. Убедитесь, что на компьютере установлена программа Microsoft Excel. Подробности: ‘»)

                          + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());

        ВызватьИсключение СообщениеОбОшибке;

    КонецПопытки;

    
    //Следующая команда откроет книгу:

    Книга = Эксель.WorkBooks.Open(ИмяФайла); // <— Здесь вылетает исключение

   PitNN

14 — 04.04.14 — 18:07

(12) Покажи пример, пожалуйста

   SUA

15 — 04.04.14 — 18:34

и какое исключение?

может файла нет?

доступа к папке откуда его тянуть?

или дальше гадать?

   beholder

16 — 04.04.14 — 18:39

(13) права на папку? Что за ошибка?

Не рекомендуют на сервере наверное из-за того что по сети файл взад-назад тягать не комильфо.

   Heckfy

17 — 04.04.14 — 18:39

Сдается мне, что нет прав у пользователя, под которым сервер 1С работает….

   beholder

18 — 04.04.14 — 18:40

(14) на инфостарте есть примеры как парсить XSLX но могут возникнуть проблемы если сторонняя прога сохраняет в этот формат.

   PitNN

19 — 05.04.14 — 12:52

(15) Вот такое исключение:

Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft Office Excel): Невозможно получить свойство Open класса Workbooks

Файл есть. Он лежит локально на сервере. Доступ к папке есть для всех.

   PitNN

20 — 05.04.14 — 12:59

Тот же самый код, запущенный на клиенте выполняется без проблем.

   Tateossian

21 — 05.04.14 — 12:59

(19) Значение имени файла в студию.

   PitNN

22 — 05.04.14 — 13:03

(21) D:1CInomarka_ElDocNaklInae@autoeuro.ruСФ №00021194 от 21-03-14.XLS

   alexei366

23 — 05.04.14 — 13:07

(22) попробуй путь с именем только из латиницы пока что

   alexei366

24 — 05.04.14 — 13:08

(23) Если не получиться то мож чо ещё расскажу

   alexei366

25 — 05.04.14 — 13:11

(19) И Для интереса, попробуй заместо Open использовать Add

   PitNN

26 — 05.04.14 — 13:21

(23) (25) Ни то, ни другое не помогло

   alexei366

27 — 05.04.14 — 13:28

(26) а просто Add без имени файла, пустой новый док добавить, и если получитьсязаписать его

   PitNN

28 — 05.04.14 — 13:39

(27) Метод Add прошел, но при попытке сохранить документ опять исключение:

Ошибка при вызове метода контекста (SaveAs): Произошла исключительная ситуация (Microsoft Office Excel): Метод SaveAs из класса Workbook завершен неверно Файл не сохранен!

   PitNN

29 — 05.04.14 — 13:40

Не помог и привелигированый режим

   alexei366

30 — 05.04.14 — 13:40

(28) А есть папка C:UsersDefaultDesktop ?

   alexei366

31 — 05.04.14 — 13:41

(30) когда оффис исполняется на сервере от службы, то он вроде использует эту папку для вр файлов

   PitNN

32 — 05.04.14 — 13:41

Скорее всего тут суть в том, что на сервере, на уровне платформы, запрещены файловые операции

   alexei366

33 — 05.04.14 — 13:42

(32) чувак у меня так везде работает, и с вордом и с экселем, попробуй (30)

   Denyk

34 — 05.04.14 — 13:42

(0) ADO не рассматривали?

   alexei366

35 — 05.04.14 — 13:44

(34) Ну если ток для чтения то покатит наверно, я просто для чтения, изменения и записи юзаю, так что мне COM нужен был

   PitNN

36 — 05.04.14 — 13:46

(30) Да, папка такая есть на сервере

   alexei366

37 — 05.04.14 — 13:47

(36) а сервер 1С скольки битный

   PitNN

38 — 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:1CInomarka_ElDocNaklInae@autoeuro.ru0021194.XLS;Extended Properties=»Excel 8.0;HDR=NO; IMEX=1;»;

        db.Open();  <— Исключение

    Исключение

        Сообщить(ОписаниеОшибки());

        Возврат;

    КонецПопытки;

Текст исключения:

Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (ADODB.Connection): Не удается найти указанный поставщик. Вероятно, он установлен неправильно.

   PitNN

39 — 05.04.14 — 13:53

(37) Сервер x64

   alexei366

40 — 05.04.14 — 13:55

(39) ОООООООО, а попробу C:UsersDefaultDesktop64 создать

   alexei366

41 — 05.04.14 — 13:58

   PitNN

42 — 05.04.14 — 14:00

(40) Не помогло

(41) Там и брал строку соединения

   alexei366

43 — 05.04.14 — 14:01

(42) А может C:UsersDefault64Desktop

   alexei366

44 — 05.04.14 — 14:02

(43) Или тогда от кого служба 1С запущена?

   PitNN

45 — 05.04.14 — 14:06

(44) От пользователя домена

   alexei366

46 — 05.04.14 — 14:08

(45) И если зайти от него то все в интерактиве получается?

   alexei366

47 — 05.04.14 — 14:09

(46) я имею ввиду на серваке

   PitNN

48 — 05.04.14 — 14:11

Нет возможности сейчас проверить.

   PitNN

49 — 05.04.14 — 14:12

Если код открытия вызывать на стороне клиента, то все работает.

   etc

50 — 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 = Неопределено;
        ВызватьИсключение("Не удалось открыть файл "+Файл.Имя+" : "+ТекстОшибки);
    КонецПопытки;
   alexei366

51 — 05.04.14 — 14:13

(48) Как так, ты же смотрел наличие папки, создавал новую на серваке, почему проверить не можешь?

   alexei366

52 — 05.04.14 — 14:13

(49) На стороне клиента на сервере?

   alexei366

53 — 05.04.14 — 14:14

(52) Всмсле запущеного экземпляра предпрития на сервере?

   PitNN

54 — 05.04.14 — 14:17

(51) Чтобы проверить, нужно авторизоваться под пользователем от которого запущен сервер 1С. Я не могу под ним авторизоваться в силу отсутствия пароля

(53) Запускаю экземпляр приложения, вызываю внешнюю обработку и там прописываю процедуру открытия с ключом &НаКлиенте

   alexei366

55 — 05.04.14 — 14:23

(54) ООООООООО, я походу тебя обманывал и сам забыл

   alexei366

56 — 05.04.14 — 14:24

(55) Попробуй эти создать))))

C:WindowsSystem32ConfigSystemprofile

C:WindowsSysWOW64ConfigSystemprofile

   alexei366

57 — 05.04.14 — 14:25

(56) Всмысле в этих папках папку Desktop

   alexei366

58 — 05.04.14 — 14:26

(56) И вроде нужно только там какой битности оффис, пофиг на 1С

   PitNN

59 — 05.04.14 — 14:47

(56) Вот ты добрый человек! Гений, по другому и не сказать )))

   alexei366

60 — 05.04.14 — 14:49

(59) Да блин ты меня заставил на сервак зайти и вспомнить чо да как))))

   PitNN

61 — 05.04.14 — 14:54

Единственное что осталось, это команда

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

не завершает процесс. Экселька продолжает висеть в диспетчере задач на сервере. В чем может быть дело, подскажи пожалуйста

   PitNN

62 — 05.04.14 — 14:58

За твои заслуги готов поддержать тебя материально. Переводом либо на телефон

   alexei366

63 — 05.04.14 — 16:00

(61) У тя исключение не выскакиевает при закрытии?

   Torquader

64 — 06.04.14 — 00:30

(61) Так сначала нужно закрыть все документы, так как иначе мы видим вопрос о необходимости что-то сохранить, только, на самом деле, мы его не видим, так как рабочий стол записи SYSTEM невидим, но, если очень хочется, там окно можно найти и даже нажать кнопку «Нет».

   PitNN

65 — 07.04.14 — 09:17

(63) Нет, код исполняется без исключений

   alexei366

66 — 07.04.14 — 09:51

(65) Ну в теории не должно ругаться если ты в доке ничо не менял (типа букву в ячейке добавил).

Ну чтобы на точняк, погугли на msdn там или используешь метод Close(0) у WorkSheet или Эксель.Application.Quit(0) (или просто Эксель.Quit(0)).

Нули как разтаки определяют закрытие документа или приложения без лишних проверок.

Я конеш хз у себя сразу писал с нулями, а вот помню когда один из первых разов таким образом с Word работал, то он у меня с исключением вылетал (я имею ввиду на сервере)

   ProProg

67 — 07.04.14 — 09:54

УУУ. В сказку попал человек.

Обратись ко мне. Есть решение.

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

Есть у нас решение. Можешь даже не парится.

У нас компонента чтения эксель, нативная.

Работает во всех режимах серверных на любых осях.

   ProProg

68 — 07.04.14 — 09:55

Гарантируем поддержку.

Да и собственно задачу импорта решена целой подсистемой.

   PitNN

69 — 07.04.14 — 09:57

(66) спасибо, попробую, сейчас пока некогда

   PitNN

70 — 07.04.14 — 09:58

(67) Есть где почитать о решении?

   ProProg

71 — 07.04.14 — 10:02

Лови http://subsystems.ru/catalog/43/595/

Будут вопросы — там есть мой скайп

   PitNN

72 — 07.04.14 — 10:08

(71) хорошо, спасибо

   PitNN

73 — 07.04.14 — 11:04

Сделал вот так и все нормально стало:

    Эксель.DisplayAlerts = 0;

    Эксель.Workbooks.Close();

    Эксель.DisplayAlerts = 1;    

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

   Lama12

74 — 07.04.14 — 11:36

(56) Объясните про эти папки. Не понял :)

   alexei366

75 — 07.04.14 — 15:49

(74) Когда приложение оффиса (Word, Exel) запускается от сервиса винды, коем в частности является служба 1С сервера, то для временных файлов используются данные каталоги взавизимости от разрядности оффиса.

   alexei366

76 — 07.04.14 — 15:55

(73) а зачем Эксель.DisplayAlerts = 1?

это свойство вообще задавай после создания кома

  

Torquader

77 — 08.04.14 — 00:44

(76) Если его не поставить, то в следующий раз, когда Excel откроется, сообщения не будут появляться.

Победили предыдущую проблему — приложение Excel запускается.
Получили новую ошибку: -2146827284 Невозможно получить свойство Open класса Workbooks.
Возникала на вызове:

EXEC @iRetCode = sp_OAMethod @iXLApp, 'Workbooks.Open', @iDoc OUTPUT, @FileName

Всяческие изменения в вызове процедуры, выделение отдельно Workbooks никак не помогали.
Дело опять же оказалось в правах и в том, что операционка 64-битная:
— нужно проверить, что существует папка C:WindowsSysWOW64configsystemprofileDesktop — если нет, то нужно создать
— и учетной записи, под которой работает служба SQL Server нужно дать полные права на папку C:WindowsSysWOW64configsystemprofile и все ее подпапки.

После этих нехитрых действий всё должно заработать. :-)

Ссылки, посвященные этой теме:
http://forum.foxclub.ru/read.php?29,488069

jediAlex

4 / 4 / 4

Регистрация: 12.07.2011

Сообщений: 623

1

08.08.2018, 08:45. Показов 11340. Ответов 7

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Здравствуйте. В собственной конфигурации на 1С 8.3 есть обработка с несколькими ТЧ, в которые запросами выводятся нужные данные. Надо эти данные выгрузить в выбранный файл excel. Выгрузку делаю так:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
&НаКлиенте
Процедура ВыгрузитьОтчетВExcel()
ПутьФайлаОтчета = Объект.ИмяФайлаОтчета;
Excel = Новый COMОбъект("Excel.Application");
    Книга = Excel.WorkBooks.Open(ПутьФайлаОтчета);  
ТитульныйЛист=Книга.WorkSheets("ПоГруппам");   // итоговый лист по группам
ЛистПерерасход=Книга.WorkSheets("ПерерасходПоСотрудникам");   // перерасход часов по сотрудникам
ЛистВесДоговоров=Книга.WorkSheets("УдельныйВесДоговоров");   // Удельный вес договоров
ПоследняяСтрокаПерерасход=ЛистПерерасход.UsedRange.Row+ЛистПерерасход.UsedRange.Rows.Count-1;
ПоследняяСтрокаВесДоговоров=ЛистВесДоговоров.UsedRange.Row+ЛистВесДоговоров.UsedRange.Rows.Count-1;
ЛистВесДоговоров.Range("A2:G" + Строка(ПоследняяСтрокаВесДоговоров)).Clear();
ЛистПерерасход.Range("A2:G" +Строка(ПоследняяСтрокаПерерасход)).Clear();
ТитульныйЛист.Range("A2:G13").Clear();
СтрокКолонокПерерасход=ПолучитьКоличествоСтрокКолонокПерерасход();
СтрокКолонокВесДоговоров=ПолучитьКоличествоСтрокКолонокВесДоговоров();
СтрокКолонокПоГруппам=ПолучитьКоличествоСтрокКолонокПоГруппам();
Для Стр = 0 По СтрокКолонокПерерасход.Строк Цикл 
        Для Кол = 1 По СтрокКолонокПерерасход.Колонок-1 Цикл
            Если ТипЗнч(ПолучитьЗначениеПерерасходСервер(Стр,Кол,Истина)) = Тип("Число") Тогда   
                ЛистПерерасход.Cells(Стр + 2, Кол).Value = ПолучитьЗначениеПерерасходСервер(Стр,Кол,Истина);
            Иначе  
                ЛистПерерасход.Cells(Стр + 2, Кол).NumberFormat = "@";
                Если ЗначениеЗаполнено(ПолучитьЗначениеПерерасходСервер(Стр,Кол)) Тогда
                    ЛистПерерасход.Cells(Стр + 2, Кол).Value = ПолучитьЗначениеПерерасходСервер(Стр,Кол);
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
Для Стр = 0 По СтрокКолонокВесДоговоров.Строк Цикл
        Для Кол = 1 По СтрокКолонокВесДоговоров.Колонок-1 Цикл
            Если ТипЗнч(ПолучитьЗначениеВесДоговоровСервер(Стр,Кол,Истина)) = Тип("Число") Тогда
                ЛистВесДоговоров.Cells(Стр + 2, Кол).Value = ПолучитьЗначениеВесДоговоровСервер(Стр,Кол,Истина);
            Иначе 
                ЛистВесДоговоров.Cells(Стр + 2, Кол).NumberFormat = "@";
                Если ЗначениеЗаполнено(ПолучитьЗначениеВесДоговоровСервер(Стр,Кол)) Тогда
                    ЛистВесДоговоров.Cells(Стр + 2, Кол).Value = ПолучитьЗначениеВесДоговоровСервер(Стр,Кол);
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    Для Стр = 0 По СтрокКолонокПоГруппам.Строк Цикл
        
        Для Кол = 1 По СтрокКолонокПоГруппам.Колонок-1 Цикл
            Если ТипЗнч(ПолучитьЗначениеПоГруппамСервер(Стр,Кол,Истина)) = Тип("Число") Тогда
                ТитульныйЛист.Cells(Стр + 2, Кол).Value = ПолучитьЗначениеПоГруппамСервер(Стр,Кол,Истина);
            Иначе 
                
                ТитульныйЛист.Cells(Стр + 2, Кол).NumberFormat = "@";
                Если ЗначениеЗаполнено(ПолучитьЗначениеПоГруппамСервер(Стр,Кол)) Тогда
                    ТитульныйЛист.Cells(Стр + 2, Кол).Value = ПолучитьЗначениеПоГруппамСервер(Стр,Кол);
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;   
Excel.Visible=Истина;
КонецПроцедуры


ИмяФайлаОтчета
— реквизит обработки, в который на клиенте через диалог выбора подставляю путь нужного файла. Проблема такая: если выбираю файл, который сам сохранил пред. раз, то все нормально проходит — выгружаются данные и открывается книга. Если чужой файл -присланный например от другого пользователя и сохраненный другим пользователем, то выскакивает ошибка «Конфликт имен»(скрин во вложении). Что не так делаю? помогите пожалуйста.

Миниатюры

Конфликт имен при выгрузке данных в excel
 



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

08.08.2018, 08:45

7

Модератор

Эксперт 1С

3711 / 2907 / 573

Регистрация: 10.03.2011

Сообщений: 11,447

Записей в блоге: 1

08.08.2018, 16:43

2

jediAlex, может у вас офис разный?

Добавлено через 2 минуты
jediAlex, или файлы во что ты выгружаешь имеют установленный фильтр



0



Эксперт 1С

434 / 305 / 92

Регистрация: 28.05.2014

Сообщений: 1,247

08.08.2018, 16:46

3

Цитата
Сообщение от Dethmontt
Посмотреть сообщение

файлы во что ты выгружаешь имеют установленный фильтр

скорее всего, что-то подобное было недавно, и в документах был установлен фильтр.



0



4 / 4 / 4

Регистрация: 12.07.2011

Сообщений: 623

09.08.2018, 08:45

 [ТС]

4

офис 2013-й стоит у всех. Фильтры все убрал(действительно были), сохранил. После сохранения попытался выгрузить — та же ошибка



0



Dethmontt

Модератор

Эксперт 1С

3711 / 2907 / 573

Регистрация: 10.03.2011

Сообщений: 11,447

Записей в блоге: 1

09.08.2018, 12:07

5

Цитата
Сообщение от jediAlex
Посмотреть сообщение

Фильтры все убрал(действительно были), сохранил. После сохранения попытался выгрузить — та же ошибка

Это заморочки экселя.
Убрал в экселе, но служебная таблица то осталась… Ее как то там через диспетчер можно удалить.
Т.е. пытаться вставить свои данные в область на которую был наложен фильтр, будешь получать эту ошибку.

Добавлено через 1 минуту
jediAlex, видел где-то в интернете костыли которые позволяют избежать появление этой ошибки.

Добавлено через 2 минуты
Вот один из примеров

Как убрать фильтр в эксель

Недавно столкнулся с такой же проблемой и решил поделится решением. В моем случае проблема осложнялась тем, что я загружаю данные из Excel файлов в автоматическом режиме, без участия пользователей. Поскольку Excel я открывал в невидимом режиме, то и возникающего диалогового окна с предложением ввести новое имя вместо _FilterDatabase не было видно. Внешне это выглядело как будто процесс обрабатывающий Excel файлы зависал. На самом деле он ждал ввода в диалоговое окно пользователем. Что интересно, при создании OLE объекта я устанавливаю DisplayAlerts в False.
Итак, решение проблемы.
Данные в XLSX файле хранятся в ввиде набора XML и других файлов упакованных в zip архив. Чтобы убедится в этом, можете сменить расширение XLSX на .zip и открыть любым архиватором. Берем файл, который вызывает ошибку (_FilterDatabase), открываем его архиватором. Нас интересует XML файл XLworkbook.xml. Если посмотреть содержимое этого файла, то можно обнаружить, что
в нем есть два атрибута с именем _FilterDatabase, в моем случае:

XML
1
2
<definedName name="_FilterDatabase" localSheetId="0" hidden="1">Лист1!$A$26:$I$26</definedName>
<definedName name="_xlnm._FilterDatabase" localSheetId="0" hidden="1">Лист1!$D$1:$D$272</definedName>

Вот как раз второй атрибут и вызывает ошибку. Если изменить его название или удалить весь тег, то ошибка пропадает.
Итак, алгоритм следующий: Открываем XLSX файл, вытаскиваем из него файл XLworkbook.xml, затем меняем название атрибута «_xlnm._FilterDatabase» на любое другое, запаковываем обратно, открываем Excel файл стандартными средствами. Фрагмент кода реализующий это ниже. Для разархивации использовал бесплатный компонент TZipMaster 1.91.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
function TDSMessageLoader.FixXLSXFile(XLSFileName, TempFolder: String; aZM: TZipMaster; var ErrMsg: String):Boolean;
var XMLDoc, aNode, aNodeList: Variant;
FileName: String;
i: Integer;
begin
  try
  Result := True;
  aZM.Unattended := True;
  aZM.ZipFileName := XLSFileName;
  aZM.ExtrBaseDir := TrimPathDelimiter(TempFolder) + '';
  aZM.FSpecArgs.Clear;
  aZM.ExtrOptions := [];
  aZM.ExtrOptions := aZM.ExtrOptions + [ExtrDirNames] + [ExtrOverwrite];
  aZM.FSpecArgs.Add('xlworkbook.xml');
  aZM.Extract;
 
  FileName := aZM.ExtrBaseDir + 'xlworkbook.xml';
 
  XMLDoc := CreateOleObject('MSXML2.DOMDocument.4.0');
  XMLDoc.async := False;
  XMLDoc.load(FileName);
  XMLDoc.setProperty('SelectionLanguage', 'XPath');
  XMLDoc.SetProperty('SelectionNamespaces', 'xmlns:wrk="http://schemas.openxmlformats.org/spreadsheetml/2006/main"');
 
  if not (XMLDoc.parseError.reason = '') then raise Exception.Create(XMLDoc.parseError.reason);
 
  aNodeList := XMLDoc.selectNodes('//wrk:definedName[@name=''_xlnm._FilterDatabase'']');
  if aNodeList.length > 0 then
  begin
    ErrMsg := 'Исправлен атрибут (_xlnm._FilterDatabase) XLS файла ' + XLSFileName;
    aNode := aNodeList.item[0];
    aNode.setAttribute('name', '_xlnm._FilterDatabaseFixed');
    XMLDoc.save(FileName);
 
    aZM.ZipFileName := XLSFileName;
    aZM.FSpecArgs.Clear;
    aZM.FSpecArgs.Add('workbook.xml');
    aZM.Delete;
    aZM.FSpecArgs.Clear;
    aZM.RootDir := TempFolder;
    aZM.FSpecArgs.Add('xlworkbook.xml');
    aZM.AddOptions := [];
    aZM.AddOptions := aZM.AddOptions + [AddDirNames] + [AddUpdate]; // Update
    aZM.Add;
    DeleteFile(aZM.ExtrBaseDir + 'xlworkbook.xml');
  end;
  except
    on E: Exception do
    begin
      Result := False;
      ErrMsg := E.Message;
    end;
  end;
end;



0



4 / 4 / 4

Регистрация: 12.07.2011

Сообщений: 623

09.08.2018, 13:59

 [ТС]

6

Пример пути к файлу:
C:UsersagvozdkoDocumentsЗагрузка_ПС_с_27.07.20 18_по_02.08.2018.xlsx
Вот как ругается 1С:
{Обработка.ОтчетПоЗагрузкеПС.Форма.ФормаОтчета.Фор ма(490)}: Ошибка при вызове метода контекста (Open)
Книга = Excel.WorkBooks.Open(ПутьФайлаОтчета);
по причине:
Произошла исключительная ситуация (Microsoft Excel): Невозможно получить свойство Open класса Workbooks
Произошла исключительная ситуация (Microsoft Excel): Невозможно получить свойство Open класса Workbooks

Окно ошибки excel во вложении.

Миниатюры

Конфликт имен при выгрузке данных в excel
 



0



1155 / 702 / 203

Регистрация: 22.04.2013

Сообщений: 5,219

Записей в блоге: 1

09.08.2018, 19:07

7

было такое, но не в 1с а в екселе.
помогло примерно вот это



0



Dethmontt

09.08.2018, 19:50


    Конфликт имен при выгрузке данных в excel

Не по теме:

jediAlex, бедняга, на все грабли экселя наступил)) (даже на короткие что до лица не достают, но по «головке» бьют больно) =))))



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

09.08.2018, 19:50

8

Добрый день, коллеги. Решил автоматизировать загрузку данных от клиентов. Многие высылают в экселе, соответственно нужно читать и анализировать её. Чтобы менеджеры не заморачивались с этим, чтение экселя решил вынести в регламентное задание. Но тут возникла проблема с созданием ком-объекта Excel.Application. Почитал статьи, рекомендуют вынести вызов ком-объекта на клиент, но при выполнении регламентного задания нет никакого клиента, все выполняется сервером. Как быть? Посоветуйте

в регламентном без вариантов только сервер или прайсы в csv перекидывать сначала и затем скармливать как текст если эксель тупить будет

«Почитал статьи, рекомендуют вынести вызов ком-объекта на клиент» Выкинь эти статьи.

ексель на сервере установлен? )

Хороший совет, но а делать-то чего? ))

а в чём конкретно проблема?

На серваке EXCEL установи

Тогда должно все работать

создание ком объекта вызывает исключение

Сервер работает как служба. Может в этом проблема?

Скинь код как ты его вызываешь?

Вот код:     Исключение         СообщениеОбОшибке = НСтр(«ru = ‘Не удалось прочитать Excel. Убедитесь, что на компьютере установлена программа Microsoft Excel. Подробности: ‘»)

Покажи пример, пожалуйста

и какое исключение? может файла нет? доступа к папке откуда его тянуть? или дальше гадать?

права на папку? Что за ошибка? Не рекомендуют на сервере наверное из-за того что по сети файл взад-назад тягать не комильфо.

Сдается мне, что нет прав у пользователя, под которым сервер 1С работает….

на инфостарте есть примеры как парсить XSLX но могут возникнуть проблемы если сторонняя прога сохраняет в этот формат.

Вот такое исключение: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft Office Excel): Невозможно получить свойство Open класса Workbooks Файл есть. Он лежит локально на сервере. Доступ к папке есть для всех.

Тот же самый код, запущенный на клиенте выполняется без проблем.

Значение имени файла в студию.

D:1CInomarka_ElDocNaklInae@autoeuro.ruСФ №00021194 от 21-03-14.XLS

попробуй путь с именем только из латиницы пока что

Если не получиться то мож чо ещё расскажу

И Для интереса, попробуй заместо Open использовать Add

Ни то, ни другое не помогло

а просто Add без имени файла, пустой новый док добавить, и если получитьсязаписать его

Метод Add прошел, но при попытке сохранить документ опять исключение: Ошибка при вызове метода контекста (SaveAs): Произошла исключительная ситуация (Microsoft Office Excel): Метод SaveAs из класса Workbook завершен неверно Файл не сохранен!

Не помог и привелигированый режим

А есть папка C:UsersDefaultDesktop ?

когда оффис исполняется на сервере от службы, то он вроде использует эту папку для вр файлов

Скорее всего тут суть в том, что на сервере, на уровне платформы, запрещены файловые операции

чувак у меня так везде работает, и с вордом и с экселем, попробуй

Ну если ток для чтения то покатит наверно, я просто для чтения, изменения и записи юзаю, так что мне COM нужен был

Да, папка такая есть на сервере

а сервер 1С скольки битный

Да, пробовал. Текст исключения: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (ADODB.Connection): Не удается найти указанный поставщик. Вероятно, он установлен неправильно.

ОООООООО, а попробу C:UsersDefaultDesktop64 создать

Не помогло Там и брал строку соединения

А может C:UsersDefault64Desktop

Или тогда от кого служба 1С запущена?

И если зайти от него то все в интерактиве получается?

Нет возможности сейчас проверить.

Если код открытия вызывать на стороне клиента, то все работает.

Как так, ты же смотрел наличие папки, создавал новую на серваке, почему проверить не можешь?

На стороне клиента на сервере?

Всмсле запущеного экземпляра предпрития на сервере?

Чтобы проверить, нужно авторизоваться под пользователем от которого запущен сервер 1С. Я не могу под ним авторизоваться в силу отсутствия пароля Запускаю экземпляр приложения, вызываю внешнюю обработку и там прописываю процедуру открытия с ключом &НаКлиенте

ООООООООО, я походу тебя обманывал и сам забыл

Попробуй эти создать)))) C:WindowsSystem32ConfigSystemprofile C:WindowsSysWOW64ConfigSystemprofile

Всмысле в этих папках папку Desktop

И вроде нужно только там какой битности оффис, пофиг на 1С

Вот ты добрый человек! Гений, по другому и не сказать )))

Да блин ты меня заставил на сервак зайти и вспомнить чо да как))))

Единственное что осталось, это команда не завершает процесс. Экселька продолжает висеть в диспетчере задач на сервере. В чем может быть дело, подскажи пожалуйста

За твои заслуги готов поддержать тебя материально. Переводом либо на телефон

У тя исключение не выскакиевает при закрытии?

Так сначала нужно закрыть все документы, так как иначе мы видим вопрос о необходимости что-то сохранить, только, на самом деле, мы его не видим, так как рабочий стол записи SYSTEM невидим, но, если очень хочется, там окно можно найти и даже нажать кнопку «Нет».

Нет, код исполняется без исключений

Ну в теории не должно ругаться если ты в доке ничо не менял (типа букву в ячейке добавил). Ну чтобы на точняк, погугли на msdn там или используешь метод Close у WorkSheet или Эксель.Application.Quit (или просто Эксель.Quit). Нули как разтаки определяют закрытие документа или приложения без лишних проверок. Я конеш хз у себя сразу писал с нулями, а вот помню когда один из первых разов таким образом с Word работал, то он у меня с исключением вылетал (я имею ввиду на сервере)

УУУ. В сказку попал человек. Обратись ко мне. Есть решение. Я уже все грабли протоптал с этим делом. Есть у нас решение. Можешь даже не парится. У нас компонента чтения эксель, нативная. Работает во всех режимах серверных на любых осях.

Гарантируем поддержку. Да и собственно задачу импорта решена целой подсистемой.

спасибо, попробую, сейчас пока некогда

Есть где почитать о решении?

Лови Будут вопросы — там есть мой скайп

Сделал вот так и все нормально стало:

Объясните про эти папки. Не понял :)

Когда приложение оффиса (Word, Exel) запускается от сервиса винды, коем в частности является служба 1С сервера, то для временных файлов используются данные каталоги взавизимости от разрядности оффиса.

а зачем Эксель.DisplayAlerts = 1? это свойство вообще задавай после создания кома

Если его не поставить, то в следующий раз, когда Excel откроется, сообщения не будут появляться.

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

Like this post? Please share to your friends:
  • Производитель microsoft office word
  • Произошла исключительная ситуация microsoft excel не удалось получить доступ к файлу
  • Произведите фильтрацию в excel
  • Произошла исключительная ситуация microsoft excel не удается открыть файл
  • Произведите расчет заработной платы в excel