Имя: Пароль:
IT
Админ
Open office portable
0 ildary
 
01.10.10
14:13
Уважаемые специалисты (особенно smaharbA :) ), подскажите пожалуйста, как заставить ОО отдавать данные в 1С, не ставя полную версию? Попробовал использовать загрузку из OO, описанную в книге знаний: www.kb.mista.ru/article.php?id=180, но столкнулся с тем, что строка ServiceManager = СоздатьОбъект( "com.sun.star.ServiceManager" ) выдает ошибку "Неудачная попытка создания объекта", скорей всего из-за того, что установлен портабельный OO.
1 Fragster
 
гуру
01.10.10
14:29
(0) если тебе эксель нужен, то поставь yoksel если не хочешь целиком офис ставить
2 Fragster
 
гуру
01.10.10
14:29
(1)+ в смысле файлы .xls
3 smaharbA
 
01.10.10
14:37
(0) да именно, с некоторыми и не портаблами то же самое
но с ними надо было просто запустить "интерактивно" экземпляр
к примеру так

ШелСкрипт=СоздатьОбъект("WScript.Shell");
Шелскрипт.Run(ПутьДоСоффице,0);

а после уже через некоторое время цепляться
4 smaharbA
 
01.10.10
14:38
сейчас проверю
5 ildary
 
01.10.10
14:42
(1) Эксель грузится нормально - я его через АДО открываю, ОО требуется для открытия ODS - стали присылать заявки и в таком виде. Если не получится, подумаю над пересохранием документа с помощью autoit.

(3) спасибо за идею, щас попробую.

p.s. название прикольное у переменно. Шел скрипт и пришел :)
6 ildary
 
01.10.10
14:48
+(5) наличие в памяти открытого OpenOfficeCalcPortable.exe не помогло. Похоже, где-то в реестре инсталлятор что-то прописывает - придется скачать полный ОО и под виртуалкой экспериментировать.
7 ildary
 
01.10.10
14:50
8 smaharbA
 
01.10.10
15:52
В общем есть решение и для портабла + 1с самое оно
9 ildary
 
01.10.10
18:14
Можно его (решение) узнать?
10 ado
 
01.10.10
18:18
(5) А если не через com, а просто xml-структуру документа разбирать? Оно же стандарт, описано.
11 DS
 
01.10.10
18:20
(10) перед этим надо еще и разархивировать.
12 ado
 
01.10.10
18:21
(11) Ну и это не проблема. Там зипом заархивировано.
13 ildary
 
01.10.10
18:25
(10) можно попробовать, но боюсь, что там будет проблематичнее, (чем, к примеру, по ОЛЕ из МСО) - наверняка будут разные версии формата и т.п.
14 Fragster
 
гуру
01.10.10
18:30
(13) ну поставь к МСО приблуду для открытия ODT
15 ado
 
01.10.10
18:31
(13) >> наверняка будут разные версии формата и т.п.

Формат стандартизирован, надо почитать, что там может меняться, что не может. Но читать, ессно, на аглицком придется, сомневаюсь, что перевод на великомогучий найдешь.
16 Фигня
 
01.10.10
19:28
Портабельная версия любого ПО изначально ущербна. Вследствие неопределенности наличия оного ПО на компе (т. к. портабельный софт создан для таскания с собой), то регистрация его на компе как системного объекта не производится. Остается функционал чисто для юзания экзешника. Сие есть фича.
17 Ковычки
 
01.10.10
20:25
(9) вот и всего то (модифицировать для универсальности будет не сложно)

