При автоматизации формирования документов часто возникает ситуация, когда код, идеально работающий на клиенте, начинает выдавать ошибки при переносе на сторону сервера. Одной из самых коварных проблем является ошибка: «Произошла исключительная ситуация (Microsoft Word): Приложению Word не удалось прочитать документ. Возможно, он поврежден». При этом сам файл физически исправен и прекрасно открывается вручную. Рассмотрим подробно причины возникновения этой ситуации и разберем пошагово методы её решения.
Проанализируем типичный сценарий: сервер 1С запущен под системной учетной записью (Local System), и в модуле менеджера или общем модуле вызывается код для создания или открытия документа Word. Обычно это выглядит так:
WordApp = Новый COMОбъект("Word.Application");
Док = WordApp.Documents.Add(ИмяФайлаСПутем,,, истина);
// Или через метод Open
Док = WordApp.Documents.Open(ИмяФайлаСПутем,,, истина);
Несмотря на то, что файл существует и доступен, Word возвращает ошибку о повреждении. Главная причина кроется в том, что Microsoft Office — это клиентское приложение, которое при запуске в неинтерактивном режиме (как служба Windows) требует наличия определенных структур в профиле пользователя. Если служба работает под системной записью, у нее нет полноценного «рабочего стола», что блокирует инициализацию Word.
Как выяснилось в ходе обсуждения, наиболее эффективным решением является ручное создание папок Desktop в профилях системной службы. Это «обманывает» Word, предоставляя ему ожидаемую среду исполнения. Выполним следующие действия:
Desktop. Это необходимо для корректной работы 32-битных приложений на 64-битной операционной системе.Desktop. Это актуально для 64-битных версий Microsoft Office.USR1CV8 или SYSTEM).После создания этих директорий Word получает возможность инициализировать свои внутренние объекты, и ошибка «файл поврежден» обычно исчезает.
Если создание папок не помогло, проанализируем настройки службы DCOM. Часто сервер 1С не имеет прав на удаленную активацию или запуск COM-компонента от имени системной учетной записи. Настроим права доступа:
Win + R, введем dcomcnfg и нажмем Enter.Обратим внимание на различие методов Add и Open. Метод Add используется для создания нового документа на основе шаблона, а Open — для открытия существующего файла. Если ваша задача — просто открыть файл и сохранить его в другом формате (например, PDF), правильнее использовать Open. Посмотрим на пример корректного открытия:
Попытка
WordApp = Новый COMОбъект("Word.Application");
WordApp.Visible = Ложь;
WordApp.DisplayAlerts = 0; // Отключаем вывод предупреждений
// Используем Open для открытия существующего файла
Док = WordApp.Documents.Open(ИмяФайлаСПутем, Ложь, Истина); // FileName, ConfirmConversions, ReadOnly
// Выполняем экспорт в PDF (17 - это константа wdFormatPDF)
Док.SaveAs(ИмяФайлаПечатиPDF, 17);
Док.Close(0); // Закрываем без сохранения изменений
WordApp.Quit();
Исключение
// Обязательно закрываем процесс при ошибке
Если WordApp <> Неопределено Тогда
WordApp.Quit();
КонецЕсли;
ВызватьИсключение "Ошибка при работе с Word: " + ОписаниеОшибки();
КонецПопытки;
В процессе отладки на сервере часто скапливается множество процессов WINWORD.EXE. Это происходит потому, что при возникновении ошибки 1С прерывает выполнение кода, и команда WordApp.Quit() не успевает отработать. Выясним, как с этим бороться:
Всегда используйте конструкцию Попытка...Исключение. В блоке Исключение крайне важно явно завершить работу приложения и обнулить переменную. Если этого не делать, память сервера будет забита «фантомными» процессами Word, что в конечном итоге приведет к отказу в обслуживании новых запросов.
Word блокирует файлы, которые находятся в папках, не входящих в список «Надежных расположений». К таким папкам часто относится системная временная папка C:\Windows\Temp. Рассмотрим, как это исправить:
Вы можете переопределить путь к временным файлам для сервера 1С или добавить папку Temp в список доверенных в настройках Word (Центр управления безопасностью). Однако на сервере это сделать сложно, так как интерфейса у Word нет. Поэтому создание папок Desktop (Решение 1) является более универсальным способом, так как оно позволяет Word корректно инициализировать свои настройки безопасности.
Важно понимать, что Microsoft официально не рекомендует использовать Office через COM на стороне сервера (в неинтерактивных сессиях). Если ваша задача позволяет, проанализируйте возможность перехода на работу с форматом .docx напрямую. Документ .docx — это ZIP-архив с XML-вложениями. Существуют методы программного формирования таких файлов без установки Microsoft Word на сервер, что полностью исключает проблемы с правами доступа, «висящими» процессами и системными папками.
Тем не менее, если использование COM неизбежно, создание папок Desktop в профиле systemprofile остается «золотым стандартом» решения большинства ошибок инициализации Word на сервере 1С.