Как в 1С выполнить поиск и замену текста в документе OpenOffice Calc

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

При выгрузке печатных форм и отчетов во внешние шаблоны табличных процессоров OpenOffice или LibreOffice Calc часто возникает задача заменить специальные текстовые метки (например, <Итого> или <НомерДокумента>) на актуальные данные из базы 1С. В отличие от Microsoft Excel, где можно напрямую обратиться к методу Find диапазона ячеек, в OpenOffice используется объектная модель UNO API, работающая через специальные дескрипторы поиска и замены.

Разберем подробно, как реализовать замену данных как во всем документе, так и внутри конкретного именованного диапазона ячеек.

Способ 1. Замена текста во всем документе с помощью ReplaceDescriptor

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


// Открываем документ через UNO сервис Desktop
ТекстовыйПроцессор = Desktop.LoadComponentFromURL(ПреобразоватьВURL(ИмяФайла), "_blank", 0, Args); 

// Создаем дескриптор замены
Replace = ТекстовыйПроцессор.createReplaceDescriptor();

// Заменяем ключевые поля на нужные значения
Для Каждого Стр Из ТаблицаЗамен Цикл        
    Replace.SearchString  = Стр.Что;
    Replace.ReplaceString = Стр.Чем;        
    ТекстовыйПроцессор.replaceAll(Replace);
КонецЦикла;

Рассмотрим особенности этого механизма:

  1. Метод createReplaceDescriptor() создает специализированный объект, содержащий параметры поиска.
  2. Свойства SearchString и ReplaceString принимают исходную подстроку и текст для подстановки.
  3. Вызов replaceAll() производит пакетную замену всех вхождений в документе.

Способ 2. Замена текста внутри конкретного диапазона ячеек

Объект диапазона ячеек (CellRange), полученный через метод листа getCellRangeByName, также реализует интерфейс XReplaceable. Это позволяет вызывать дескриптор замены непосредственно для ограниченной области таблицы, не затрагивая остальные ячейки листа.

Посмотрим на пример заполнения области шапки или подвала отчета:


ШапкаОтчета = Sheet.getCellRangeByName("Шапка");

Дескриптор = ШапкаОтчета.createReplaceDescriptor();
Дескриптор.SearchString = "<Итого>";
Дескриптор.ReplaceString = Формат(Список.Итог("Сумма"), "ЧГ=0");

ШапкаОтчета.replaceAll(Дескриптор);

Способ 3. Поиск ячейки для установки числового значения (setValue)

Метод replaceAll всегда вставляет строковые данные (тип String). Если в ячейку необходимо передать число для последующего расчета по формулам Calc, строковая замена не подойдет, так как значение будет распознано табличным процессором как текст. В этом случае требуется найти нужную ячейку и записать в нее число через метод setValue.

Разберем по шагам, как выполнить точечный поиск и запись числового значения:


// Получаем диапазон
ШапкаОтчета = Sheet.getCellRangeByName("Подвал");

// Создаем дескриптор поиска
ДескрипторПоиска = ШапкаОтчета.createSearchDescriptor();
ДескрипторПоиска.SearchString = "<Итого>";

// Ищем первое вхождение ячейки с шаблоном
НайденнаяЯчейка = ШапкаОтчета.findFirst(ДескрипторПоиска);

Если НайденнаяЯчейка <> Неопределено Тогда
    НайденнаяЯчейка.setValue(Список.Итог("Сумма"));
КонецЕсли;

Дополнительные параметры дескрипторов поиска

Для более точного сопоставления шаблонов дескрипторы createSearchDescriptor и createReplaceDescriptor поддерживают настройку управляющих свойств:

  1. SearchWords = True — поиск ячейки по точному совпадению содержимого целиком, а не по частичному вхождению подстроки.
  2. SearchCaseSensitive = True — учет регистра символов при поиске.
  3. SearchRegularExpression = True — обработка строки поиска как регулярного выражения.

Важно: При работе через COM-соединение с OpenOffice (com.sun.star.ServiceManager) следует строго соблюдать регистр в названиях методов и свойств API (например, createReplaceDescriptor, findFirst, setValue).

← На главную