Настройка DCOM компоненты "Excel.Application" на 64-битном сервере приложений 1С

Описание настройки на 64-битном сервере приложений 1С, позволяющие создавать и использовать COMОбъект "Excel.Application" на сервере 1С.
Это поможет обработать большие файлы excel на сервере, в том числе через фоновые задания.
Все описанные действия родились по мотивам прочтения тысячи форумов и было опробовано сначала на разработческом сервере,  затем на боевом.
Поэтому решил выложить это сюда, наверняка спасет вам хотя бы 1 день жизни.
  1. Заходим на сервер приложений 1С под локальным админом
  2. Запускаем DCOMCNFG  (Консоль настроек «Component  Services»)
    1. Открываем ветку Console Root -> Component Services ->  Computers ->  My computer ->  DCOM Config
    2. Ищем «Microsoft Excel Application»
    3. Если нашли, то переходим к пункту 4 (Настраиваем свойства DCOM компонента «Microsoft Excel Application»)
    4. Закрываем «Component  Services»
  3. Настройка реестра
    1. Запускаем REGEDIT
    2. Открываем ветку ComputerHKEY_CLASSES_ROOTAppIDEXCEL.EXE, если ее нет, то создаем
    3. Создаем в ней строковый параметр AppID  = {00020812-0000-0000-C000-000000000046}
    4. Выполняем команду «mmc comexp.msc /32», которая делает то же что и DCOMCONFIG, но позволяет видеть  32 битные компоненты.
    5. После этого в Component Services должен появиться «Microsoft Excel Application»
  4. Настраиваем свойства DCOM компонента «Microsoft Excel Application»
    1. Закладка «Security»
      1. «Launch and Activation Permissions» — Customize — Edit
        1. Добавляем пользователя, под которым запускается  агент сервера 1С
        2. Назначем ему только следующие права  (allow):
          1. Local Launch
          2. Local Activation
      2. «Access  Permissions» — Customize — Edit
        1. Добавляем пользователя, под которым запускается  агент сервера 1С
        2. Назначаем ему только следующие права  (allow):
          1. Local Access
    2. Закладка «Identity»
      1. Должно быть выбрано «The launching user»
  5. Системные папки
    1. Папка «C:WindowsSysWOW64configsystemprofileDesktop»
      1. Проверяем наличие папки , если нет -то создаем.
      2. Заходим в свойства этой папки.
      3. Закладка Security
      4. Добавляем, если нет, пользователя, под которым запускается агент сервера 1С
      5. Добавляем право «Read» и «Write»
    2. Папка «C:WindowsSystem32configsystemprofileDesktop»
      1. Проверяем наличие папки , если нет -то создаем.
      2. Заходим в свойства этой папки.
      3. Закладка Security
      4. Добавляем, если нет, пользователя, под которым запускается агент сервера 1С
      5. Добавляем право «Read» и «Write»

PS: по просьбе yukon добавляю следующий дисклаймер:

Вопросы серверной автоматизации Office https://support.microsoft.com/kb/257757

Корпорация Microsoft на сегодняшний день не рекомендует производить и не поддерживает автоматизацию программ из пакета Microsoft Office с помощью автоматических, неинтерактивных клиентских приложений или компонентов (включая ASP, DCOM и службы NT), поскольку при запуске в этом окружении программы пакета Office могут работать нестабильно или зависать.
 

 

