При программной работе с MS Word из среды 1С разработчики часто сталкиваются с необходимостью найти определенное слово в документе, выделить фрагмент текста (например, от найденного слова до начала абзаца) и заменить его новым значением. Однако при попытке перенести макрос VBA в код 1С возникает синтаксическая проблема: 1С не поддерживает синтаксис именованных аргументов (вида Unit:=wdParagraph) и встроенные константы Word.
В этой статье мы разберем, как правильно передавать параметры в методы объекта Selection и рассмотрим наиболее эффективные варианты замены текста в MS Word через OLE/COM.
Главная причина ошибок при переносе макросов из Word VBA в 1С заключается в двух моментах:
Unit:=1 приведет к синтаксической ошибке.wdParagraph или wdExtend не видны в 1С. Вместо них нужно передавать соответствующие им целые числа. Например, константе wdParagraph соответствует число 4.Если задача состоит именно в том, чтобы найти ключевое слово, включить режим выделения и выделить текст вверх до начала текущего абзаца, необходимо применить следующий подход:
Selection.Find.ExtendMode = 1.MoveUp, передав ему числовой эквивалент единицы перемещения (4 для wdParagraph).Рассмотрим пример кода:
Word = СоздатьОбъект("Word.Application");
Word.Visible = 1; // Для работы с Selection документ должен быть видимым
Word.ActiveDocument.Select();
Word.Selection.Find.Text = "КлючевоеСлово";
Если Word.Selection.Find.Execute() <> 0 Тогда
// Включаем режим выделения
Word.Selection.ExtendMode = 1;
// Передаем значение 4 (wdParagraph) для выделения вверх до начала абзаца
Word.Selection.MoveUp(4);
// Теперь выделенный фрагмент можно заменить нужным текстом
Word.Selection.Text = "Новый текст для замены";
Иначе
Предупреждение("Искомое слово не найдено!", 2);
КонецЕсли;
Во многих практических задачах вместо сложного маневрирования выделением курсора гораздо надежнее использовать заранее расставленные в документе метки или параметры (например, [ПечНомерДоговора], [ПечПокупатель] и т.д.).
Метод Find.Execute позволяет заменить конкретный фрагмент текста на нужную строку во всем документе или в его отдельных частях (например, в колонтитулах) без включения видимости окна MS Word.
Разберем пример заполнения договора по шаблону:
мWord = СоздатьОбъект("Word.Application");
мWord.Visible = 0; // Документ формируется в фоновом режиме
мNewDoc = мWord.Documents;
мШаблон = "C:\Templates\Договор.dotx";
мДок = мNewDoc.Add(мШаблон, 0, 0, 1);
// 1. Замена параметров в верхнем колонтитуле
мКолонтитул = мДок.Sections.Item(1).Headers.Item(1).Range;
мКолонтитул.Find.Execute("[ПечНомерДоговора]", 0, 0, , , , , , , мНомерДоговора, 2);
мКолонтитул.Find.Execute("[ПечДатаДоговора]", 0, 0, , , , , , , СокрЛП(мДатаДоговора), 2);
// 2. Замена параметров в основном тексте документа
мОбъект = мДок.Content;
мОбъект.Find.Execute("[ПечНомерДоговора]", 0, 0, , , , , , , мНомерДоговора, 2);
мОбъект.Find.Execute("[ПечДатаДоговора]", 0, 0, , , , , , , СокрЛП(мДатаДоговора), 2);
мОбъект.Find.Execute("[ПечПокупатель]", 0, 0, , , , , , , СокрЛП(мПокупатель), 2);
мОбъект.Find.Execute("[ПечРуководитель]", 0, 0, , , , , , , мОтветственноеЛицо, 2);
мОбъект.Find.Execute("[ПечОснование]", 0, 0, , , , , , , СокрЛП(мОснование), 2);
мWord.Visible = 1; // Показываем готовый документ пользователю
Обратите внимание на значение 2 в последнем параметре метода Execute — оно соответствует константе wdReplaceAll (заменить все найденные вхождения).
Visible = 0), рекомендуется отказаться от интерактивного объекта Selection и работать через объекты Range или метод замены шаблонов Find.Execute.