При выполнении серверного кода 1С для работы с офисными документами разработчики нередко сталкиваются с ситуацией, когда инициализация или открытие файла через COM-объект Word.Application приводит к бесконечному зависанию процесса WINWORD.EXE. При этом аналогичный код для Excel.Application может успешно отрабатывать. Выясним причину такого поведения подсистемы COM и разберем по шагам все способы устранения проблемы.
Посмотрим на типовой пример кода, вызывающий зависание на стороне сервера:
&НаСервере
Процедура ОбновитьWordОтображение()
Word = Новый COMОбъект("Word.Application");
Word.Documents.Open("D:\документ.doc"); // Процесс WINWORD.EXE зависает на этой строке
КонецПроцедуры
Серверная служба 1С (ragent.exe) функционирует в неинтерактивной сессии Windows (Session 0). В отличие от интерактивного сеанса пользователя, здесь отсутствуют стандартный графический интерфейс, доступ к рабочему столу и привычные системные окружения. Зависание WINWORD.EXE вызывают следующие факторы:
Normal.dotm.Проанализируем разрядность операционной системы и сервера 1С. Для корректной инициализации COM-компонентов Office на 64-битной версии Windows необходимо вручную создать папки Desktop по обоим путям:
C:\Windows\System32\config\systemprofile\DesktopC:\Windows\SysWOW64\config\systemprofile\DesktopВажно: убедимся, что учетная запись, от имени которой запущена служба сервера 1С, имеет полные права доступа (Full Control) на созданные папки.
Разберем обязательное требование Word к наличию принтера:
WINWORD.EXE.Рассмотрим, как правильно инициализировать COM-объект в коде 1С, чтобы исключить вывод скрытых окон:
&НаСервере
Процедура СконвертироватьДокументWord(ПутьКФайлу, ПутьHTML)
Word = Новый COMОбъект("Word.Application");
// Отключаем отображение любых системных предупреждений и диалогов
Word.DisplayAlerts = 0;
Word.Visible = Ложь;
// Открываем документ без подтверждения конвертации и только для чтения
// Параметры метода Open: FileName, ConfirmConversions, ReadOnly, AddToRecentFiles
Документ = Word.Documents.Open(ПутьКФайлу, Ложь, Истина, Ложь);
// Сохраняем в формате HTML (формат wdFormatHTML = 8, wdFormatFilteredHTML = 10)
Документ.SaveAs(ПутьHTML, 8);
// Закрываем документ и приложение с освобождением памяти
Документ.Close(Ложь);
Word.Quit();
Word = Неопределено;
КонецПроцедуры
Если сервер 1С работает под 64-разрядным процессом, а пакет Office установлен 32-разрядный, либо приложению не хватает прав, выполним настройку через оснастку служб компонентов:
dcomcnfg (для 32-битного Office на x64 ОС используем mmc comexp.msc /32).Официальная позиция Microsoft не рекомендует использовать COM-автоматизацию пакета Office на стороне сервера из-за проблем с масштабируемостью и стабильностью. Рассмотрим надежные альтернативы для решения задачи предпросмотра или конвертации файлов в 1С:
.doc и .docx в форматы .html или .pdf можно выполнять вызовом утилиты командной строки через метод платформы ЗапуститьПриложение или КомандаСистемы.
Команда = "soffice --headless --convert-to html " + ПутьКФайлу + " --outdir " + КаталогВыгрузки;
ЗапуститьПриложение(Команда, , Истина);
ЧтениеZipФайла и ЧтениеXML можно извлекать текст и таблицы напрямую, полностью исключив зависимость от установленных офисных пакетов на сервере.