Работа с Excel в фоновом задании


Встала задача. По электронной почте приходят письма с вложениями таблиц Excel. Получение почты производится встроенным клиентом 1С фоновым заданием. Необходимо было по расписанию несколько раз в день извлекать из новых писем вложения и загружать из них данные. Тут я столкнулся с проблемой — работать с Excel в фоновом задании ни через COM, ни через ADO не удавалось. Вываливалась ошибка. Нигде в сети четкого решения проблемы я не обнаружил. В итоге, собирая информацию по крупицам из разных источников (порой и вовсе не связанных с 1с) и нескольких дней мучений все же я решил данную проблему. Ниже я опишу свое решение, чтобы помочь таким же, как я )

Начну свой рассказ.

Попытка подключиться к Excel через COM объект

ExcelApp = Новый COMОбъект("Excel.Application");

приводило к ошибке «Интерфейс не поддерживается».

Если использовать ADO

CтрокаСоединения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
ИмяФайла + ";Extended Properties=""Excel 8.0;HDR=NО;IMEX=1""";

СоединениеADO = Новый COMОбъект("ADODB.Connection");
СоединениеADO.ConnectionString = СтрокаСоединения;
СоединениеADO.Open();

то возникала ошибка «указанный поставщик не найден».

Сразу оговорюсь, что Microsoft Office на сервере был установлен и при обычном запуске обработки (не в фоновом задании) все проходило на ура.

Так как фоновые задания выполняются от имени пользователя, под которым работает сервер 1С:Предприятие (обычно это USR1CV82), то возникло логичное предположение, то у этого пользователя не достаточно прав. Для эксперимента этому пользователю были выданы права администратора и фоновое задание завершилось успешно. Однако, это был не вариант. Требовались минимально возможные права и я окунулся в мир поиска информации в глобальной сети.

Итак. Первое что удалось выяснить, это то, что пользователю USR1CV82 необходимо дать права на запуск DCOM Microsoft Excel Application (прошу прошения, могу путаться в понятиях, но смысл, что делать,  думаю, будет понятен).

Для этого необходимо:

1. Нажать кнопку Пуск и выбрать Панель управления.

2. Дважды щелкнуть значок Администрирование и выбрать пункт Службы компонентов.

3. В левой панели окна «Службы компонентов» дважды щелкнуть пункт Службы компонентов, дважды щелкнуть пункт Компьютеры и выбрать Мой компьютер.

4. Выбрать папку Настройка DCOM.

5. В окне сведений найти объект Microsoft Excel Application, щелкнуть его правой кнопкой и выбрать пункт Свойства (здесь есть подводный камень, с которым я довольно долго промучался — если сервер 64-х разрядный, то и выпуск Office так же должен быть х64, иначе объекта Microsoft Excel Application не будет в списке и права для него мне так и не удалось настроить пока не переустановил Office).

6. Открыть вкладку Безопасность.

7. В разделе Разрешения на запуск выбрать пункт Настроить и нажать кнопку Изменить.

8. Добавить пользователя USR1CV82.

Источник: http://technet.microsoft.com/ru-ru/library/cc778126(WS.10).aspx

Ниже поясняющие скриншоты.

 

Однако, после произведенных описанных выше настроек фоновое задание так и не заработало.

При работе с COM объектом экземляр Excel успешно создавался, но открыть файл не получалось

ExcelApp = Новый COMОбъект("Excel.Application");
ФайлExcel = ExcelApp.Workbooks.Open(ИмяФайла); // ОШИБКА!

выводилось сообщение об ошибке

Произошла исключительная ситуация (Microsoft Excel): Приложению Microsoft Excel не удается получить доступ к файлу «C:xls_test est.xls». Это может быть вызвано одной из следующих причин.

• Указан несуществующий файл или путь.
• Файл используется другой программой.
• Имя книги, которую вы пытаетесь сохранить, совпадает с именем другой книги, открытой в данный момент.

Попытки подключиться через ADO выдавало все тоже сообщение об отсутствии поставщика.

Поиски в просторах сети были продолжены и решение таки было найдено:

Необходимо создать папку

  • для Windows Server x64

    C:WindowsSysWOW64configsystemprofileDesktop
     

  • для Windows Server x86

    C:WindowsSystem32configsystemprofileDesktop

