Имя: Пароль:
1C
1С v8
Ошибка при работе с OpenOffice Calc
0 lynxyur
 
08.10.11
11:37
при запуске кода возникает ошибка:
"Ошибка при вызове метода контекста (ParseStrict): Произошла исключительная ситуация ([automation bridge] ): [automation bridge] unexpected exception in UnoConversionUtilities<T>::variantToAny !
   transf.ParseStrict(URL);"
кто сталкивался с такой проблемой, напишите в чем причина плиз


"// ---------------------------------------------------------
Procedure dispatchURL(Docum, aUrl, scr)                                    
   scr.eval("URL=new Array()");
   scr.eval("URL[0]=OpenOffice.Bridge_GetStruct('com.sun.star.util.URL')");
   scr.eval("URL[0].Complete='" + aURL + "'");
   scr.eval("noProps=new Array()");
   scr.eval("noProps[0]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
   noProps=scr.eval("noProps");
   
   URL = scr.eval("URL");
   transf = OpenOffice.CreateInstance("com.sun.star.util.URLTransformer");
   transf.ParseStrict(URL);
   URL1 = scr.eval("URL[0]");
   frame = Docum.getCurrentController().getFrame();
   disp =    Frame.queryDispatch(URL1,"",0);  
   disp.dispatch(URL1,noProps);
EndProcedure

// ---------------------------------------------------------
Процедура перебросить()  
   ВременныйПуть = "D:\";
   
   Попытка
       OpenOffice = Новый ComObject("com.sun.star.ServiceManager");
   Исключение
       Сообщить(ОписаниеОшибки() + "; OpenOffice не установлен на данном компьютере!");
       Возврат;
   КонецПопытки;
   
   scr= Новый ComObject("MSScriptControl.ScriptControl");
   
   scr.language="javascript";
   scr.eval("Массив=new Array()");
   Массив=scr.eval("Массив");
   scr.AddObject("OpenOffice",OpenOffice);
   scr.eval("Массив[0]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
   scr.eval("Массив[0].Name='Hidden'");
   scr.eval("Массив[0].Value=true");
   
   DeskTop = OpenOffice.CreateInstance("com.sun.star.frame.Desktop");  
   
   
   Excel1 = DeskTop.LoadComponentFromURL("private:factory/scalc", "_blank", 0, Массив);
   
   Excel1.lockControllers();
   Excel1.addActionLock();
   
   БазКнига = Excel1.getSheets();
   
   Временныйпуть1 = СтрЗаменить(ВременныйПуть, "\", "/");
   Временныйпуть1 = СтрЗаменить(ВременныйПуть1, " ", "%20");
   
   Для Сч = 2 по 5 Цикл                                                    
       Попытка  
           Excel2= DeskTop.LoadComponentFromURL("file:///" + ВременныйПуть1 + Строка(Сч) + ".xls", "_blank", 0, Массив);
           Книга = Excel2.getSheets();
       Исключение
           Продолжить;
       КонецПопытки;
       
       Лист = Книга.getByIndex(0);//getByName("Sheet1");
       БазКнига.InsertNewByName(Строка(Сч), 0);  
       БазЛист = БазКнига.getByName(Строка(Сч));
       Excel2.getCurrentController().Select(Лист);  
       dispatchURL(Excel2, ".uno:SelectAll", scr);
       dispatchURL(Excel2, ".uno:Copy", scr);
       Excel1.getCurrentController().Select(БазЛист);
       dispatchURL(Excel1, ".uno:Paste", scr);
       
       Excel2.Close(-1);
   КонецЦикла;
   
   SaveParam=Excel1.setPropertyValue("FilterName","MS Excel 97");
   scr.eval("Массив[0].Name='FilterName'");
   scr.eval("Массив[0].Value='MS Excel 97'");
   Excel1.storeToURL("file:///" + ВременныйПуть1+"Отчет.xls",Массив);    
   Excel1.unLockControllers();
   Excel1.removeActionLock();
   
   Excel1.close(-1);
   
   
   Вложения = ВременныйПуть+"Отчет.xls";
   Сообщить("Отчет сохранен - " + Вложения);    
   Excel1 = "";
   Excel2 = "";
КонецПроцедуры"
1 lynxyur
 
09.10.11
17:28
ошибка исправлена, тема закрыта
P.S. судя по всему ошибка возникала, потому что в процедуре
dispatchURL использовались устаревшие методы,
работающий код:

// ---------------------------------------------------------
Procedure dispatchURL(Docum, aUrl, scr)                                    
   scr.eval("noProps=new Array()");
   noProps=scr.eval("noProps");
   frame = Docum.getCurrentController().getFrame();
   oDisp = OpenOffice.CreateInstance("com.sun.star.frame.DispatchHelper");
   oDisp.executeDispatch(frame,aUrl, "", 0, noProps);
EndProcedure

// ---------------------------------------------------------
Процедура перебросить()  
   ВременныйПуть = "D:\";
   
   Попытка
       OpenOffice = Новый ComObject("com.sun.star.ServiceManager");
   Исключение
       Сообщить(ОписаниеОшибки() + "; OpenOffice не установлен на данном компьютере!");
       Возврат;
   КонецПопытки;
   
   scr= Новый ComObject("MSScriptControl.ScriptControl");
   
   scr.language="javascript";
   scr.eval("Массив=new Array()");
   Массив=scr.eval("Массив");
   scr.AddObject("OpenOffice",OpenOffice);
   scr.eval("Массив[0]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
   scr.eval("Массив[0].Name='Hidden'");
   scr.eval("Массив[0].Value=true");
   
   DeskTop = OpenOffice.CreateInstance("com.sun.star.frame.Desktop");  
   
   
   Excel1 = DeskTop.LoadComponentFromURL("private:factory/scalc", "_blank", 0, Массив);
   
   Excel1.lockControllers();
   Excel1.addActionLock();
   
   БазКнига = Excel1.getSheets();
   
   Временныйпуть1 = СтрЗаменить(ВременныйПуть, "\", "/");
   Временныйпуть1 = СтрЗаменить(ВременныйПуть1, " ", "%20");
   
   Для Сч = 2 по 5 Цикл                                                    
       Попытка  
           Excel2= DeskTop.LoadComponentFromURL("file:///" + ВременныйПуть1 + Строка(Сч) + ".xls", "_blank", 0, Массив);
           Книга = Excel2.getSheets();
       Исключение
           Продолжить;
       КонецПопытки;
       
       Лист = Книга.getByIndex(0);//getByName("Sheet1");
       БазКнига.InsertNewByName(Строка(Сч), 0);  
       БазЛист = БазКнига.getByName(Строка(Сч));
       Excel2.getCurrentController().Select(Лист);  
       dispatchURL(Excel2, ".uno:SelectAll", scr);
       dispatchURL(Excel2, ".uno:Copy", scr);
       Excel1.getCurrentController().Select(БазЛист);
       dispatchURL(Excel1, ".uno:Paste", scr);
       
       Excel2.Close(-1);
   КонецЦикла;
   
   SaveParam=Excel1.setPropertyValue("FilterName","MS Excel 97");
   scr.eval("Массив[0].Name='FilterName'");
   scr.eval("Массив[0].Value='MS Excel 97'");
   Excel1.storeToURL("file:///" + ВременныйПуть1+"Отчет.xls",Массив);    
   Excel1.unLockControllers();
   Excel1.removeActionLock();
   
   Excel1.close(-1);
   
   
   Вложения = ВременныйПуть+"Отчет.xls";
   Сообщить("Отчет сохранен - " + Вложения);    
   Excel1 = "";
   Excel2 = "";
КонецПроцедуры
2 lynxyur
 
11.10.11
07:26
код который копирует не только данные и формат но и структуру


Процедура ОбъединитьФайлыXLS()
   ПутьКФайлу = "D:\";
   ТабДок = Новый ТабличныйДокумент;
   ТабДок.Записать(ПутьКФайлу + "Отчет.xls", ТипФайлаТабличногоДокумента.XLS);
   КоличествоЛистов = 4;
   Попытка
       ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
   Исключение
       Предупреждение(ОписаниеОшибки() + Символы.ПС + "программа OpenOffice не установлена на данном компьютере!");
       Возврат;
   КонецПопытки;
   Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");
   
   Свойства = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
   //Свойства.Name = "IsTemplate";
   //Свойства.Value = Истина;
   //Свойства1 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
   //Свойства1.Name = "Нidden";
   //Свойства1.Value = Истина;
   Массив = Новый COMSafeArray("VT_VARIANT", 1);
   //Массив.SetValue(0, Свойства);
   //Массив.SetValue(1, Свойства1);
   
   ПутьКФайлу = ПривестиФайлКУРЛ(ПутьКФайлу);
   
   Документ = DeskTop.LoadComponentFromURL(ПутьКФайлу + "Отчет.xls", "_blank", 0, Массив);

   Для Сч = 1 по КоличествоЛистов Цикл                                                    
       Попытка  
           ДокументКопия = DeskTop.LoadComponentFromURL(ПутьКФайлу + Строка(Сч) + ".xls", "_blank", 0, Массив);
       Исключение
           Продолжить;
       КонецПопытки;
       currentFrame = ДокументКопия.getCurrentController().getFrame();
       Переместить("Отчет", currentFrame, ServiceManager);
       ДокументКопия.Close(-1);
   КонецЦикла;
   
   Книга = Документ.getSheets();
   Книга.removeByName(Книга.getByIndex(0).getName());
   Документ.store();
   Документ.close(-1);
   
   
   Сообщить("Отчет сохранен - " + ПутьКФайлу + "Отчет.xls");    
   
   Документ = "";
   ДокументКопия = "";
КонецПроцедуры

Процедура Переместить(ИмяФайла, currentFrame, ServiceManager)
   МассивToJump = Новый COMSafeArray("VT_VARIANT", 1);
   СвойстваToJump = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
   СвойстваToJump.Name = "Nr";
   СвойстваToJump.Value = 1;
   МассивToJump.SetValue(0, СвойстваToJump);
   
   МассивToCopy  = Новый COMSafeArray("VT_VARIANT", 3);
   СвойстваToCopy1 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
   СвойстваToCopy1.Name = "DocName";
   СвойстваToCopy1.Value = ИмяФайла;
   СвойстваToCopy2 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
   СвойстваToCopy2.Name = "Index";
   СвойстваToCopy2.Value = 32767;
   СвойстваToCopy3 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
   СвойстваToCopy3.Name = "Copy";
   СвойстваToCopy3.Value = true;
   МассивToCopy.SetValue(0, СвойстваToCopy1);
   МассивToCopy.SetValue(1, СвойстваToCopy2);
   МассивToCopy.SetValue(2, СвойстваToCopy3);
   
   dispatcher = ServiceManager.CreateInstance("com.sun.star.frame.DispatchHelper");
   dispatcher.executeDispatch(currentFrame, ".uno:JumpToTable", "", 0, МассивToJump);
   dispatcher.executeDispatch(currentFrame, ".uno:Move", "", 0, МассивToCopy);
КонецПроцедуры


функция ПривестиФайлКУРЛ(ПутьКФайлу)
   ПутьКФайлу = СтрЗаменить(ПутьКФайлу," ","%20");
   ПутьКФайлу = СтрЗаменить(ПутьКФайлу,"\","/");
   Возврат "file:///" + ПутьКФайлу;
Конецфункции
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой