В практике работы с современными конфигурациями, такими как 1С:ERP 2.4 или 1С:Комплексная автоматизация, программисты часто сталкиваются с проблемой: типовая печатная форма в формате Microsoft Word (например, «Коммерческое предложение») формируется крайне медленно. Время ожидания может достигать 5–7 минут, хотя данных в документе немного. При этом замер производительности часто указывает на строку получения объекта Selection или выполнение операций вставки текста.
В этой статье мы подробно разберем, почему это происходит, как настройки принтера влияют на скорость формирования документа и какие программные методы помогут ускорить процесс в десятки раз.
Основная причина кроется в архитектуре Microsoft Word. В отличие от текстовых редакторов, ориентированных на поток данных, Word является визуальным редактором (WYSIWYG). Как только 1С создает COM-объект Word.Application и начинает заполнять шаблон, Word пытается в реальном времени рассчитать макет страницы: где закончить одну страницу и начать другую, как перенести текст и где расположить таблицы.
Для этих расчетов Word критически необходимы метрики шрифтов и области печати, которые он запрашивает у драйвера принтера по умолчанию. Если принтер является сетевым, недоступен или драйвер работает некорректно, каждое обращение через COM-соединение вызывает «зависание» на время ожидания ответа от подсистемы печати Windows.
Как показывает практика и обсуждение на форумах, самым простым и эффективным решением без изменения программного кода является манипуляция с настройками принтера. Если печатная форма формируется на сервере или в терминальной сессии, выполним следующие шаги:
Print Spooler (Диспетчер печати) запущена и работает стабильно.После установки галочки «Печать в файл» время формирования документа обычно сокращается с нескольких минут до 15–20 секунд.
Если мы имеем возможность вносить изменения в код формирования печатной формы (или создаем свою обработку), мы можем применить ряд оптимизаций, которые «прикажут» Word не тратить ресурсы на лишние действия. Рассмотрим их подробнее.
Отключение обновления экрана и фоновой пагинации
Перед началом заполнения шаблона крайне полезно отключить визуальное обновление и автоматический пересчет страниц. Проанализируем пример кода:
// Создаем объект приложения
WordApp = Новый COMОбъект("Word.Application");
WordApp.Visible = Ложь; // Скрываем окно
// Отключаем обновление экрана для ускорения
WordApp.ScreenUpdating = Ложь;
// Отключаем фоновую пагинацию (пересчет страниц в фоне)
WordApp.Options.Pagination = Ложь;
// Здесь идет код заполнения шаблона...
// В конце обязательно включаем обратно
WordApp.ScreenUpdating = ТекущееЗначениеВидимости;
Отключение проверки правописания
Word по умолчанию проверяет орфографию и грамматику. При программной вставке множества технических терминов, артикулов и названий контрагентов, эта проверка создает колоссальную нагрузку. Отключим её:
WordApp.Options.CheckSpellingAsYouType = Ложь;
WordApp.Options.CheckGrammarAsYouType = Ложь;
В типовых решениях часто используется объект Selection (Выделение). Работа с ним имитирует действия пользователя: курсор прыгает по документу, выделяет текст, заменяет его. Это самый медленный способ работы с объектной моделью Word.
Разберем более эффективный подход — использование объекта Range (Диапазон). Range работает с содержимым документа напрямую в памяти, не перемещая визуальный курсор. Посмотрим на разницу:
Вместо медленного кода:
// Медленный поиск и замена через Selection
WordApp.Selection.Find.Execute("[НомерДокумента]", , , , , , , , , "№123", 2);
Используем работу с диапазонами:
// Быстрая работа через Range
Документ = WordApp.Documents.Open(ПутьКФайлу);
Диапазон = Документ.Content;
Диапазон.Find.Execute("[НомерДокумента]", , , , , , , , , "№123", 2);
Работа с Range не только ускоряет процесс, но и делает его более стабильным при работе в многопоточном режиме на сервере.
Иногда проблема кроется не в 1С или Word, а в операционной системе. Выясним, какие системные факторы могут влиять на скорость:
%TEMP%. Если в ней скопились десятки тысяч файлов, создание нового временного файла для шаблона может занимать значительное время. Рекомендуется регулярно очищать папки временных файлов профиля пользователя, под которым запускается сервер 1С.WINWORD.EXE при каждом обращении. Добавление процесса в исключения может дать ощутимый прирост производительности.Если «шаманство» с принтерами и оптимизация кода не дают нужного результата (или вам нужно формировать сотни документов в минуту), стоит рассмотреть переход на технологию Native работы с файлами .docx.
Файлы .docx по сути являются ZIP-архивами с набором XML-файлов. Современные версии 1С позволяют программно открывать этот архив и напрямую менять текст в XML-структуре. Этот метод:
Хотя этот метод требует переработки макетов, для высоконагруженных систем он является единственным надежным долгосрочным решением.
Подведем итог: Начните с самого простого — установки локального принтера и включения опции «Печать в файл». В 90% случаев это мгновенно решает проблему «зависания» печатных форм в ERP и других конфигурациях.