Переход с обычных форм 1С 8.1 на управляемые формы 1С 8.3 часто вызывает затруднения при работе с внешними приложениями через COM-соединение. Одной из классических задач является заполнение шаблонов MS Word данными из информационной базы. Рассмотрим подробно, с какими проблемами сталкиваются разработчики и как их правильно решать в современных реалиях платформы 1С.
В старых версиях платформы (8.1, обычные формы) код часто писался в контексте объекта, где функция ПолучитьМакет была доступна напрямую. В управляемом приложении, работая в модуле формы, мы находимся в контексте формы, а не самого объекта (документа или справочника). Проанализируем типичную ошибку: "Процедура или функция с указанным именем не определена".
Для решения этой проблемы нам необходимо явно указать, откуда мы хотим получить макет. Если макет принадлежит объекту, основной реквизит которого редактируется в форме, мы должны сначала преобразовать данные формы в объект. Рассмотрим пример правильного обращения к макету на сервере:
&НаСервере
Функция ПолучитьМакетНаСервере(ИмяМакета)
// Преобразуем данные формы в прикладной объект
ОбъектМакета = РеквизитФормыВЗначение("Объект");
// Теперь метод ПолучитьМакет доступен
Возврат ОбъектМакета.ПолучитьМакет(ИмяМакета);
КонецФункции
Также важно помнить о существовании общих макетов. Если ваш шаблон Word зарегистрирован в ветке "Общие макеты" конфигурации, следует использовать метод ПолучитьОбщийМакет("ИмяМакета"), который доступен в глобальном контексте на сервере.
Второй этап трудностей возникает при попытке вызвать метод Получить() у объекта, возвращенного макетом. В 1С 8.3 макеты типа "Active document" или двоичные данные ведут себя иначе, чем в старых версиях. Зачастую ПолучитьМакет возвращает объект типа ДвоичныеДанные. Попытка вызвать .Получить() напрямую приводит к ошибке выполнения.
Правильный алгоритм работы с Word в управляемых формах предполагает сохранение макета во временный файл. Разберем этот процесс по шагам:
Посмотрим на программную реализацию этого подхода:
&НаСервере
Процедура СформироватьДокументНаСервере()
// 1. Получаем макет
ОбъектФормы = РеквизитФормыВЗначение("Объект");
ШаблонДвоичныеДанные = ОбъектФормы.ПолучитьМакет("ЧастПредоплатаСчет");
// 2. Формируем имя временного файла
ИмяФайла = ПолучитьИмяВременногоФайла(".docx");
ШаблонДвоичныеДанные.Записать(ИмяФайла);
// 3. Инициализация COM-объекта (Word должен быть установлен на сервере!)
Попытка
ОбъектВорд = Новый COMОбъект("Word.Application");
Исключение
Сообщить("Не удалось запустить MS Word. Проверьте установку приложения.");
Возврат;
КонецПопытки;
// 4. Открытие документа
ДокументВорд = ОбъектВорд.Documents.Add(ИмяФайла);
// 5. Поиск и замена текста
Замена = ДокументВорд.Content.Find;
Пока Замена.Execute("[Номер]", Ложь, Истина, Ложь, , , Истина, , Ложь, Объект.Номер) Цикл
// Цикл продолжается, пока находятся вхождения
КонецЦикла;
// Делаем Word видимым для пользователя
ОбъектВорд.Visible = Истина;
КонецПроцедуры
Рассмотрим критически важный аспект: где именно должен выполняться код работы с Word? Если вы используете &НаСервере, то Microsoft Word должен быть установлен на сервере 1С. Это несет в себе несколько рисков:
COMОбъект невозможно.В случае работы под Windows-сервером часто возникает ошибка инициализации COM-объекта. Проанализируем технический нюанс: Word требует наличия папок Desktop в профиле системной учетной записи. Если вы столкнулись с "Отказом в доступе", попробуйте создать следующие директории:
C:\Windows\SysWOW64\config\systemprofile\DesktopC:\Windows\System32\config\systemprofile\DesktopЧтобы избежать нагрузки на сервер и проблем с установкой Office на серверную ОС, мы рекомендуем использовать следующую схему работы:
ПолучитьФайлИзВременногоХранилища.Такой подход делает систему более гибкой и отзывчивой для конечного пользователя. Выясним причину еще одной частой ошибки — ограничения метода Find.Execute. Помните, что строка замены в этом методе не может превышать 255 символов. Если вам нужно вставить длинный текст (например, текст договора), лучше использовать механизм закладок (Bookmarks) в Word.
В заключение отметим, что для современных конфигураций, использующих БСП (Библиотека стандартных подсистем), лучшим решением будет использование подсистемы "Печать". Она позволяет работать с форматами .docx напрямую через парсинг XML, что значительно быстрее и не требует наличия установленного Word для генерации документа.