Часто программисты сталкиваются с ситуацией, когда код, использующий COM-объекты (например, для формирования документов Word или Excel), прекрасно работает в файловом варианте или на клиенте, но выдает «Неопознанную ошибку» (код -2147467259(0x80004005)) при выполнении на сервере. Давайте подробно разберем, почему это происходит, и рассмотрим пошаговые инструкции по решению этой проблемы.
Основная причина заключается в том, что серверный процесс 1С (обычно запущенный от имени пользователя USR1CV8) работает в неинтерактивной сессии. Программы пакета Microsoft Office (Word, Excel) изначально создавались для работы в пользовательском интерфейсе. При попытке программного запуска на сервере они пытаются инициализировать окружение рабочего стола, которого в «нулевой» сессии сервера просто не существует. Если операционная система не находит определенных путей к папкам профиля, COM-сервер завершает работу аварийно.
Как показывает практика и опыт участников обсуждения, самым эффективным «быстрым» решением является создание папок Desktop в профилях системной службы. Это необходимо, чтобы MS Office мог инициализироваться корректно.
Проанализируем шаги, которые нужно выполнить на сервере:
Desktop.Desktop.USR1CV8), есть права «Полный доступ» на эти созданные папки.Это решение помогает в 90% случаев, когда возникает неопознанная ошибка Windows при вызове ПолучитьCOMОбъект.
Если создание папок не помогло, нам необходимо проверить права доступа к конкретному COM-приложению через системную оснастку. Рассмотрим этот процесс подробнее:
Win + R, введите dcomcnfg и нажмите Enter.USR1CV8 с полными правами.Также полезно добавить пользователя 1С в системную группу «Пользователи DCOM» через управление компьютером.
Проанализируем программный код. В управляемом приложении работа с COM-объектами в контексте формы невозможна. Весь код должен быть вынесен в серверный модуль.
Посмотрим на пример правильной организации кода для работы с шаблоном Word на сервере:
&НаСервере
Функция СформироватьДокументНаСервере(ДанныеДляЗаполнения)
// Получаем имя временного файла
ПутьКФайлу = ПолучитьИмяВременногоФайла("doc");
// Извлекаем макет из конфигурации
Макет = Документы.ИсходящиеПисьма.ПолучитьМакет("ШаблонПисьма");
Макет.Записать(ПутьКФайлу);
Попытка
// Используем Новый COMОбъект вместо ПолучитьCOMОбъект для большей стабильности
WordApp = Новый COMОбъект("Word.Application");
WordApp.Visible = Ложь;
WordApp.DisplayAlerts = 0;
Документ = WordApp.Documents.Open(ПутьКФайлу);
Исключение
Сообщить("Ошибка инициализации Word: " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
// Работа с документом
Замена = Документ.Content.Find;
Замена.Execute("[Дата]", Ложь, Истина, Ложь, , , Истина, , Ложь, Формат(ТекущаяДата(), "ДЛФ=D"));
Документ.Save();
WordApp.Quit();
// Помещаем результат во временное хранилище для передачи на клиент
АдресРезультата = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ПутьКФайлу));
УдалитьФайлы(ПутьКФайлу);
Возврат АдресРезультата;
КонецФункции
Обратите внимание на использование WordApp.Quit(). Если этого не сделать, процессы WINWORD.EXE будут накапливаться в памяти сервера, что приведет к утечке лицензий 1С и зависанию системы.
Разберем ситуацию, когда после выполнения обработки пользователи не могут войти в систему. Это происходит потому, что зависший COM-объект удерживает сеанс 1С, а вместе с ним и лицензию. Чтобы избежать этого, всегда используйте конструкцию Попытка...Исключение.
Важно: Если в процессе записи или обработки файла произойдет ошибка, выполнение кода прервется до вызова команды закрытия приложения. В блоке Исключение обязательно нужно предусмотреть принудительное закрытие COM-объекта:
Попытка
// Основной код работы с COM
Исключение
Если WordApp <> Неопределено Тогда
WordApp.Quit();
WordApp = Неопределено;
КонецЕсли;
ВызватьИсключение; // Пробрасываем ошибку дальше
КонецПопытки;
Поскольку Microsoft официально не рекомендует использовать автоматизацию Office на стороне сервера, стоит рассмотреть альтернативные пути, которые работают стабильнее и быстрее:
ТабличныйДокумент. Он умеет читать и записывать файлы .xlsx напрямую, без установленного Excel на сервере..docx — это архив с XML-данными. Вы можете разархивировать его средствами 1С (ЧтениеZipФайла), программно заменить текст в document.xml и собрать обратно. Это работает молниеносно и не требует настройки прав DCOM.Подводя итог, отметим: если ваша бизнес-логика жестко завязана на COM, начните с создания папок Desktop в системных профилях и настройки прав доступа в dcomcnfg. Это решит большинство проблем с правами доступа и инициализацией приложений на сервере.