//*******************************************
Процедура Сформировать()
   Перем Имя,Путь,Шел,ФСО,Файл;
   Перем Ошибка,СервисМанагер,ШелСкрипт,Стр,ЗапускОО,Запуск,Версия,КласИд,Сп,База,Заголовок;
   Попытка
       СервисМанагер=СоздатьОбъект("com.sun.star.ServiceManager");
   Исключение
       Ошибка=1;
   КонецПопытки;
   Если Ошибка=1 Тогда
       Если ФС.ВыбратьФайл(0,Имя,Путь,"Выберете Носимый офис...","Файл Настройки Офиса (*.ini)|*.ini","ini")=0 Тогда
           Возврат;
       КонецЕсли;
       Текст=СоздатьОбъект("Текст");
       Текст.Открыть(Путь+Имя);
       Для Сч=1 По Текст.КоличествоСтрок() Цикл
           Стр=СокрЛП(Текст.ПолучитьСтроку(Сч));
           Если Найти(Врег(Стр),Врег("OpenOfficeDirectory"))=1 Тогда
               Файл=Путь+"\"+СокрЛП(Сред(Стр,Найти(Стр,"=")+1))+"\program\soffice.exe";
               Прервать;
           КонецЕсли;
       КонецЦикла;
       Если ФС.СуществуетФайл(Файл)=0 Тогда
           Сообщить("Фигня какая то!!! Нету пускалки.","!!!");
           Возврат;
       КонецЕсли;
       ФСО=СоздатьОбъект("Scripting.FileSystemObject");
       Шел=СоздатьОбъект("Shell.Application");
       Путь=Шел.NameSpace(ФСО.GetFile(Файл).ParentFolder.Path);
       Файл=Путь.ParseName(ФСО.GetFile(Файл).Name);
       Сообщить(Путь.GetDetailsOf(Файл,35));
       Если Найти(Врег(Путь.GetDetailsOf(Файл,35)),"OPENOFFICE")=0 Тогда
           Сообщить("Фигня какая то!!! Пускалка то не та вроде.","!!!");
           Возврат;
       КонецЕсли;
       ШелСкрипт=СоздатьОбъект("WScript.Shell");
       ЗапускОО=""""+Файл.Path+""" -nodefault -nologo";
       ШелСкрипт.exec(ЗапускОО).Terminate();
       Запуск=ШелСкрипт.exec(ЗапускОО);
       Ожидание=20000;
       Нач=_GetPerformanceCounter();
       Пока (Запуск.Status=0) или (_GetPerformanceCounter()-Нач>Ожидание) Цикл
           ВвестиСтроку("Ждем...","Ждем...",7,,1);
       КонецЦикла;
       //КлассИд=Лев(СкриптЛет.GUID,38);
       //КлассИд="{096FA06A-0374-5F54-C4F6-BDCEAAE420ED}";
       Стр="com.sun.star.ServiceManager.OOPortable";
       Версия=1;
       КлассИд="{82154420-0FBF-11d4-8313-005004526AB4}";
       Сп=СоздатьОбъект("СписокЗначений");
       СкриптЛет=СоздатьОбъект("Scriptlet.TypeLib");
       База="HKCU\Software\Classes";
       Путь=База+"\CLSID\" + КлассИд;
       Заголовок="OpenOffice.org Service Manager (Ver 1.0 OOPortable)";
       Сп.ДобавитьЗначение(Заголовок,Путь);
       Сп.ДобавитьЗначение(ЗапускОО,Путь+"\LocalServer32\");
       Сп.ДобавитьЗначение("",Путь+"\NotInsertable\");
       Сп.ДобавитьЗначение(Стр+"."+Версия,Путь+"\ProgID\");
       Сп.ДобавитьЗначение("",Путь+"\Programmable\");
       Сп.ДобавитьЗначение(Стр,Путь+"\VersionIndependentProgID\");
       Путь=База+"\"+Стр;
       Сп.ДобавитьЗначение(Заголовок,Путь+"\");
       Сп.ДобавитьЗначение(КлассИд,Путь+"\CLSID\");
       Сп.ДобавитьЗначение(Стр+"."+Версия,Путь+"\CurVer\");
       Сп.ДобавитьЗначение("",Путь+"\NotInsertable\");
       Сп.ДобавитьЗначение(Заголовок,Путь+"."+Версия+"\");
       Сп.ДобавитьЗначение(КлассИд,Путь+"."+Версия+"\");
       Сп.ДобавитьЗначение("",Путь+"."+Версия+"\NotInsertable\");
       Для Сч=1 По Сп.РазмерСписка() Цикл
           Зн=Сп.ПолучитьЗначение(Сч,Стр);
           ШелСкрипт.RegWrite(Стр,Зн);
       КонецЦикла;
       СервисМанагер=СоздатьОбъект("com.sun.star.ServiceManager.OOPortable");
   КонецЕсли;
   Сообщить(СервисМанагер);
КонецПроцедуры
18 Ковычки
 
01.10.10
20:26
(16) а (17) тогда что ?
19 ildary
 
04.10.10
16:08
(18) теперь Сообщить(СервисМанагер) возвращает OLE, но

Document = Desktop.LoadComponentFromURL( ServiceManager.convertToURL( ФайлПрайса ), "_blank", 0, Массив )

возвращает Поле агрегатного объекта не обнаружено (convertToURL).

Можно ли узнать, как с этим бороться?
20 Фигня
 
04.10.10
19:53
(18) Имитация регистрации. "Как бы наличествует". Может работать, может не работать. Самый прикол будет после удаления/перебазирования сабжа. Костыли могут быть, но это уже не ноги... К сожалению пройдено не только на ОО.
.
ПС У меня, собственно, одна непонятка - нафига портабельный офис? Я понимаю, если носить нужный софт на винте по точкам/клиентам. А если потребно постоянное нахождение? ИМХО проще вставить обычный и не геморроиться.
21 Ковычки
 
04.10.10
20:09
(20) бред

(19)

Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.language="javascript";
Это=Скрипт.Eval("this");
Сообщить("file:///"+Это.encodeURI(СтрЗаменить(ФайлПрайса,"\","/")));
22 Фигня
 
04.10.10
20:31
Мусью нравятся извращения - флаг в руки.
23 ildary
 
05.10.10
18:28
(22) хочется, чтобы оно работало, не заводя в папках  и реестре реестре лишнего, особенно при переходе на новую версию. Я не считаю это извращением.
24 ivanovpetr79
 
05.10.10
19:46
(23) - а что там нового?
25 Ковычки
 
05.10.10
19:46
(24) а что там старого ?
26 ildary
 
06.10.10
11:03
(25) Огромное спасибо, smaharbA!!! Все работает как надо!