Данное расположение папок указано для Office 2007. Для Office 2010 не зависимо от разрядности платформы необходимо создавать папку C:WindowsSystem32configsystemprofileDesktop (данный факт так же потратил не мало моего времени). В общем, если создали папку, а ошибки не исчезли, создайте вторую. Так же необходимо дать права на созданную папку пользователю USR1CV82. Практика показала, что достаточно прав, выдаваемых системой по умолчанию.

Источник: http://social.msdn.microsoft.com/Forums/en-US/b81a3c4e-62db-488b-af06-44421818ef91/excel-2007-automation-on-top-of-a-windows-server-2008-x64

После проделанных всех настроек на тестовом сервере фоновое задание наконец то прошло успешно.

Однако на рабочем сервере при подключение к Excel через COM меня ждало фиаско — задание просто зависало и завершить его можно было только перезапуском сервера 1С:Предприятия. Зависало в момент открытия файла (ФайлExcel = ExcelApp.Workbooks.Open(ИмяФайла);). Я так предполагаю, что при открытии Excel открывает какое-нибудь окно и ждет ответа пользователя. Но проверить не удалось, так как доступа к рабочему серверу у меня не было и все настройки по моей просьбе на нем производил админ.

В итоге все взелетело с использованием ADO и успешно работает.

Надеюсь, данная статья поможет кому-нибудь съэкономить время при реализации подобных задач.

p.s. Ну и забыл упомянуть, что у пользователя USR1CV82, естественно, должны быть права на обрабатываемые файлы Excel.

