Книга знаний |
|
1С:Предприятие / Объекты конфигурации / Отчеты |
|
Вместо конструкций [ФИОРуководителя] - просто выделяем цветом, то, что считаем параметрами поиска и
замены. Позволяет, в частности, из неизвестного документа вытащить список всех параметров замены. Заодно, разобраны варианты работы как через скрипты, так и через массивы COMSafeArray | Автор статьи: stran06 | Редакторы: Последняя редакция №2 от 23.02.14 | История URL: http://kb.mista.ru/article.php?id=929 |
&НаСервере
//Вытаскивает из Документа ОпенОфиса все выделенные (цветом фона, обводкой и пр.) куски текста в
СпискеЗначений
//Если ничего не найдено, то возвращает неопределено
//Альтернатива надоевшим конструкциям типа [ФИОРуководителя], которые нужно заменить на Василь
Василич Пупкин.
//Рекомендую в качестве шаблонов использовать конструкции типа ФИОРуководителя.Род (так, чтоб потом
можно было просклонять
Функция ПолучитьПараметрыИзШаблонаСервер()
//Документ ОпенОфиса лежит в реквизите с типом ХранилищеЗначения.
О=РеквизитФормыВЗначение("Объект");
ТемпИмя=ПолучитьИмяВременногоФайла("odt");
Макет = О.ШаблонДокумента.Получить();
Если Макет=Неопределено тогда
Сообщить("Нет шаблона");
Возврат (Неопределено);
КонецЕсли;
Макет.Записать(ТемпИмя);
// Открываем OpenOffic
ТемпИмяЮрл="file:///" + СтрЗаменить(ТемпИмя, "\", "/");
//Создаем объекты
Попытка
ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");
Исключение
Инф=ИнформацияОбОшибке();
Возврат(неопределено) // какая-то хрень :(
КонецПопытки;
////{=============Начало. Открываем файл odt создавая заполняя аргументы открытия через джаву
(массив с параметрами)
// scr = Новый ComОбъект("MSScriptControl.ScriptControl");
// scr.language = "javascript";
// scr.eval("Args=new Array()");
// Args = scr.eval("Args");
// scr.AddCode("function SetItem(ind,val){Args[ind]=val}");
// scr.AddObject("ServiceManager", ServiceManager);
// //{Начало. Добавляем эти строки, если хотим открыть как темплейт (каждое открытие, создается
новый файлик с именами
// //"БезИмени1, БезИмени2...)
// scr.eval("Args[0]=ServiceManager.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
// scr.eval("Args[0].Name='AsTemplate'");
// scr.eval("Args[0].Value=true");
// //}Конец. Добавляем эти строки, если хотим открыть как темплейт (каждое открытие, создается
новый файлик с именами
// //"БезИмени1, БезИмени2...)
////}=============Конец. Открываем файл odt создавая параметры открытия через джаву (массив с
параметрами)
//Более предпочтительный вариант, без использования сторонних объектов.
//=============Начало. Открываем файл odt создавая заполняя аргументы открытия через 1С (юзаем
COMSafeArray с параметрами)
Args = Новый COMSafeArray("VT_DISPATCH", 1);
//Начало. Добавляем эти строки, если хотим открыть как темплейт (каждое открытие, создается
новый файлик с именами
//"БезИмени1, БезИмени2...)
Param=ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
Param.Name = "AsTemplate";
Param.Value = True;
Args.SetValue(0,Param);
//Конец. Добавляем эти строки, если хотим открыть как темплейт (каждое открытие, создается
новый файлик с именами
//"БезИмени1, БезИмени2...)
//=============Конец. Открываем файл odt создавая заполняя аргументы открытия через 1С (юзаем
COMSafeArray с параметрами)
//Все готово, открываем док
ООДок = Desktop.LoadComponentFromURL(ТемпИмяЮрл, "_blank", 0, Args);
//Создаем объект поиска
Find = ООДок.CreateReplaceDescriptor();
//Что ищем, Если нужно просто найти все с определенными атрибутами символов, то пусто
//Если нужно найти ФИОРуководителя.Род, подчеркнутое Желтым, то ФИОРуководителя.Род
Find.SearchString="";
//САМОЕ ИНТЕРЕСНОЕ
//Заполняем атрибуты поиска (в морде поиска это Детали/Атрибуты), по сути, это атрибуты
символов,
//там стандартный тип VT_VARIANT
//Создаем массив с параметрами подходящего типа. Нам достаточно одного элемента
Ar=Новый COMSafeArray("VT_VARIANT",1);
//Вытаскиваем из объекта поиска (Find) тип параметров и заполняем
Par=Find.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
Par.Name = "CharBackColor";
Par.Value = 16777113;
//Устанавливаем значения массива
Ar.SetValue(0,Par);
//Устанавливаем атрибуты поиска
Find.SetSearchAttributes(Ar);
//Список других параметров символов
//CharBackColor - цвет фона. Если нет фона, то -1, для фона по умолчанию (желтый) 16777113
//CharBackTransparent - прозрачный фон. Он Истина для обычного текста, Ложь для выделенного
цветом. Увы, по нему, почему-то поиск не пашет
//CharShadowed - символы с тенью
//Можно еще мигающий текст, текст с обводкой, рельефный и т.д. Остальные варианты ищем у
Эндрю Питоньяк в пдф-ке.
//http://hghltd.yandex.net/yandbtm?
lang=ru&fmode=inject&tld=ru&text=openoffice%20CharBackTransparent&url=http%3A%2F%2Fwww.admin-
smolensk.ru%2F~websprav%2Ffreesoft%2Ffreesoft%2FOpenOffice.org%2520Macros%2520Explained.Master.pdf&n
oconv=1&l10n=ru&mime=pdf&sign=2c67b4ced57530cec3c5f989bd40557b&keyno=0
//там поиск "CharBackTransparent" и выбираем по вкусу
//Собственно сам поиск всех нужных параметров (у нас, всего подчеркнутого желтым
Рез = ООДОк.findAll(Find);
//Количество найденных -1 (чтоб не лезло в цикл, если ничего не нашли)
ВсегоНашли=Рез.getCount()-1;
//Цикл по результатам поиска (собираем в СЗ)
СЗ=Новый СписокЗначений;
Для Н=0 по ВсегоНашли Цикл
СЗ.Добавить(Рез.getByIndex(Н).String);
КонецЦикла;
//Тут имеем СЗ в которой есть все выделенные строчки из документа. Закругляемся.
Если СЗ.Количество()>0 тогда
Возврат(СЗ);
Иначе
Возврат(Неопределено);
КонецЕсли;
КонецФункции
Описание
| Рубрикатор
| Поиск
| ТелепатБот
| Захваченные статьи
| Установки
| Форум
|