Часто разработчики и системные администраторы сталкиваются с неприятной ситуацией: обработка для заполнения или чтения данных из *.xls, *.docx и других форматов прекрасно работает при ручном запуске на клиенте, но стоит перевести ее в регламентное задание, как процесс падает с ошибкой или бесконечно висит. Проблема часто возникает, когда выполняется экспорт печатных форм в изображения. Давайте подробно разберем, почему это происходит, и рассмотрим рабочие способы устранения данной проблемы.
Проанализируем классический фрагмент кода, который вызывает проблемы при выполнении в фоне:
WordObject = Новый COMОбъект("Word.Application");
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("DOC");
// Сохраняем макет или файл во временную директорию
ДвоичныеДанные.Записать(ИмяВременногоФайла);
// Попытка открыть файл
WordObject.Documents.Open(ИмяВременногоФайла);
// Обращение к открытому документу
Док = WordObject.Application.Documents(1);
При выполнении этого кода на сервере 1С (аналогичные трудности встречаются, когда используется выполнение запросов через COM-подключение) в журнале регистрации часто фиксируется ошибка: Ошибка при вызове метода контекста (Documents): Произошла исключительная ситуация (Microsoft Word): Запрашиваемый номер семейства не существует. Причина заключается в том, что метод Open фактически не срабатывает, коллекция Documents остается пустой (ее Count равен нулю), и обращение к первому элементу вызывает исключение.
Выясним причину такого поведения. Служба агента сервера 1С работает от имени системного пользователя (или специальной учетной записи), у которого нет полноценного профиля рабочего стола. При вызове COM-объекта Word приложение пытается обратиться к папке рабочего стола пользователя, и если ее нет — завершает операцию открытия файла с ошибкой.
Рассмотрим по шагам, как это исправить:
C:\Windows\System32\config\systemprofile\ и создайте внутри папку с именем Desktop.C:\Windows\SysWOW64\config\systemprofile\ и также создайте там папку Desktop.В 90% случаев одного этого действия достаточно, чтобы Word.Application начал успешно открывать файлы на сервере.
Если создание папок не помогло, проанализируем права пользователя. Служба 1С (часто это пользователь USR1CV8) должна иметь права на запуск DCOM-объектов.
dcomcnfg в поиске Windows).Иногда COM-объект создается без ошибок, но на методе Open процесс зависает намертво, не нагружая сервер. Посмотрим на причину: Word выводит скрытое диалоговое окно (например, окно активации, лицензионное соглашение, вопрос о восстановлении файлов или предупреждение безопасности). Так как фоновый процесс не имеет интерактивного рабочего стола, нажать кнопку в этом окне некому.
Разберем, как это исправить:
USR1CV8).Обязательно проверим еще два важных нюанса, которые часто упускают:
USR1CV8 локальный виртуальный принтер (например, Microsoft Print to PDF) в качестве принтера по умолчанию.ИмяВременногоФайла. Если путь содержит запрещенные символы (кавычки, лишние двоеточия), метод платформы ДвоичныеДанные.Записать() может сработать, а вот сам Word открыть такой файл откажется.Официальная позиция Microsoft гласит: автоматизация пакета Office на сервере в фоновых службах не поддерживается и не рекомендуется. Процесс может зависнуть после любого обновления Windows или Office.
Вместо COM-объектов рекомендуем использовать работу с форматом .docx как с ZIP-архивом. Современные документы Word (OpenXML) — это архив, внутри которого лежат XML-файлы. Платформа 1С отлично умеет распаковывать ZIP, находить нужный XML-файл (обычно word/document.xml), выполнять замену текста или параметров как строк, и запаковывать обратно. Такой подход работает мгновенно, не требует лицензии Office на сервере и никогда не зависает в регламентных заданиях!