Как правильно открывать и заполнять макеты типа ActiveDocument в клиент-серверном режиме 1С?

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

При разработке печатных форм в среде 1С:Предприятие 8 часто возникает необходимость использования шаблонов формата Microsoft Word (ActiveDocument). Однако при попытке вызвать метод Получить() для такого макета в клиент-серверном режиме работы, разработчики сталкиваются с ошибками. Давайте разберем, почему это происходит и как правильно организовать процесс формирования документов.

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

Метод Получить() у макета типа ActiveDocument предназначен для работы в толстом клиенте. В этом режиме 1С имеет прямой доступ к библиотекам COM (Component Object Model) на компьютере пользователя. Когда мы работаем в клиент-серверном режиме (или в тонком клиенте), серверное приложение или тонкий клиент не имеют доступа к визуальным компонентам Office, установленным на клиентском компьютере. Сервер — это отдельная среда, где нет установленного Word, а тонкий клиент сознательно изолирован от прямой работы с такими объектами из соображений безопасности и стабильности.

Решение: разделение логики на серверную и клиентскую части

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

Шаг 1: Подготовка данных на сервере

На сервере мы должны извлечь данные, которые хотим подставить в шаблон, и сохранить сам шаблон во временное хранилище. Сервер не должен пытаться открыть Word или редактировать его.


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

Шаг 2: Получение файла и работа через COM на клиенте

После того как сервер подготовил АдресФайла во временном хранилище, мы вызываем процедуру на клиенте, которая скачивает файл и выполняет заполнение через объект Word.Application.


&НаКлиенте
Процедура ПечатьКонвертаКонтрагенту(Команда)
    АдресФайла = ПолучитьМакетКонвертаНаСервере();
    
    Оповещение = Новый ОписаниеОповещения("ПослеПолученияФайловЗавершение", ЭтотОбъект);
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("doc");
    
    ПолучаемыеФайлы = Новый Массив;
    ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяВременногоФайла, АдресФайла));
    
    НачатьПолучениеФайлов(Оповещение, ПолучаемыеФайлы,, Ложь);
КонецПроцедуры

Шаг 3: Заполнение данных через закладки

Самый удобный способ подстановки данных в документ Word — использование закладок (Bookmarks). Это позволяет четко задать места, куда нужно вставить значения из 1С.


&НаКлиенте
Процедура ПослеПолученияФайловЗавершение(ПолученныеФайлы, ДополнительныеПараметры) Экспорт
    Описание = ПолученныеФайлы[0];
    
    // Создаем COM-объект Word на стороне клиента
    Word = Новый COMОбъект("Word.Application");
    Документ = Word.Documents.Add(Описание.Имя);
    
    // Заполняем закладки
    Если Документ.Bookmarks.Exists("Кому") Тогда
        Документ.Bookmarks("Кому").Select();
        Word.Selection.TypeText("Иванов И.И.");
    КонецЕсли;
    
    Word.Visible = Истина;
    // Очищаем временный файл
    УдалитьФайлы(Описание.Имя);
КонецПроцедуры

Важные рекомендации

  1. Наличие ПО: Помните, что для работы COMОбъект("Word.Application") на компьютере пользователя обязательно должен быть установлен полноценный Microsoft Word.
  2. Безопасность: При использовании COM-объектов всегда обертывайте код в блок Попытка...Исключение, чтобы в случае ошибки (например, если Word не установлен) программа не «вылетала».
  3. Работа с таблицами: Если в документе нужно заполнить таблицу, используйте коллекцию Tables. Вы можете обратиться к конкретной таблице через Документ.Tables(1) и перебирать её строки и ячейки для программной вставки данных.
  4. Альтернативы: Если вы хотите избежать зависимости от установленного Microsoft Word, рассмотрите переход на использование ТабличногоДокумента 1С с последующим сохранением в формат PDF или работу с библиотеками для прямой генерации формата OOXML (.docx), что позволит формировать файлы без запуска тяжелых COM-процессов.

Следуя этим шагам, вы сможете реализовать печать сложных документов Word в управляемом интерфейсе 1С, обеспечив стабильную работу системы даже в клиент-серверном варианте.

← На главную