При разработке печатных форм в среде 1С:Предприятие 8 часто возникает необходимость использования шаблонов формата Microsoft Word (ActiveDocument). Однако при попытке вызвать метод Получить() для такого макета в клиент-серверном режиме работы, разработчики сталкиваются с ошибками. Давайте разберем, почему это происходит и как правильно организовать процесс формирования документов.
Метод Получить() у макета типа ActiveDocument предназначен для работы в толстом клиенте. В этом режиме 1С имеет прямой доступ к библиотекам COM (Component Object Model) на компьютере пользователя. Когда мы работаем в клиент-серверном режиме (или в тонком клиенте), серверное приложение или тонкий клиент не имеют доступа к визуальным компонентам Office, установленным на клиентском компьютере. Сервер — это отдельная среда, где нет установленного Word, а тонкий клиент сознательно изолирован от прямой работы с такими объектами из соображений безопасности и стабильности.
Чтобы успешно работать с документами Word, необходимо разделить задачу на два этапа: подготовку данных на сервере и формирование файла на стороне клиента. Рассмотрим этот процесс по шагам.
На сервере мы должны извлечь данные, которые хотим подставить в шаблон, и сохранить сам шаблон во временное хранилище. Сервер не должен пытаться открыть Word или редактировать его.
&НаСервере
Функция ПолучитьМакетКонвертаНаСервере()
мОбъект = РеквизитФормыВЗначение("Объект");
Макет = мОбъект.ПолучитьМакет("ПочтовыйКонвертКонтрагенту");
// Сохраняем макет во временный файл для передачи на клиент
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("doc");
Макет.Записать(ИмяВременногоФайла);
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
АдресФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор);
УдалитьФайлы(ИмяВременногоФайла);
Возврат АдресФайла;
КонецФункции
После того как сервер подготовил АдресФайла во временном хранилище, мы вызываем процедуру на клиенте, которая скачивает файл и выполняет заполнение через объект Word.Application.
&НаКлиенте
Процедура ПечатьКонвертаКонтрагенту(Команда)
АдресФайла = ПолучитьМакетКонвертаНаСервере();
Оповещение = Новый ОписаниеОповещения("ПослеПолученияФайловЗавершение", ЭтотОбъект);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("doc");
ПолучаемыеФайлы = Новый Массив;
ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяВременногоФайла, АдресФайла));
НачатьПолучениеФайлов(Оповещение, ПолучаемыеФайлы,, Ложь);
КонецПроцедуры
Самый удобный способ подстановки данных в документ Word — использование закладок (Bookmarks). Это позволяет четко задать места, куда нужно вставить значения из 1С.
&НаКлиенте
Процедура ПослеПолученияФайловЗавершение(ПолученныеФайлы, ДополнительныеПараметры) Экспорт
Описание = ПолученныеФайлы[0];
// Создаем COM-объект Word на стороне клиента
Word = Новый COMОбъект("Word.Application");
Документ = Word.Documents.Add(Описание.Имя);
// Заполняем закладки
Если Документ.Bookmarks.Exists("Кому") Тогда
Документ.Bookmarks("Кому").Select();
Word.Selection.TypeText("Иванов И.И.");
КонецЕсли;
Word.Visible = Истина;
// Очищаем временный файл
УдалитьФайлы(Описание.Имя);
КонецПроцедуры
COMОбъект("Word.Application") на компьютере пользователя обязательно должен быть установлен полноценный Microsoft Word.Попытка...Исключение, чтобы в случае ошибки (например, если Word не установлен) программа не «вылетала».Tables. Вы можете обратиться к конкретной таблице через Документ.Tables(1) и перебирать её строки и ячейки для программной вставки данных.ТабличногоДокумента 1С с последующим сохранением в формат PDF или работу с библиотеками для прямой генерации формата OOXML (.docx), что позволит формировать файлы без запуска тяжелых COM-процессов.Следуя этим шагам, вы сможете реализовать печать сложных документов Word в управляемом интерфейсе 1С, обеспечив стабильную работу системы даже в клиент-серверном варианте.