При выгрузке или загрузке данных через COM-объект Excel.Application разработчики часто сталкиваются с ситуацией, когда строка кода ExcelПриложение = Новый COMОбъект("Excel.Application"); завершается с ошибкой. При этом в диспетчере задач сервера процесс excel.exe появляется не у текущего пользователя, а у другого разработчика или администратора, работающего на той же машине.
Рассмотрим подробно причины возникновения такой проблемы в многопользовательской серверной среде и разберем по шагам проверенные способы ее решения.
Проанализируем ситуацию, которая происходит на терминальном сервере под управлением Windows. Ошибка и некорректное распределение процессов вызываются следующими факторами:
excel.exe фоново запускается в чужой учетной записи.ExcelПриложение.Visible = Истина, процесс excel.exe остается «висеть» в памяти. При повторных попытках обращения он блокирует инициализацию новых объектов.&НаСервере). В этом случае объект пытается создаться от имени учетной записи службы «1С:Предприятие».Разберем первоочередные действия при возникновении сбоя. Если процесс ранее не завершился корректно, его необходимо снять из памяти сервера.
excel.exe и завершите их.Для предотвращения подобных ситуаций в коде 1С всегда используйте блок Попытка ... Исключение и гарантированно закрывайте приложение в секции очистки ресурсов:
&НаКлиенте
Процедура БезопаснаяРаботаСExcel()
ExcelПриложение = Неопределено;
Попытка
ExcelПриложение = Новый COMОбъект("Excel.Application");
ExcelПриложение.Visible = Ложь;
// Выполнение необходимых операций с файлом
ExcelПриложение.Quit();
ExcelПриложение = Неопределено;
Исключение
Если ExcelПриложение <> Неопределено Тогда
ExcelПриложение.Quit();
ExcelПриложение = Неопределено;
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Чтобы заставить операционную систему запускать Excel строго от имени того пользователя, который инициировал вызов из 1С, настроим службу DCOM на сервере.
dcomcnfg (если используется 32-битный Microsoft Office на 64-разрядной ОС Windows, запускайте консоль командой comexp.msc /32).После сохранения этих настроек процесс excel.exe будет формироваться строго под учетной записью того пользователя Windows, который выполнил запуск обработки в 1С.
Выясним, где именно должен создаваться COM-объект. Создание объектов Microsoft Office крайне не рекомендуется выполнять на стороне сервера 1С.
Убедитесь, что функция или процедура, вызывающая Новый COMОбъект("Excel.Application"), имеет директиву компиляции &НаКлиенте:
&НаКлиенте
Процедура ОткрытьФайлНаКлиенте()
#Если Клиент Тогда
ТаблицаExcel = Новый COMОбъект("Excel.Application");
// Работа с объектом на стороне клиента
#КонецЕсли
КонецПроцедуры
Если специфика задачи требует создания COM-объекта именно на стороне сервера (например, в фоновом задании), необходимо предусмотреть наличие папок профиля для системного окружения. Без них 64-разрядная ОС Windows блокирует запуск Excel в неинтерактивном режиме.
C:\Windows\System32\config\systemprofile\DesktopC:\Windows\SysWOW64\config\systemprofile\DesktopUSR1CV8).Поскольку автоматизация Microsoft Excel через COM имеет официальные ограничения от Microsoft и часто вызывает подвисание процессов на серверах, рассмотрим более надежные альтернативные решения.
1. Использование встроенного объекта «ТабличныйДокумент»
Платформа 1С позволяет читать и сохранять файлы форматов .xlsx и .xls штатными средствами. Этот способ не требует установки Excel на сервер или клиентский ПК и одинаково стабильно работает в любом контексте:
// Чтение файла XLSX без использования Excel
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать("C:\Files\Data.xlsx");
// Сохранение табличного документа в XLSX
ТабДок.Записать("C:\Files\Output.xlsx", ТипФайлаТабличногоДокумента.XLSX);
2. Использование технологии ADO / OLE DB
Если необходимо быстро прочитать данные из файла Excel большого объема, можно обращаться к нему как к базе данных через `ADODB.Connection`. Это работает значительно быстрее COM-автоматизации и не запускает процесс `excel.exe`.