Как организовать работу с макетами MS Word в 1С 8.3 на управляемых формах

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

Переход с обычных форм 1С 8.1 на управляемые формы 1С 8.3 часто вызывает затруднения при работе с внешними приложениями через COM-соединение. Одной из классических задач является заполнение шаблонов MS Word данными из информационной базы. Рассмотрим подробно, с какими проблемами сталкиваются разработчики и как их правильно решать в современных реалиях платформы 1С.

Проблема контекста: Почему не работает ПолучитьМакет?

В старых версиях платформы (8.1, обычные формы) код часто писался в контексте объекта, где функция ПолучитьМакет была доступна напрямую. В управляемом приложении, работая в модуле формы, мы находимся в контексте формы, а не самого объекта (документа или справочника). Проанализируем типичную ошибку: "Процедура или функция с указанным именем не определена".

Для решения этой проблемы нам необходимо явно указать, откуда мы хотим получить макет. Если макет принадлежит объекту, основной реквизит которого редактируется в форме, мы должны сначала преобразовать данные формы в объект. Рассмотрим пример правильного обращения к макету на сервере:


&НаСервере
Функция ПолучитьМакетНаСервере(ИмяМакета)
    // Преобразуем данные формы в прикладной объект
    ОбъектМакета = РеквизитФормыВЗначение("Объект");
    // Теперь метод ПолучитьМакет доступен
    Возврат ОбъектМакета.ПолучитьМакет(ИмяМакета);
КонецФункции

Также важно помнить о существовании общих макетов. Если ваш шаблон Word зарегистрирован в ветке "Общие макеты" конфигурации, следует использовать метод ПолучитьОбщийМакет("ИмяМакета"), который доступен в глобальном контексте на сервере.

Разбор ошибки метода Получить() и работа с двоичными данными

Второй этап трудностей возникает при попытке вызвать метод Получить() у объекта, возвращенного макетом. В 1С 8.3 макеты типа "Active document" или двоичные данные ведут себя иначе, чем в старых версиях. Зачастую ПолучитьМакет возвращает объект типа ДвоичныеДанные. Попытка вызвать .Получить() напрямую приводит к ошибке выполнения.

Правильный алгоритм работы с Word в управляемых формах предполагает сохранение макета во временный файл. Разберем этот процесс по шагам:

  1. Извлекаем макет на сервере в виде двоичных данных.
  2. Сохраняем эти данные во временный файл на диске.
  3. Запускаем приложение Word через COM-объект и открываем созданный файл.
  4. Производим замену параметров в документе.

Посмотрим на программную реализацию этого подхода:


&НаСервере
Процедура СформироватьДокументНаСервере()
    // 1. Получаем макет
    ОбъектФормы = РеквизитФормыВЗначение("Объект");
    ШаблонДвоичныеДанные = ОбъектФормы.ПолучитьМакет("ЧастПредоплатаСчет");
    
    // 2. Формируем имя временного файла
    ИмяФайла = ПолучитьИмяВременногоФайла(".docx");
    ШаблонДвоичныеДанные.Записать(ИмяФайла);
    
    // 3. Инициализация COM-объекта (Word должен быть установлен на сервере!)
    Попытка
        ОбъектВорд = Новый COMОбъект("Word.Application");
    Исключение
        Сообщить("Не удалось запустить MS Word. Проверьте установку приложения.");
        Возврат;
    КонецПопытки;
    
    // 4. Открытие документа
    ДокументВорд = ОбъектВорд.Documents.Add(ИмяФайла);
    
    // 5. Поиск и замена текста
    Замена = ДокументВорд.Content.Find;
    Пока Замена.Execute("[Номер]", Ложь, Истина, Ложь, , , Истина, , Ложь, Объект.Номер) Цикл
        // Цикл продолжается, пока находятся вхождения
    КонецЦикла;
    
    // Делаем Word видимым для пользователя
    ОбъектВорд.Visible = Истина;
КонецПроцедуры

Важные особенности серверного выполнения

Рассмотрим критически важный аспект: где именно должен выполняться код работы с Word? Если вы используете &НаСервере, то Microsoft Word должен быть установлен на сервере 1С. Это несет в себе несколько рисков:

В случае работы под Windows-сервером часто возникает ошибка инициализации COM-объекта. Проанализируем технический нюанс: Word требует наличия папок Desktop в профиле системной учетной записи. Если вы столкнулись с "Отказом в доступе", попробуйте создать следующие директории:

Рекомендованная схема для управляемого приложения

Чтобы избежать нагрузки на сервер и проблем с установкой Office на серверную ОС, мы рекомендуем использовать следующую схему работы:

  1. На сервере получаем двоичные данные макета и помещаем их во Временное хранилище.
  2. Возвращаем адрес хранилища на клиент.
  3. На клиенте (где у пользователя точно установлен Word) извлекаем файл из хранилища методом ПолучитьФайлИзВременногоХранилища.
  4. Запускаем COM-объект Word локально на компьютере пользователя.

Такой подход делает систему более гибкой и отзывчивой для конечного пользователя. Выясним причину еще одной частой ошибки — ограничения метода Find.Execute. Помните, что строка замены в этом методе не может превышать 255 символов. Если вам нужно вставить длинный текст (например, текст договора), лучше использовать механизм закладок (Bookmarks) в Word.

В заключение отметим, что для современных конфигураций, использующих БСП (Библиотека стандартных подсистем), лучшим решением будет использование подсистемы "Печать". Она позволяет работать с форматами .docx напрямую через парсинг XML, что значительно быстрее и не требует наличия установленного Word для генерации документа.

← На главную