59 Comments

  1. ltfriend

    (2) Eugeneer, это все не указано, потому что не имеет значения. работа с фоновыми заданиями не отличается ни от версии платформы, ни от конкретной конфигурации, ни от того, как работают пользователи.

    Reply
  2. ltfriend

    (4) Eugeneer, статья не о том, как читать / записывать данные в Excel (об этом и так не мало написано), а о том, что бы работать с Excel в фоновом задании необходимы дополнительные настройки системы. И какие именно тут и описано. И именно об этом и написано в анонсе. Если вам не понятно/не интересно/не нужно — ставьте свой минус и проходите мимо.

    Reply
  3. Pavel777777

    Спасибо, что докопались до решения и поделились) .. была такая же проблема (но я отложил поиск решения «на потом») … мне помогло «для Windows Server x64 — C:WindowsSysWOW64configsystemprofileDesktop» .

    Также добавил бы в копилку решений подобных проблем:

    1) иногда в такой работе с эксель возникает ошибка при обращении к параметрам страницы (через PageSetup) = такое бывает, если не установлен «принтер по умолчанию» … например, на новом сервере

    2) иногда в такой работе с эксель возникает ошибка, когда используется открытие файла Open … = бывает, что при первом запуске Эксель просит ввести Инициалы , если не произвести запуск Экселя интерактивно и не подтвердить инициалы, то будет возникать ошибка

    Reply
  4. mehalyna

    Спасибо за совет. Давно искала решение подобной задачи. Теперь обязательно воспользуюсь. Еще раз спасибо!

    Reply
  5. lm7777

    Спасибо, помогло создание папки C:WindowsSysWOW64configsystemprofileDesktop. С DCOM вроде все понятно, но вот создание папки немного напрягает своей нелогичностью. Если есть более подробная информация зачем это надо, буду рад ознакомится, осталось чувство незавершенности поставленной задачи.

    Reply
  6. ltfriend

    (8) lm7777, решение с папкой было найдено здесь

    http://social.msdn.microsoft.com/Forums/en-US/b81a3c4e-62db-488b-af06-44421818ef91/excel-2007-automation-on-top-of-a-windows-server-2008-x64

    к сожалению, более подробной информации дать не могу (

    Reply
  7. lm7777

    (9) спасибо. Ссылку видел, но то ли с английским плохо, то ли лыжи не едут… В общем в сути вопроса так и не разобрался. Оставлю в не решенных, так как в данный момент высокая загрузка на проектах. Когда-нибудь надеюсь до разберусь. Еще раз спасибо.

    Reply
  8. lm7777

    Да кстати Office 2013

    Reply
  9. kiruha

    А зачем

    ExcelApp = Новый COMОбъект(«Excel.Application»);ФайлExcel = ExcelApp.Workbooks.Open(ИмяФайла); // ОШИБКА!

    а не

    Excel= ПолучитьCOMОбъект(ИмяФайла)
    Reply
  10. siddy
    здесь есть подводный камень, с которым я довольно долго промучался — если сервер 64-х разрядный, то и выпуск Office так же должен быть х64, иначе объекта Microsoft Excel Application не будет в списке и права для него мне так и не удалось настроить пока не переустановил Office

    может быть дело в том, что по умолчанию отображаются только компоненты 64?

    тогда можно так:

    mmc -32

    Файл, Добавить удалить оснастку, Службы компонентов

    Reply
  11. capitan

    Если основательно погуглить — найдется способ поставить 32-х разрядный офис на 64-х разрядный сервер.

    Reply
  12. manaxov83

    Респект ТЕБЕ, мои трех дневные танцы с бубном закончены))))

    Reply
  13. ltfriend

    (16) A.Golub, а как вы вызовете эту строку на стороне клиента, когда код выполняется на сервере? Например, в фоновом задании.

    Reply
  14. DikSer

    Товарищи этакая проблема, у меня файл непонятного формата, открывается екселем с руганью что файл не установленного формата, но табличка загружается, а вот ком и АДО не хотят этот файл открывать… Файл открыл текстовым редактором походу xml файлик. Возможно ли такой псевдо xls открыть через ком или адо как таблицу ексель?

    Reply
  15. jobkostya1c8

    Интересная статья.

    Reply
  16. 3abxo3

    Автору огромное спасибо! Решение с папкой C:WindowsSysWOW64configsystemprofileDesktop помогло. Всю голову сломал, пока не прочитал статью.

    Reply
  17. VVi3ard

    (2) Eugeneer, не подскажите компоненту Native API для работы?

    Автору спасибо, все так как он и написал в интернете все что тут написано есть, но разбросано по сайтам, тут же готовая инструкция.

    По поводу:

    «Однако на рабочем сервере при подключение к Excel через COM меня ждало фиаско — задание просто зависало и завершить его можно было только перезапуском сервера 1С:Предприятия.»

    Дело в том что эксель показывает диалоговое окно и ждет реакции пользователя, а т.к. это окно не кто не видит то и реакции нет.

    Что бы избежать подобных моментов нужно:

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

    Эксель.Visible = Ложь;

    Эксель.DisplayAlerts=Ложь;

    Еще раз большое вам спасибо за статью и за отличное оформление со скриншотами.

    Reply
  18. Lapitskiy

    (21) VVi3ard, да к Eugeneer также присоединюсь, вопрос, Женя постоянно много высказывается, но ссылок нет.

    Евгений, ссылку на рабочую API NATIVE — в студию плиз.

    Reply
  19. Deda

    Автору благодарность! Помогло сэкономить много часов работы!

    Reply
  20. Deryni

    Спасибо большое за решение. Помогло создание папки как было описано для офиса 2010.

    Столкнулся с таким. Но как ни странно на одном сервере проблем никаких не было. Папка создалась сама.

    На другом — да.

    Разница в том, что на одном сервер 1С крутится под системной учётной записью NTAuthoritySystem, а на другом (где была проблема) — под доменным admin.

    На первом сервере ещё пришлось искать как установить под системной учётной записью принтер.

    Если кому надо — решение тут

    https://support.microsoft.com/ru-ru/kb/184291/en-us

    Экселю нужен принтер если хочется устанавливать параметры страницы в файле.

    Reply
  21. rom-x

    C пунктом 5 не соглашусь

    5. В окне сведений найти объект Microsoft Excel Application, щелкнуть его правой кнопкой и выбрать пункт Свойства (здесь есть подводный камень, с которым я довольно долго промучался — если сервер 64-х разрядный, то и выпуск Office так же должен быть х64, иначе объекта Microsoft Excel Application не будет в списке и права для него мне так и не удалось настроить пока не переустановил Office).

    Настройка реестра

    Запускаем REGEDIT

    Открываем ветку ComputerHKEY_CLASSES_ROOTAppIDEXCEL.EXE, если ее нет, то создаем

    Создаем в ней строковый параметр AppID = {00020812-0000-0000-C000-000000000046}

    Выполняем команду «mmc comexp.msc /32», которая делает то же что и DCOMCONFIG, но позволяет видеть 32 битные компоненты.

    После этого в Component Services должен появиться «Microsoft Excel Application»

    Reply
  22. blackjack666

    Большое спасибо. Боюсь представить, сколько бы времени я потратил без вашей публикации.

    Reply
  23. fire_ball

    Очень выручили. Спасибо, что докопались!

    Reply
  24. ssk148819881

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

    Reply
  25. oleg_tur

    Спасибо, что докопались до решения и поделились) .. была такая же проблема мне помогло «для Windows Server x64 — C:WindowsSysWOW64configsystemprofileDesktop» .

    Reply
  26. Захаров_Николай
    Я так предполагаю, что при открытии Excel открывает какое-нибудь окно и ждет ответа пользователя.

    Да это действительно так. Частично поможет

    Excel.DisplayAlerts = Ложь;
    Excel2.EnableEvents = Ложь;

    Но есть сообщения которые нужно один раз все же в пользовательском режиме подтвердить. Возможно есть какая-то настройка. Но я не нашел.

    Reply
  27. Skotarev

    Спасибо. Взлетело с использованием способа — создание папки C:WindowsSysWOW64configsystemprofileDesktop.

    Reply
  28. Dwarsha

    Спасибо огромное! 3 дня мучений, попыток обойти использование Экселя и созданий регламентных заданий, и наконец набрела на вашу статью.

    Всего.одна.долбаная.папка..

    Спасибо еще раз

    Reply
  29. Flares

    Супер Спасибо! У меня просто на сервере не работала загрузка, помогло:


    C:WindowsSysWOW64configsystemprofileDesktop
    Reply
  30. orsoft

    Спасибо!

    Для Office 2013 помогло.

    Но после исправления настроек «Службы компонентов…» и после создания Папок, мне пришлось перезагружать сервер, перезапус службы 1с не помог.

    Reply
  31. Hryuckinnen
    если сервер 64-х разрядный, то и выпуск Office так же должен быть х64, иначе объекта Microsoft Excel Application не будет в списке

    Команда mmc comexp.msc /32 вызывает ту же консоль для 32-разрядных компонентов, и Excel там будет.

    А за папку спасибо)

    Reply
  32. mikolamail

    Ничего из вышеперечисленного не помогло.

    Помогло:

    В настройках DCOM, в свойствах объект Microsoft Excel Application,

    на вкладке Удостоверение.

    Поменять запускающий пользователь на Текущий пользователь

    Reply
  33. Volfy

    (1) Eugeneer, Мир не знал как у тебя бомбило… и ты решил рассказать?)

    Reply
  34. sound

    Блин, реально помогло с папками. Спасибо.

    Reply
  35. Артано

    (37) Volfy, влепил минус. Странная реакция на резонное замечание. Я думаю мало кто будет рад, если его работа в которую вложены силы, время, деньги будет использоваться кем-то без его ведома. Ну и вообще, тут собрались профессионалы, которые решают задачи и делятся своим опытом, стиль общения должен соответствовать

    Reply
  36. Rustam_a

    После установки office 2016 при загрузке Excel возникали подобные ошибки

    Произошла исключительная ситуация (Microsoft Excel): Приложению Microsoft Excel не удается получить доступ к файлу «C:xls_test est.xls». Это может быть вызвано одной из следующих причин.

    • Указан несуществующий файл или путь.

    • Файл используется другой программой.

    • Имя книги, которую вы пытаетесь сохранить, совпадает с именем другой книги, открытой в данный момент.

    Решение с созданием папки помогло и сэкономило кучу времени. Спасибо большое за статью!

    Reply
  37. Boudybuilder

    (4) Eugeneer, полезная статья. Надоели Вы уже со своей критикой. Автор молодчара.

    Reply
  38. qazaz2

    Автору спасибо, папка помогла.

    Жаль только что последнее время гугль все успешнее заменяет мне моск(

    Reply
  39. xzorkiix

    Помогло. Столкнулись для Win2008 + excel2013. Спасибо! Магия с папками, моё почтение.

    свои пять копеек критики — из текста не сразу понятно помогает трюк с папками или нет.

    mkdir C:WindowsSysWOW64configsystemprofileDesktop &&
    mkdir C:WindowsSystem32configsystemprofileDesktop
    Reply
  40. Захаров_Николай

    (43)

    Этот трюк, с жесткой ссылкой всегда и везде помогает. (только обязательно с жесткой, а не символической).

    Reply
  41. MaxS

    Ещё замечено (у клиентов)), что нелицензионный офис на сервере может нормально работать в пользовательском режиме и в тоже время выдавать ошибки при попытке работать с файлом через com или ado.

    Reply
  42. Захаров_Николай

    (45) Может все-таки это от сборки зависит?

    Reply
  43. BushNik

    Помогло следующее. В службах компонентов:

    1. На вкладке Безопасность добавить права для пользователя от которого запускается Excel в Разрешения на запуск и активацию и в Разрешения на доступ.

    2. На вкладке Удостоверение поставить Текущий пользователь.

    Никаких папок desktop создавать не пришлось.

    Reply
  44. BushNik

    Магия какая-то, сегодня перестало работать. Начало выводить ошибку

    {ВнешняяОбработка.Обработка1.МодульОбъекта(3460)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft Excel): Не удалось найти «С:Файл.xlsx». Проверьте правильность ввода имени и расположения файла.

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

    В общем проблема была в том, что папка где лежит файл .xlsx была расшарена. Из-за этого не работало. Решил сохранением в не расшаренную папку и копированием потом в расрашенную.

    Reply
  45. Kennik

    Спасибо автору. Файл стал открываться.

    Reply
  46. Wrols

    Большое спасибо! Получилось!

    Reply
  47. AntonKulmetev

    Отлично!!! Все получилось! Работает! Спасибо большое!!!

    Команда mmc comexp.msc /32 и права USR1CV8 (локальный запуск и локальная активация)

    +

    Права USR1CV8 на изменение папки C:WindowsSysWOW64configsystemprofileDesktop

    Reply
  48. BoneD

    Спасибо!

    Решил проблему работы с Excel в отраслевой конфигурации Аренда недвижимости. Сервак х64, тонкий клиент х86. Ошибка при попытке открыть файл xls. Оказалось достаточно создать каталог «C:WindowsSysWOW64configsystemprofileDesktop» и всё заработало. Сервак 1С запускается под доменной учёткой, у него права админа даже есть.

    Reply
  49. Chebureck

    Автору огромное спасибо!

    Reply
  50. setrak

    Добрый день, друзья.

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

    Перепробовал все что написано, не помогло. сервер 1с и эесель 64 бита и т.п.

    В конце концов оказалась проблема в учетной записи. Настроил запуск DCOM от системной учетной записи, и все заработало.

    Reply
  51. Mopkobo4ka

    (47) спасибо огромное! Словами не описать как вы помогли мне!

    Создание папок не сработало. Только ваша рекомендация!

    Reply
  52. uri1978

    Автору спасибо! Здорово помогли.

    Reply
  53. tSirkul

    Докладываю: аналогичная проблема при коннекте к V83.Application



    Ошибка при вызове метода контекста (Connect)



    по причине:

    Произошла исключительная ситуация (1C:Enterprise 8.3.10.xxxx): Ошибка доступа к файлу ‘C:Windowssystem32configsystemprofile’. 183(0x000000B7): Невозможно создать файл, так как он уже существует.



    решилась в итоге явным указанием пользователя от которого системе следует запускать 1CV83 Application.

    Рекомендации из статьи были выполнены, но сами по себе, без указания пользователя, не помогли.

    Reply
  54. Xellsing

    Автору респект. Решение с папкой C:WindowsSysWOW64configsystemprofileDesktop помогло

    Reply
  55. maslyann

    Всё проделал, но не особо помогло.

    Появилась ошибка «недостаточно места».

    В итоге в Excel ещё настройки безопасности. Убрать галочки со всех пунктов на скрине.

    И все взлетело:)

    Reply
  56. eridy

    Супер ! Три дня бился пока на статью не вышел. Спасибо автору.

    Reply
  57. Serg O.

    После создания COM-объекта — надо отключить ВСЕ предупреждения :

    Excel.DisplayAlerts = 0; //29.07.2019

    и ещё, для Office 2016? — идёт проверка «валидности» файлов… надо включить FileValidation=1

    Excel.FileValidation = 1;

    источник: https://forum.infostart.ru/forum9/topic150921/ #16

    Reply
  58. Gendelf

    Проблема решилась в службе компонентов, но кроме разрешения на запуск добавьте ещё права на доступ. Нигде про это не пишут, но именно это мне и помогло.

    Reply
  59. Светлый ум

    +1 за ексель в фоновых

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *