При работе с офисными приложениями из среды 1С:Предприятие часто возникает ситуация, когда на одном сервере печать документов работает безупречно, а на другом — аналогичный код вызывает критическую ошибку. Особенно часто это проявляется при использовании метода Получить() для макетов типа "Active Document". Рассмотрим ситуацию, когда на сервере с Office 2016 всё работает штатно, а на сервере с Office 2010 возникает ошибка при выполнении строки кода:
MSWord = Объект.ПолучитьМакет(ИмяМакета).Получить();
В этой статье мы подробно разберем причины такого поведения системы, проанализируем влияние разрядности приложений и выясним, какие настройки операционной системы и самого Microsoft Office необходимо выполнить для стабильной работы серверной печати.
Одной из наиболее вероятных причин сбоя является различие в разрядности (32 или 64 бита) между сервером 1С и установленным пакетом Microsoft Office. Проанализируем ситуацию: если серверная часть 1С работает как 64-битное приложение, а Microsoft Office 2010 установлен в 32-битной редакции, прямое взаимодействие через COM-объекты может быть затруднено или заблокировано политиками безопасности Windows.
Важно понимать: Office 2016 более адаптивен к работе в смешанных средах, в то время как Office 2010 требует строгого соответствия или специфических настроек прослоек COM+. Если есть возможность, наиболее простым решением будет установка Office той же разрядности, что и платформа 1С, либо обновление версии Office до 2016, как и было предложено в обсуждении.
Выясним неочевидную, но критически важную техническую деталь. Для инициализации COM-объектов Microsoft Office (особенно старых версий, таких как 2010) под учетной записью службы (например, от имени которой запущен ragent), в системе обязательно должны существовать папки Desktop. Без них Word просто не сможет создать временные файлы или инициализировать графический контекст, что приведет к ошибке при вызове метода Получить().
Рассмотрим алгоритм исправления этой проблемы. Нам необходимо вручную создать директории в системных профилях Windows:
C:\Windows\SysWOW64\config\systemprofile\DesktopC:\Windows\System32\config\systemprofile\DesktopЕсли создание папок не помогло, проанализируем настройки разрешений DCOM. Метод Получить() обращается к зарегистрированным в системе классам OLE/COM. Посмотрим, как настроить права доступа для компонента Microsoft Word:
dcomcnfg.Microsoft Office 2010 представил функцию "Защищенный просмотр" (Protected View), которая блокирует программное открытие файлов, если они кажутся системе подозрительными или расположены в сетевых папках. При вызове из кода 1С это блокирующее окно не отображается, и система просто "зависает" или выдает неочевидную ошибку доступа.
Посмотрим, как это отключить:
Метод Получить() применительно к макету типа 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.