Как через OLE/COM выделить и заменить текст в MS Word из 1С?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При программной работе с MS Word из среды 1С разработчики часто сталкиваются с необходимостью найти определенное слово в документе, выделить фрагмент текста (например, от найденного слова до начала абзаца) и заменить его новым значением. Однако при попытке перенести макрос VBA в код 1С возникает синтаксическая проблема: 1С не поддерживает синтаксис именованных аргументов (вида Unit:=wdParagraph) и встроенные константы Word.

В этой статье мы разберем, как правильно передавать параметры в методы объекта Selection и рассмотрим наиболее эффективные варианты замены текста в MS Word через OLE/COM.

Особенность вызова методов OLE в 1С

Главная причина ошибок при переносе макросов из Word VBA в 1С заключается в двух моментах:

  1. Отсутствие именованных параметров: В 1С все параметры методов COM-объектов передаются исключительно позиционно (через запятую). Попытка написать Unit:=1 приведет к синтаксической ошибке.
  2. Числовые значения констант: Встроенные в VBA константы вроде wdParagraph или wdExtend не видны в 1С. Вместо них нужно передавать соответствующие им целые числа. Например, константе wdParagraph соответствует число 4.

Решение 1. Выделение текста с использованием метода MoveUp

Если задача состоит именно в том, чтобы найти ключевое слово, включить режим выделения и выделить текст вверх до начала текущего абзаца, необходимо применить следующий подход:

  1. Активировать поиск слова через объект Selection.Find.
  2. Включить режим выделения ExtendMode = 1.
  3. Вызвать метод 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);
КонецЕсли;

Решение 2. Заполнение документов по меткам-шаблонам (Find.Execute)

Во многих практических задачах вместо сложного маневрирования выделением курсора гораздо надежнее использовать заранее расставленные в документе метки или параметры (например, [ПечНомерДоговора], [ПечПокупатель] и т.д.).

Метод 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 (заменить все найденные вхождения).

Рекомендации по выбору подходы

← На главную