59 Comments

  1. yukon

    Обстоятельно разобрано. Но к такому тексту обязательно нужен дисклаймер:

    Вопросы серверной автоматизации Office

    https://support.microsoft.com/kb/257757

    Корпорация Microsoft на сегодняшний день не рекомендует производить и не поддерживает автоматизацию программ из пакета Microsoft Office с помощью автоматических, неинтерактивных клиентских приложений или компонентов (включая ASP, DCOM и службы NT), поскольку при запуске в этом окружении программы пакета Office могут работать нестабильно или зависать.
    Reply
  2. theshadowco

    (0)

    Это поможет обработать большие файлы excel на сервере, в том числе через фоновые задания.

    А почему не использовать ADO?

    Reply
  3. maxis33

    (1) yukon, хорошая статья, тоже приходилось эту информацию по крупицам собирать..

    Reply
  4. Yashazz

    (2) theshadowco, а не все такое знают. Проще, вишь, через com таскать, чем накатать нормальный запрос ADO, на большие-то объёмы…

    Reply
  5. Gureev

    (2) theshadowco, (4) Yashazz,

    может вы тогда сделаете статейку, как сформировать через ADO красиво оформленный Excel файл?

    Reply
  6. Sirruf

    (2) Что через ADO таскать? А если требуется например регламентное задание по формированию и рассылке отчетов в формате Excel ?

    Reply
  7. DoctorRoza

    (6) Sirruf, а что тут такого? создайте отчет и в коде его вызовите на заполнение! результат сохраните в ДвоичныеДанные. ВСЕ! И никакого COM’a не нужно, СКД отрабатывает!

    Reply
  8. jobkostya1c8

    Автору за то что поделились админскими «премудростями» большой плюс.

    Теперь сразу вопрос нарисовался. Как раз была настройка сервера 1С. Решили все-таки поставить офис. Началось все с ответа фирмы майкрософт по поводу «Excel.Application»:

    Корпорация Microsoft на сегодняшний день не рекомендует производить и не поддерживает автоматизацию программ из пакета Microsoft Office с помощью автоматических, неинтерактивных клиентских приложений или компонентов (включая ASP, DCOM и службы NT), поскольку при запуске в этом окружении программы пакета Office могут работать нестабильно или зависать.

    В чем преимущество в данном случае у технологии ADO кроме как не надо ставить офисный пакет на сервер?

    Чтоб не повторяться более подробно изложение начал здесь в комментариях статьи про SBS: Загрузка из EXCEL в 1С. Чтение файла XLSX средствами 1С. ЧтениеXML

    Прикрепляю саму обработку с методикой чтения ADO из БП 3.0. В принципе из любой конфы должна в ексель начинать читать. В целом про методику и чтоб понять ошибки при разных настройках серверов и локальных ПК. Хотелось поначалу сделать универсальной.

    Reply
  9. bzmax

    (6) Sirruf,

    Глупости! Рассылку отправлять в Ехеле, Ворде и других офисных форматах. Всегда найдется кто то, кто скажет что у него не открылось, или приложения нет.

    Я все авто рассылки из 1С делаю в HTML (начиная с 7.7, с 2000 года).

    И не дай бог! Какая нить зараза напишет что полученную рассылку открыть не смогли!

    🙂

    Reply
  10. dock
    Системные папки

    Папка «C:WindowsSysWOW64configsystemprofileDesktop»

    1. Проверяем наличие папки , если нет -то создаем.

    2. Заходим в свойства этой папки.

    3. Закладка Security

    4. Добавляем, если нет, пользователя, под которым запускается агент сервера 1С

    Вот тут мне напомнили, что пользователя USR1CV8 (при установке сервера, установщик 1С предлагает его создать) вы не сможете добавить в Security. Под этим пользователем невозможно зайти в систему, и, соответственно, нельзя назначить права доступа к папке.

    Выход — либо использовать настройку доступа «Все пользователи» (что не очень правильно), либо запускать Агента сервера под другим пользователем, отличным от USR1CV8.

    Reply
  11. vet7777

    (1) yukon, согласен с дисклаймером, видел его конечно же, добавлю

    Reply
  12. vet7777

    (2) theshadowco, потому что в моей задаче нужно было перезаписывать файлы для того, чтобы они потом открывались на мобильных устройствах, если стояла задача только читать, то не спорю — ADO было бы правильнее использовать.

    Reply
  13. vet7777

    (9) bzmax, требования диктует заказчик, а ему нужно именно в формате xlsx и чтобы открывалось на всех мобильных устройствах.

    Reply
  14. vet7777

    (10) dock, в моем случае как раз агент и запущен «под другим пользователем, отличным от USR1CV8»

    Reply
  15. bubnov-pi

    (13) Вижу явное противоречие в паре «именно в формате xlsx» и «чтобы открывалось на всех мобильных устройствах». У меня на двух из трёх мобильных устройств никакой xls/xlsx не откроется. На «третьем» устройстве откроется любой xls[x] с вероятностью близкой к 100% исключительно благодаря вручную установленному пакету, отсутствующему в штатной конфигурации. Да и на некоторых стационарных компах до сих пор можно встретить офис 2003, и да — без конвертера (из личного опыта — крупные производственные предприятия, работающие не первый десяток лет, часто таким парком «грешат»).

    Что-то заказчик, НЯМС, хочет как минимум странного, если не невозможного. Реально, html, с точки зрения совместимости — куда логичнее.

    Reply
  16. bzmax

    (13)

    И что??? В вашу задачу входит еще и на всех мобильных устройствах ставить читалку Екселя?

    Я бы убедил заказчика в универсальном формате.

    Reply
  17. vet7777

    (15) bubnov-pi, просто клиенты финансовой компании, которым рассылается отчетность, имеют установленный офис на своих девайсах. думаю теперь тперь понятно зачем такой формат нужен.

    Reply
  18. vet7777

    (16) bzmax, конечно же не входит )

    Reply
  19. dock

    (14) об этом в статье явно не указано. Или я не нашел данного указания.

    Reply
  20. jobkostya1c8

    Никто все-таки не сравнит функциональность ADO и Excel.Application по производительности и надежности чтения?

    Reply
  21. vet7777

    (20) kostyaomsk, без тестов по опыту могу сказать, что по скорости чтения победит ADO,

    по функциональности — excel.application.

    а что такое «надежность чтения»?

    Кстати, если отчетность в виде не одной плоской таблицы, а нескольких — то через ADO начинаются заморочки, потому что он видит один лист как единую таблицу. В моем случае, как раз такие отчеты.

    PS: Я вообще не очень понимаю зачем мы обсуждаем другие решения, я не спорю, что они есть

    Reply
  22. jobkostya1c8

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

    Reply
  23. jobkostya1c8

    (21) вот-вот. Про функциональность «Excel.Application» в чем она больше чем ADO? Только встроенными методами? При ADO можно же запрос делать и сразу отобрать из каких колонок что?

    Reply
  24. Diego_Iv

    Спасибо, статья очень помогла.

    Тоже рассылаем отчеты 1С руководству

    Reply
  25. Sirruf

    Возникла проблема при работе с excel.application на сервере. После сохранения файла слетают картинки (если изначально они там были). Может кто сталкивался с такой проблемой?

    Excel 2010

    Reply
  26. Sirruf

    (23) kostyaomsk, Ок, есть такой код:

    excel = Новый COMОбъект(«Excel.Application»);
    
    excel.DisplayAlerts = 0;
    excel.EnableEvents = 0;
    Книга = excel.WorkBooks.Open(ПутьКотчету);
    
    List = Книга.Sheets(1);
    List.columns(6).Delete(-4159);
    List.Cells(14,6).Select();
    excel.ActiveWindow.FreezePanes = 1;
    ВсегоКолонок = List.Cells(1,1).SpecialCells(11).Column;
    Для i=6 по ВсегоКолонок цикл
    List.columns(i).ColumnWidth = 100;
    List.columns(i).AutoFit();
    КонецЦикла;
    
    ВсегоСтрок = List.Cells(1,1).SpecialCells(11).Row;
    Для i=1 по ВсегоСтрок цикл
    
    
    List.rows(i).AutoFit();
    КонецЦикла;
    
    старт = List.columns(13);
    финиш = List.columns(ВсегоКолонок);
    List.Range(старт, финиш).Group();
    
    Книга.SaveAs(ПутьКотчету);
    excel.Application.Quit();

    Показать

    Как его реализовать через ADO?

    Reply
  27. ollega

    Твоя статья — моё спасение! СПАААААААААААААААСИБО!

    Reply
  28. Darkwoolf

    Здравствуйте. Такая проблема Система 64 битная сервер 1С 64 битный M.Excel 64 а вот сама 1С 32 битная пытался сделать внешнюю обработку для работы с Excel файлом выдавало ошибку. Пришел к тому что 1С 32 битный а Excel 64 битный. Нашел вашу тему. Проделал процедуру описаную выше. фаил начал открывать но повисает и висит часов 10 больше терпения у меня не хватало. подскажите что можно сделать.

    Reply
  29. Darkwoolf

    Все больше не актуально основная стать помогла!!! У меня еще была ошибка в обработке.

    Reply
  30. 4Shikari

    Спасибо. Статья помогла, четко и понятно, все взлетело с первого раза.

    Reply
  31. Bajo

    Что делать если не помогло?

    Reply
  32. dusha0020

    Все в одном флаконе. 3 дня мучил админов этой проблемой, а потом плюнул, нашел данную статью и все сам за час настроил. Спасибо автору!

    Reply
  33. ch1mera

    Спасибо! все заработало

    Reply
  34. kos

    просьба добавить еще одну ссылочку по теме в дисклаймер (важно для excel 2003-2010 при переинсталяциях)

    https://blogs.technet.microsoft.com/the_microsoft_excel_support_team_blog/2012/11/12/microso­ft-excel-or-microsoft-word-does-not-appear-in-dcom-configuration-snap-in/

    сенкс

    Reply
  35. kos

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

    (по теме «переустановка офиса 2003-2010)

    Траблы и решения описаны здесь:

    https://blogs.technet.microsoft.com/the_microsoft_excel_support_team_blog/2012/11/12/microso­ft-excel-or-microsoft-word-does-not-appear-in-dcom-configuration-snap-in/

    Reply
  36. RazorSky

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

    Reply
  37. donyab

    Сервер 1 запущен от имени доменного пользователя,

    Ему даны права локального админа, в dcom права ему прописаны, папки рабочих столов созданы, excel 64 битный поставлен и т.д. и т.п.

    в браузере формируется печатная форма excel (заполняется на стороне сервера)

    Все работает если открыта терминальная сессия на сервере 1с от пользователя сервера 1с (простите за тафтологию)

    Даже если ее залочить, но оставить открытым терминальное окно, продалжает все работать….

    Но достаточно закрыть окно терминальной сессии, не разлогиневаясь, т.е. сессия сохраняется ВСЕ, ексель работать перестает

    Код зависает на 2 строчке:

    а в процессах одиноко висит excel.exe

    Эксель = Новый COMОбъект(«Excel.Application»);
    Книга = Эксель.WorkBooks.Open(ПутьКФайлу);

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

    Кто нибудь с таким встречался?

    Reply
  38. Ольга_tmp

    Спасибо огромное!

    Reply
  39. duke55

    3 дня тщетно пытался решить подобную проблему….

    ….

    {ОбщийМодуль.МодульРегламентныхЗаданий.Модуль(886)}: Ошибка при вызове конструктора (COMОбъект)

    по причине:

    по причине:

    -2147221005(0x800401F3): Недопустимая строка с указанием класса

    ….

    И хоть мляха плачь. Само фоновое задание от 1С стартует и работает номально, а Эксель через COM-объект нифига не подцепляется. А заказчик условие поставил: «Вот шаблон Эксель, в него надо запихивать данные… И по ночам отсылать на почту…»

    Сам бы неосилил, просто «застрелил» бы компьютер…

    Автору спасибо… Помогло!!!

    Reply
  40. Anatolii Korol

    Большое спасибо автору!

    Reply
  41. FKLDOZ

    Коллеги, подскажите, пожалуйста!

    Бьюсь уже несколько дней!

    Пользователь USR1CV8, под которым стартует Агент не в списке доменных имен.Его создает 1С сервер при установке.

    Не могу настроить как пишет автор.

    Никак Excel не запустить через Com c сервера! Ругается на Excel = Новый COMОбъект(«Excel.Application»);

    Что делать?

    Reply
  42. ppalarm
    Закладка «Identity»

    Должно быть выбрано «The launching user»

    Пока на «The interactive user» не поменял не заработало. Возможно кому-то тоже пригодится.

    Reply
  43. ppalarm

    (41) Попробуй в DCOM выставить The interactive user для экселя.

    Reply
  44. FKLDOZ

    (43)

    Попробуй в DCOM выставить The interactive user для экселя.

    Это не поняла, поясните, пожалуйста!

    Reply
  45. FKLDOZ

    Николай, здравствуйте!

    Закладка «Identity»

    Должно быть выбрано «The launching user» — стоит выбран.

    Правда физ.сервер еще не перегружали. Может поэтому не работает?

    Reply
  46. solary

    Спасибо! Отличная статья! Все заработало с первого раза!

    Reply
  47. -vito-

    Внесу небольшое дополнение.

    Если пользователь, под которым работает процесс сервера, не входит в группу Администраторов, необходимо его включить в группу «Distributed COM Users». После добавления в группу потребуется перезапуск службы сервера 1С.

    Reply
  48. user742183

    После манипуляций описанных в статье Microsoft Excel Application в DCOM Config не появился. В чем может быть причина?

    Reply
  49. MaiorovYury

    Спасибо!

    Как раз то, что нужно было)

    Reply
  50. johnnyshut23

    Спасибо, хорошая статья)

    Reply
  51. Dimon2005

    Спасибо

    Reply
  52. VLRomanTim

    Хотел бы добавить, что аналогично можно сделать для Word, только в реестре добавляется ветка winword.exe AppID = {00020906-0000-0000-C000-000000000046}

    В DCOM Config Компонента называется DCOM «Документ Microsoft Word 97–2003» все остальное аналогично excel

    Reply
  53. nkp14108

    Переустанавливал сервер приложений 1с на новый физический сервер. Все проги установил как на старом, а доработка (которая на сервере открывает com Word и с ним работает зависает на WordApp.Documents.Add(ИмяВременногоФайлаOffice).

    Создал папки C:WindowsSysWOW64configsystemprofileDesktop и C:WindowsSystem32configsystemprofileDesktop — НЕ РАБОТЕТ!

    Сверил содержание 2 серверов и добавил ещё папку C:WindowsSystem32configsystemprofileAppDataLocalMicroso­ftWindowsINetCache и о чудо заработало!!!

    От каких-то пустых папок зависит работа системы, куда катится мир(Microsoft)!

    Reply
  54. user855208

    (42) Спасибо. Та же история

    Reply
  55. kuza_87

    Спасибо за статью. А как добавить объект Word подобным способом. Я так понимаю нужно тоже текстовый параметр ввести, а какой именно?

    Reply
  56. zfr475

    У меня в коде: (Регл. задание запускало модуль объекта обработки)

    Книга = Эксель.WorkBooks.Add();

    выскакивала ошибка:

    {Обработка.ВыгрузкаПрайсаВЕксель.МодульОбъекта(565)}: Ошибка при вызове метода контекста (Add)

    по причине:

    Произошла исключительная ситуация (Microsoft Office Excel): Microsoft Office Excel не может открыть или сохранить документы из-за нехватки памяти или места на диске.

    • Чтобы освободить память, закройте ненужные программы или книги.

    • Чтобы освободить место на диске, удалите с этого диска ненужные файлы.

    Вылечил:

    В пункте 4.2 установил «Текущий пользователь»

    Reply
  57. ISH-1988

    Дополню. Может поможет кому-нибудь.

    При переезде на новый сервер выскакивала ошибка «Неизвестная ошибка» при попытке открытия файла Excel через COM. При этом если перед открытием установить свойство Visible=1 и сразу снять (Visible=0), то все отрабатывало нормально.

    В powershell при выполнении аналогичного кода возникала следующая ошибка: «Ошибка на сервере. (Исключение из HRESULT: 0x80010105 (RPC_E_SERVERFAULT))»

    Проблема решилась отключение надстройки FoxitReader PDF Creator COM Add-in

    Reply
  58. SvetaBr

    Вот на что натолкнулась

    &НаСервере
    Процедура ВыгрузитьВExcel (КаталогКудаЧитаемФото,лВременныйФайлЗагрузки)
    
    Excel = Новый COMОбъект(«Excel.Application»);
    Книга = Excel.WorkBooks.Open(лВременныйФайлЗагрузки);
    ЛистГлавный = Книга.WorkSheets(1);
    СуществуетКаталог = НайтиФайлы(КаталогКудаЧитаемФото);
    НайденныеФайлы = НайтиФайлы(КаталогЗагрузкиФайлов, «*.*»);
    Если НайденныеФайлы.Количество() > 0 Тогда
    стр=1;
    Для каждого ТФайл Из НайденныеФайлы Цикл
    лФайл = Новый Файл(ТФайл.ПолноеИмя);
    Если лФайл.Существует() Тогда
    Верх = 1; // ЛистГлавный.Cells(стр, 1).Top;
    Лево = 1; // ЛистГлавный.Cells(стр, 1).Left;
    
    Верх = ЛистГлавный.Cells(стр, 1).Top;
    Лево = ЛистГлавный.Cells(стр, 1).Left;
    ЛистГлавный.Rows(стр).RowHeight = 109;
    ЛистГлавный.Columns(«A»).ColumnWidth = 24;
    
    
    ЛистГлавный.Shapes.AddPicture(лФайл.ПолноеИмя, Ложь, Истина, Лево+1, Верх+1, 100, 100);
    ЛистГлавный.Cells(стр, 3).Value = стр;
    
    
    КонецЕсли;
    стр=стр+1;
    КонецЦикла;
    КонецЕсли;
    Excel.ActiveWorkBook.Save();
    Excel.Quit();
    КонецПроцедуры
    
    

    Показать

    Если закоментировать строчку

    // ЛистГлавный.Shapes.AddPicture(лФайл.ПолноеИмя, Ложь, Истина, Лево+1, Верх+1, 100, 100);

    то все прекрасно работает, если снять комментарий , то зависает на этой строке.

    Все что в статье описано — на сервере давно реализовано, просто ранее не требовалось помещать фото в EXCEL

    как быть , что можно сделать?

    Reply
  59. filterhouse

    (58) Такая же проблема =(

    Может кто подскажет как можно обойти?

    Reply

Leave a Comment

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