Имя: Пароль:
1C
 
Проблемы с созданием COM соединения с Open Office
0 ampfer11
 
30.03.16
10:14
Если коротко, то необходимо обработки загрузки в ТЧ документа Заказ Покупателя из Excel перевести на Open Office. Конф-я УПП 1.3
COM соединение c Excel работает нормально. Меняю на Open Office
//Эксел = Новый COMОбъект("Excel.Application");
   Офис = Новый ComОбъект("TOpenOffice.Bridge");
  Лист = Офис.Workbooks.Open(Файл).Sheets(НомерЛиста);
На второй строке получаю ошибку.
Ошибка при вызове конструктора (ComОбъект): -2147221005(0x800401F3): Недопустимая строка с указанием класса
В Инете нашел решение, нужно подцепить библиотеку comcntr.dll из BIN каталога релиза конфигурации. Кладу библиотеку в корень С: и запускаю командную строку
RegSrv.exe  "C:\comcntr.dll" Выдает ошибку "Проверьте, что двоичный файл хранится на указанном пути или запустите отладку.."
Почему ReSrv.exe (из Windows\System32 не видит параметр не пойму??? Помогите разобраться pls
1 lubitelxml
 
30.03.16
10:19
по поводу регистрации comcntr.dll - попробуй её руками поставить как службу (без regSrv.exe)
2 Patriot1C
 
30.03.16
10:21
ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
        Desktop = ServiceManager.CreateInstance("com.sun.star.frame.Desktop");
        Desktop.getCurrentFrame().getContainerWindow().setVisible(Ложь);  //невидимым основное окно.

        //установим параметры - не показывать таблицу Calc
        Параметры = Новый COMSafeArray("VT_DISPATCH", 1);
        Свойство = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
        Свойство.Name = "Hidden";
        Свойство.Value = true;
        Параметры.SetValue(0,Свойство);

        Document = Desktop.LoadComponentFromURL("file:///" + ИмяФайла, "_blank", 0, Параметры);
        Состояние("Обработка файла Office Calc ...");
        Листы = Document.getSheets();
        Лист = Листы.getByIndex(НомерЛистаCalc-1);
3 ampfer11
 
30.03.16
12:51
Спасибо Патриот,
На этой строке
Desktop.getCurrentFrame().getContainerWindow().setVisible(Ложь); уходит с попытки
4 ampfer11
 
30.03.16
15:01
Еще раз Спасибо Патриоту. Все получилось (правда без второй строки)
И немного помучился с дурацкой нумерацией с 0 и тем, что в Open Office сначала колонка. потом ряд в отличии от Excel
ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
        Desktop = ServiceManager.CreateInstance("com.sun.star.frame.Desktop");
        //Desktop.getCurrentFrame().getContainerWindow().setVisible(Ложь);  //невидимым основное окно.

        //установим параметры - не показывать таблицу Calc

        Параметры = Новый COMSafeArray("VT_DISPATCH", 1);
        Свойство = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
        Свойство.Name = "Hidden";
        Свойство.Value = true;
        Параметры.SetValue(0,Свойство);

        Doc = Desktop.LoadComponentFromURL(ПривестиФайлКУРЛ(Файл), "_blank", 0, Параметры);

        Состояние("Обработка файла Office Calc ...");
        Листы = Doc.getSheets();
        Лист = Листы.GetByIndex(НомерЛиста-1);    
        //Эксел = Новый COMОбъект("Excel.Application");
        // Эксел = Новый ComОбъект("TOpenOffice.Bridge");
        //Лист = Эксел.Workbooks.Open(Файл).Sheets(НомерЛиста);
        
        
        НомерСтроки = НачальнаяСтрока;
        
        ТаблицаДанные = Новый ТаблицаЗначений;
        ТаблицаДанные.Колонки.Добавить("Артикул");
        ТаблицаДанные.Колонки.Добавить("Наименование");
        ТаблицаДанные.Колонки.Добавить("Количество");
        ТаблицаДанные.Колонки.Добавить("Цена");
        ТаблицаДанные.Колонки.Добавить("Опция");
        ТаблицаДанные.Колонки.Добавить("ЕдИзм");
        
        Пока СокрЛП(Лист.getCellByPosition(0, НомерСтроки-1).GetString()) <> "" Цикл
            
            СтрокаТаб = ТаблицаДанные.Добавить();
            СтрокаТаб.Артикул = СокрЛП(Лист.getCellByPosition(КолонкаАртикул-1,НомерСтроки-1).GetString());
            СтрокаТаб.Наименование = СокрЛП(Лист.getCellByPosition(КолонкаНаименование-1,НомерСтроки-1).GetString());
            СтрокаТаб.Количество = Число(СокрЛП(Лист.getCellByPosition(КолонкаКоличество-1,НомерСтроки-1).GetValue()));
            СтрокаТаб.Цена = Число(СокрЛП(Лист.getCellByPosition(КолонкаЦена-1, НомерСтроки-1).GetValue()));
            СтрокаТаб.Опция = СокрЛП(Лист.getCellByPosition(КолонкаОпция-1, НомерСтроки-1).GetValue());
            СтрокаТаб.ЕдИзм = СокрЛП(Лист.getCellByPosition(КолонкаЕдИзм-1, НомерСтроки-1).GetString());

            
            НомерСтроки = НомерСтроки + 1;
            
        КонецЦикла;
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший