Многие разработчики и системные администраторы сталкиваются с ситуацией, когда типовая печатная форма, использующая шаблоны Microsoft Word, формируется крайне медленно на серверных операционных системах. В то время как на локальном компьютере процесс занимает секунды, на сервере (особенно в терминальном режиме) открытие документа может растягиваться на 5–10 минут. Проблема обычно локализуется на этапе обращения к свойствам Selection или Range через COMОбъект.
В этой статье мы подробно разберем причины возникновения таких задержек и рассмотрим комплекс мер — от простых программных "хитростей" до глубокой настройки системного окружения Windows Server.
Одним из самых эффективных и простых способов ускорения является кратковременное переключение видимости окна Word. Практика показывает, что на серверных ОС процесс winword.exe может искусственно замедлять выполнение команд, если он запущен в фоновом режиме. Видимо, это связано с механизмами приоритезации ресурсов в Windows Server.
Рассмотрим, как модифицировать код в общем модуле (например, в УправлениеПечатьюMSWordКлиент) или в модуле менеджера объекта:
// Создаем COM-объект
Попытка
WordПриложение = Новый COMОбъект("Word.Application");
Исключение
Возврат;
КонецПопытки;
// Хитрый прием для ускорения на сервере:
// Включаем видимость и тут же выключаем её
WordПриложение.Visible = Истина;
WordПриложение.Visible = Ложь;
Этот простой шаг заставляет систему перевести процесс в интерактивный контекст, что в некоторых случаях сокращает время формирования документа с нескольких минут до нескольких секунд. Проанализируем ситуацию: когда Visible = Истина, Word инициализирует графический интерфейс и переходит в другой режим обработки команд COM.
Для того чтобы 1С не тратила ресурсы на перерисовку документа при каждом заполнении параметра, необходимо использовать встроенные свойства объекта Application. Это критически важно при работе с большими документами или таблицами. Для изучения структуры заполнения таких документов подойдёт пример печатной формы Word с заполнением колонтитулов и таблицы.
Разберем по шагам правильную последовательность действий:
// Отключаем обновление экрана
WordПриложение.ScreenUpdating = Ложь;
// Подавляем алерты (0 - wdAlertsNone)
WordПриложение.DisplayAlerts = 0;
// ... Здесь идет ваш код заполнения шаблона ...
// Перед показом документа возвращаем всё назад
WordПриложение.ScreenUpdating = Истина;
// Включаем алерты ( -1 - wdAlertsAll)
WordПриложение.DisplayAlerts = -1;
WordПриложение.Visible = Истина;
Проанализируем глубокую системную причину, которая часто скрывается в архитектуре Windows x64. Компоненты MS Office, работая через COM от имени системной учетной записи или через терминальные сессии, часто ищут папку Desktop в системном профиле. Если этой папки нет, возникают огромные таймауты при попытках обращения к любому объекту внутри Word.
Важно: Это решение требует прав администратора на сервере. Вам необходимо вручную создать пустые папки по следующим путям:
C:\Windows\SysWOW64\config\systemprofile\DesktopC:\Windows\System32\config\systemprofile\DesktopПосле создания этих директорий (даже если они останутся пустыми), скорость инициализации COMОбъект("Word.Application") возрастает в несколько раз, так как системные вызовы перестают ожидать ответа от несуществующих путей.
Выясним еще одну неочевидную причину: MS Word — это программа, ориентированная на печать. При открытии любого документа он немедленно обращается к драйверу принтера по умолчанию, чтобы рассчитать разметку страниц, границы текста и пагинацию. Если на сервере принтером по умолчанию назначен недоступный сетевой принтер, Word будет "висеть" до тех пор, пока не истечет таймаут сетевого запроса.
Для решения этой проблемы выполним следующие действия:
Даже если окно Word скрыто (Visible = Ложь), приложение может пытаться в фоновом режиме проверять орфографию текста, который вы передаете из 1С. Если документ объемный, это создает колоссальную нагрузку на COM-интерфейс.
Рекомендуем программно отключать эти проверки в момент формирования документа:
WordПриложение.Options.CheckSpellingAsYouType = Ложь;
WordПриложение.Options.CheckGrammarAsYouType = Ложь;
WordПриложение.Options.BackgroundSave = Ложь;
Это позволит Word сосредоточиться только на вставке данных, игнорируя лингвистический анализ текста.
Интересное наблюдение от практикующих специалистов: если в системе уже открыт один экземпляр Word (даже пустой), создание нового COM-объекта и работа с ним происходят значительно быстрее. Вероятно, это связано с кэшированием библиотек в оперативной памяти.
Попробуйте рекомендовать пользователям держать свернутым одно окно Word перед началом массовой печати или реализуйте в коде логику, которая не закрывает процесс winword.exe полностью, если предполагается повторная печать в ближайшее время. Однако будьте осторожны: "зависшие" процессы Word могут со временем забить память сервера.
В современных версиях Microsoft Office (2013, 2016, 2019) включено аппаратное ускорение графики. На серверах, где нет мощной видеокарты, эта функция работает через программную эмуляцию, что приводит к заторможенности интерфейса (даже невидимого).
Проанализируем, как это отключить через реестр для всех пользователей сервера:
В ветке HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Common\Graphics (номер версии может отличаться) создайте параметр DisableHardwareAcceleration типа DWORD и установите значение 1.
Если ни один из вышеперечисленных методов не помог достичь желаемой скорости (например, при формировании сотен документов в цикле), рассмотрим вариант смены технологии. Работа через COM всегда будет медленнее, чем прямая работа с файлом.
Современные файлы .docx — это zip-архивы с xml-структурой внутри. 1С прекрасно умеет работать с zip и xml. Существуют готовые библиотеки и методики, позволяющие программно заменять теги в xml-файле документа без запуска самого Microsoft Word. Скорость формирования при таком подходе увеличивается в десятки раз, так как исключается тяжеловесный процесс инициализации офисного приложения.
Резюме: В большинстве случаев для исправления тормозов достаточно комбинации Метода 1 (переключение Visible) и Метода 3 (создание папок Desktop). Эти действия решают 90% проблем с производительностью Word на серверных ОС.