Имя: Пароль:
1C
1С v8
1с и OpenOffice Writer
0 Nina2005
 
04.06.12
12:47
Мучаюсь с выводом на печать документа по шаблону в OpenOffice Writer. Есть закладка в OpenOffice Writer, как её получить программно в 1с и записать в неё определнную строку?
1 Кирпич
 
04.06.12
13:13
а я просто в тексте документа писал <<МояПеременная1>> и потом поиск-замена. без всяких закладок. может так сойдет?
2 smaharbA
 
04.06.12
13:15
курсор=док.каррентконтроллер.гетвьюкурсор();
курсор.готоранже(док.гетбукмаркс().гетбунаме(имя).гетанчор(),0);
док.геттекст().штыукесекинг(курсор,моястрока,0);
3 smaharbA
 
04.06.12
13:27
Так пойдет ?


Функция СоздатьОбъект(Стр="")
   Возврат Новый COMОбъект(Стр);
КонецФункции

//*******************************************
Функция ПолучитьОбертку()
   ХТМЛ = СоздатьОбъект("htmlfile");
   ХТМЛ.Open("text/html");
   //<-- Подготовим нужные методы
   ХТМЛ.Write("<script type='text/javascript'>
   |var ХТМЛ;
   |ПолучитьЗначение=function(x,y){return x.constructor == Array ? x[y] : x};
   |УстановитьЗначение=function(x,y,z){x[y]=z};
   |РазмерМассива=function(x){return x.length};
   |УстановитьБулево=function(x){x.Value=Boolean(x.Value)};
   |Массив=function(){return new Array()};
   |</script>");
   Док=ХТМЛ.documentElement.document;
   // Внедрение объекта Скрипта в самого себя, для сохранности контекста
   Док.script.ХТМЛ=ХТМЛ;
   // Все подготовке -->
   Возврат Док.script;
КонецФункции    // ПолучитьОбертку(Это)

Функция ОпенОфис(Файл="")
   Перем Параметр;
   Это=ПолучитьОбертку();
   //УРЛ="file:///"+Это.encodeURI(СтрЗаменить(Файл,"\","/"));
   СервисМанагер=СоздатьОбъект("com.sun.star.ServiceManager");
   Обновлялка=СервисМанагер.createInstance("com.sun.star.reflection.CoreReflection");
   Проводник=СервисМанагер.createInstance("com.sun.star.ucb.FileContentProvider");
   УРЛ=Проводник.getFileURLFromSystemPath("",Файл);
   Сообщить(УРЛ);
   Массив=Это.Массив(0);
   Параметр=Это.Массив(0);
   Для Сч=0 По 1 Цикл
       Обновлялка.forName("com.sun.star.beans.PropertyValue").createObject(Параметр);
       Это.УстановитьЗначение(Массив,Сч,Это.ПолучитьЗначение(Параметр,0));
   КонецЦикла;
   
   Параметр=Это.ПолучитьЗначение(Массив,0);
   Параметр.Name="Hidden";
   Параметр.Value=0; //Если 0 или любое пустое значение то Ложь, иначе Истина
   Это.УстановитьБулево(Параметр);
   
   Параметр=Это.ПолучитьЗначение(Массив,1);
   Параметр.Name="Password";
   Параметр.Value="123";

   Для Сч=0 По Это.РазмерМассива(Массив)-1 Цикл
       Сообщить(Это.ПолучитьЗначение(Массив,Сч).Name);
       Сообщить(Это.ПолучитьЗначение(Массив,Сч).Value);
   КонецЦикла;
   
   Десктоп = СервисМанагер.createInstance("com.sun.star.frame.Desktop");
   //Док = Десктоп.LoadComponentFromURL("private:factory/scalc", "_blank", 0, Массив );
   Док = Десктоп.LoadComponentFromURL(УРЛ, "_blank", 0, Массив );
   ИмяЗакладки="Закладка1";
   Текст=Док.getText();
   Контроллер=Док.CurrentController;
   Курсор=Контроллер.getViewCursor();
   Закладки=Док.getBookmarks();
   Попытка
       Закладка=Закладки.getByName(ИмяЗакладки);
   Исключение
       Сообщить("Фигня какая то с закладкой """+ИмяЗакладки+"""!!!");
       Возврат(1);
   КонецПопытки;
   Якорь=Закладка.getAnchor();
   Курсор.gotoRange(Якорь, 0);
   Текст.insertString(Курсор, "Тут была закладка """+ИмяЗакладки+"""", 0 );
   
   Перейти ~М1;
   Листы=Док.getSheets();
   Лист=Листы.getByIndex(0);
   Курсор=Лист.createCursor();
   Курсор.gotoStartOfUsedArea(0);
   Курсор.gotoEndOfUsedArea(-1);
   Адреса=Курсор.getRangeAddress();
   Диапазон=Лист.getCellRangeByPosition(Адреса.StartColumn,Адреса.StartRow,Адреса.EndColumn,Адреса.EndRow);
   Поиск=Диапазон.createSearchDescriptor();
   Поиск.SearchRegularExpression = -1;
   Поиск.SearchString = ".+";
   Рез=Диапазон.findAll(Поиск);
   Всего=Рез.getCount();
   Начало=Рез.getByIndex(0).getRangeAddress();
   Конец=Рез.getByIndex(Всего-1).getRangeAddress();
   ДиапазонДанных=Диапазон.getSpreadsheet().getCellRangeByPosition(Начало.StartColumn, Начало.StartRow,Конец.EndColumn,Конец.EndRow);
   Для С=1 По ДиапазонДанных.getRows().getCount() Цикл
       Стр="";
       Для К=1 По ДиапазонДанных.getColumns().getCount() Цикл
           Стр=Стр+"; "+ДиапазонДанных.getCellByPosition(К-1,С-1).getText().String();
       КонецЦикла;
       Сообщить(Стр);
   КонецЦикла;
~М1:
   Массив=Это.Массив(0);
   Обновлялка.forName("com.sun.star.beans.PropertyValue").createObject(Параметр);
   Это.УстановитьЗначение(Массив,0,Это.ПолучитьЗначение(Параметр,0));
   
   Параметр.Name="Wait";
   Параметр.Value=-1;//Если 0 или любое пустое значение то Ложь, иначе Истина
   Это.УстановитьБулево(Параметр);
   Для Сч=0 По Это.РазмерМассива(Массив)-1 Цикл
       Сообщить(Это.ПолучитьЗначение(Массив,Сч).Name);
       Сообщить(Это.ПолучитьЗначение(Массив,Сч).Value);
   КонецЦикла;
   Док.Print(Массив);
   //Предупреждение("Печать ?");
   Док.Close(-1);
   //Десктоп.Terminate();
   //createSearchDescriptor
КонецФункции

//*******************************************
Процедура Сформировать()
   Перем Имя,Путь;
   Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   Диалог.Заголовок = "Выберите файл";
   Диалог.ПолноеИмяФайла = "";
   Диалог.ПредварительныйПросмотр = Истина;
   Диалог.Фильтр = "Файлы офиса|*.ods;*.xls;*.odt;*.doc";
   Если Не Диалог.Выбрать() Тогда
       Возврат;
   КонецЕсли;
   ОпенОфис(Диалог.ПолноеИмяФайла);
КонецПроцедуры


Процедура КнопкаВыполнитьНажатие(Кнопка)
   Сформировать();
   // Вставить содержимое обработчика.
КонецПроцедуры
4 Nina2005
 
04.06.12
14:31
Спасиьо огромное!!! Сейчас буду пробовать!!!
5 Nina2005
 
04.06.12
15:33
(3) всё получилось, всё отлично. но остался ещё один вопросик. получила я bookmark, вставила там нужную строку, а теперь я хочу у этой строки изменить шрифт и сделать заливку каким-нибудь цветом, подскажите пож-та, как это сделать?
6 smaharbA
 
04.06.12
16:45
ИмяЗакладки="Закладка1";
   Текст=Док.getText();
   Контроллер=Док.CurrentController;
   Курсор=Контроллер.getViewCursor();
   Закладки=Док.getBookmarks();
   Попытка
       Закладка=Закладки.getByName(ИмяЗакладки);
   Исключение
       Сообщить("Фигня какая то с закладкой """+ИмяЗакладки+"""!!!");
       Возврат(1);
   КонецПопытки;
   Якорь=Закладка.getAnchor();
   Курсор.gotoRange(Якорь, 0);
   Текст.insertString(Курсор, "Тут была закладка """+ИмяЗакладки+"""", 0 );
7 smaharbA
 
04.06.12
16:46
Якорь=Закладка.getAnchor();
   Курсор.gotoRange(Якорь, 0);
   
   Курсор.CharColor=Цвет(255,0,0);
   Курсор.CharBackColor=Цвет(0,255,0);
   Курсор.CharFontName="Times New Roman";
   Курсор.CharHeight=48;
   Текст.insertString(Курсор, "Тут была закладка """+ИмяЗакладки+"""", 0 );
8 Nina2005
 
04.06.12
17:30
(7) к сожалению не работает(((
выдаёт ошибку:
"Ошибка при установке значения атрибута контекста (CharBackColor): Произошла исключительная ситуация ([automation bridge] ): InterfaceOleWrapper_Impl::Invoke : [automation bridge]UnoConversionUtilities::variantToAny Cannot convert the value of vartype :"9" to the expected UNO type of type class: 6"
9 Nina2005
 
04.06.12
17:31
(7) пробовала через setPropertyValue нашла кучу свойств кроме фона
Курсор.setPropertyValue("CharPosture", 200); //курсив
Курсор.setPropertyValue("CharColor",500); //цвет шрифта
Курсор.setPropertyValue("CharShadowed", Истина); //тень надписи
10 smaharbA
 
04.06.12
19:12
(8) работает
Цвет возыращает числа
хотя х.з. как в ЛО, разработчики что ООО, что ЛО известные мутаки
11 Nina2005
 
05.06.12
09:25
(10) заработало только вот так вот
Курсор.setPropertyValue("CharBackColor", 4000000);
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший