При разработке внешних обработок в 1С:Зарплата и Управление Персоналом 3.1 программисты часто сталкиваются с необходимостью формирования документов в формате Microsoft Word. Если на локальном компьютере код работает исправно, то при переносе в справочник Дополнительные отчеты и обработки и запуске в клиент-серверном варианте (особенно в терминальном режиме или через тонкий клиент) возникают специфические ошибки COM-соединения. Рассмотрим подробно, как диагностировать и устранить эти проблемы.
Типичная ситуация: используется 32-битный толстый клиент 1С на 64-битной операционной системе Windows Server 2012 R2. При попытке инициализации объекта COMОбъект("Word.Application") в контексте &НаКлиенте, но в рамках сессии, запущенной через механизм дополнительных обработок, система выдает ошибки доступа или невозможность активации приложения. Это происходит из-за того, что процесс WINWORD.exe пытается запуститься от имени служебного пользователя 1С (например, USR1CV8), у которого отсутствуют необходимые права в подсистеме DCOM и не инициализирован профиль пользователя в Windows.
Эта ошибка чаще всего связана с отсутствием прав у пользователя, под которым работает служба 1С, на запуск и активацию COM-сервера Microsoft Word. Разберем шаги по настройке DCOM:
dcomcnfg).USR1CV8 (или того, под кем работает сервер 1С), предоставив ему полные права.Если объект создается, но на методе Activate() или Visible = Истина происходит сбой, это означает, что Word не может инициализировать графическое окно в неинтерактивной сессии или блокируется модальным окном. Проанализируем основные причины:
Создание системных папок Desktop. Microsoft Word требует наличия папки Desktop в профиле системного пользователя для корректной работы через COM, даже если вы не собираетесь ничего выводить на рабочий стол. Необходимо создать пустые папки по следующим путям:
C:\Windows\System32\config\systemprofile\DesktopC:\Windows\SysWOW64\config\systemprofile\Desktop (для 64-битных систем)Инициализация профиля пользователя. Служебный пользователь USR1CV8 по умолчанию не имеет полноценного интерактивного профиля. Чтобы устранить скрытые модальные окна (например, запрос инициалов при первом запуске или сообщение о восстановлении после сбоя), выполним следующие действия:
USR1CV8 временные права на локальный вход в систему.Выясним причину еще одной скрытой ошибки: «Не удается сохранить файл автозамены... Нет прав на изменение». Word при запуске пытается перезаписать файлы словарей в %AppData%\Microsoft\Office. Если у пользователя 1С нет прав на запись в эти каталоги, COM-объект будет «висеть» в ожидании ответа пользователя.
Проанализируем решение: Убедимся, что у пользователя, под которым запускается Word, есть полные права на папку его профиля в C:\Users\ИмяПользователя\AppData. Если папки AppData нет, вернитесь к пункту интерактивного входа под этой учетной записью.
Рассмотрим пример кода, который минимизирует риски возникновения ошибок при формировании документа. Обратите внимание на использование параметров видимости и состояния окна, что помогает «протолкнуть» процесс через возможные блокировки.
&НаКлиенте
Процедура СформироватьДокументWord(ИмяМакета)
// Получаем двоичные данные макета с сервера
ДанныеМакета = ПолучитьДанныеМакетаНаСервере(ИмяМакета);
Если ДанныеМакета = Неопределено Тогда
Возврат;
КонецЕсли;
ИмяФайла = ПолучитьИмяВременногоФайла("docx");
ДанныеМакета.Записать(ИмяФайла);
Попытка
MSWord = Новый COMОбъект("Word.Application");
Исключение
Сообщить("Ошибка при запуске MS Word: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Попытка
// Отключаем системные предупреждения самого Word
MSWord.Displayalerts = 0;
Документ = MSWord.Documents.Open(ИмяФайла);
MSWord.Visible = Истина;
// Полезный прием: программное переключение состояния окна
// помогает активировать приложение, если оно зависло в фоне
MSWord.WindowState = 2; // wdWindowStateMinimize
MSWord.WindowState = 1; // wdWindowStateMaximize
MSWord.Activate();
// Далее выполняем поиск и замену параметров в документе
// ...
Исключение
MSWord.Quit();
Сообщить("Произошла ошибка при обработке документа: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
&НаСервере
Функция ПолучитьДанныеМакетаНаСервере(ИмяМакета)
ОбъектОбработка = РеквизитФормыВЗначение("Объект");
Макет = ОбъектОбработка.ПолучитьМакет(ИмяМакета);
// Если макет хранится как двоичные данные в макете типа "Двоичные данные"
Возврат Макет;
КонецФункции
Разберем важный нюанс: Microsoft официально не рекомендует использовать Office в качестве COM-сервера на стороне сервера (в неинтерактивных сессиях). Если ваша задача позволяет, рассмотрите альтернативные варианты:
ФорматированныйДокумент или макеты типа MS Word, которые 1С может открывать встроенными средствами).Попытка...Исключение и обязательно закрывайте процессы (MSWord.Quit()) в случае ошибки, чтобы не плодить «зомби-процессы» WINWORD.exe в памяти сервера.Соблюдение этих правил и корректная настройка прав пользователя USR1CV8 позволят вам избежать большинства проблем с автоматизацией Microsoft Office в среде 1С.