Работа с 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 не будет опубликован. Обязательные поля помечены *