Почему возникает ошибка при получении макета Word в 1С и как её исправить?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При работе с офисными приложениями из среды 1С:Предприятие часто возникает ситуация, когда на одном сервере печать документов работает безупречно, а на другом — аналогичный код вызывает критическую ошибку. Особенно часто это проявляется при использовании метода Получить() для макетов типа "Active Document". Рассмотрим ситуацию, когда на сервере с Office 2016 всё работает штатно, а на сервере с Office 2010 возникает ошибка при выполнении строки кода:

MSWord = Объект.ПолучитьМакет(ИмяМакета).Получить();

В этой статье мы подробно разберем причины такого поведения системы, проанализируем влияние разрядности приложений и выясним, какие настройки операционной системы и самого Microsoft Office необходимо выполнить для стабильной работы серверной печати.

Разберем влияние разрядности приложений (Bitness)

Одной из наиболее вероятных причин сбоя является различие в разрядности (32 или 64 бита) между сервером 1С и установленным пакетом Microsoft Office. Проанализируем ситуацию: если серверная часть 1С работает как 64-битное приложение, а Microsoft Office 2010 установлен в 32-битной редакции, прямое взаимодействие через COM-объекты может быть затруднено или заблокировано политиками безопасности Windows.

Важно понимать: Office 2016 более адаптивен к работе в смешанных средах, в то время как Office 2010 требует строгого соответствия или специфических настроек прослоек COM+. Если есть возможность, наиболее простым решением будет установка Office той же разрядности, что и платформа 1С, либо обновление версии Office до 2016, как и было предложено в обсуждении.

Проблема отсутствующих папок Desktop в системном профиле

Выясним неочевидную, но критически важную техническую деталь. Для инициализации COM-объектов Microsoft Office (особенно старых версий, таких как 2010) под учетной записью службы (например, от имени которой запущен ragent), в системе обязательно должны существовать папки Desktop. Без них Word просто не сможет создать временные файлы или инициализировать графический контекст, что приведет к ошибке при вызове метода Получить().

Рассмотрим алгоритм исправления этой проблемы. Нам необходимо вручную создать директории в системных профилях Windows:

  1. Для 64-битных операционных систем, если используется 32-битный Office, создаем папку: C:\Windows\SysWOW64\config\systemprofile\Desktop
  2. Для обеспечения совместимости также создаем папку: C:\Windows\System32\config\systemprofile\Desktop
  3. Обязательное условие: пользователю, под которым запущена служба "Агент сервера 1С:Предприятие", необходимо назначить полные права доступа (Full Control) на эти созданные папки.

Настройка службы компонентов DCOM

Если создание папок не помогло, проанализируем настройки разрешений DCOM. Метод Получить() обращается к зарегистрированным в системе классам OLE/COM. Посмотрим, как настроить права доступа для компонента Microsoft Word:

  1. Запустим оснастку управления компонентами через команду dcomcnfg.
  2. Перейдем по пути: "Службы компонентов" — "Компьютеры" — "Мой компьютер" — "Настройка DCOM".
  3. Найдем в списке объект "Microsoft Word Document" (или его идентификатор в реестре).
  4. В свойствах на вкладке "Безопасность" убедимся, что для групп "Система", "Администраторы" и пользователя службы 1С установлены разрешения на "Запуск и активацию", а также на "Доступ".
  5. На вкладке "Удостоверение" (Identity) часто помогает смена значения с "Запускающий пользователь" на "Интерактивный пользователь". Однако помните, что это требует наличия активной сессии на сервере. В ином случае лучше жестко прописать данные административной учетной записи.

Отключение режима защищенного просмотра в Word 2010

Microsoft Office 2010 представил функцию "Защищенный просмотр" (Protected View), которая блокирует программное открытие файлов, если они кажутся системе подозрительными или расположены в сетевых папках. При вызове из кода 1С это блокирующее окно не отображается, и система просто "зависает" или выдает неочевидную ошибку доступа.

Посмотрим, как это отключить:

  1. Запустим Microsoft Word 2010 на проблемном сервере под учетной записью службы 1С (или временно под администратором).
  2. Перейдем в "Файл" — "Параметры" — "Центр управления безопасностью" — "Параметры центра управления безопасностью".
  3. В разделе "Защищенный просмотр" снимем все три галочки, разрешающие этот режим для файлов из интернета, небезопасных расположений и вложений Outlook.

Особенности метода Получить() и работа с Active Document

Метод Получить() применительно к макету типа ActiveDocument инициирует сложный процесс. Система пытается запустить Word как OLE-сервер "внутри" контейнера 1С. Если Office 2010 был установлен некорректно или обновлялся поверх старых версий, записи в реестре могут ссылаться на несуществующие библиотеки TypeLib.

Проанализируем пример кода, который позволяет выполнить безопасное подключение и обработку ошибок:


ИмяМакета = "МойМакетWord";
Попытка
    // Пытаемся получить объект макета
    МакетОбъект = ПолучитьМакет(ИмяМакета);
    // Инициализируем COM-соединение
    MSWord = МакетОбъект.Получить();
    MSWord.Application.Visible = Ложь; // Скрываем окно приложения
Исключение
    Сообщить("Не удалось запустить Microsoft Word на данном сервере.");
    Сообщить("Причина: " + ОписаниеОшибки());
    // Здесь можно реализовать альтернативную логику, например, формирование через OpenXML
КонецПопытки;

Альтернативные способы формирования документов

Если настройка старого Office 2010 на новом сервере заходит в тупик, рассмотрим возможность ухода от использования COM-объектов. Современным стандартом является формирование документов формата .docx через манипуляцию XML-структурой файла. Этот метод не требует установленного Microsoft Office на сервере вообще.

Основные преимущества такого подхода:

Подводя итог, можно сказать, что решение проблемы с Office 2010 в 1С чаще всего кроется в настройке прав доступа системных профилей и проверке разрядности. Однако в долгосрочной перспективе наиболее надежным решением остается обновление офисного пакета до версии 2016 или переход на технологии прямой генерации файлов без использования COM.

← На главную