8.х Прочитать табличный документ

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем НиколайН, 17 фев 2015.

  1. TopicStarter Overlay
    НиколайН
    Offline

    НиколайН Опытный в 1С

    Регистрация:
    14 фев 2014
    Сообщения:
    246
    Симпатии:
    0
    Баллы:
    26
    Все добрый день! Есть внешняя обработка (Обычное приложение). Я переделываю её для "Управляемого приложения". Проблема заключается в том что есть функция, которая читает табличный документ Open office. Ниже представлена эта функция:
    Код:
    Функция мПрочитатьТабличныйДокументИзCalc(ТабличныйДокумент, ИмяФайла, НомерЛистаCalc = 1) Экспорт
    
        ВыбФайл = Новый Файл(ИмяФайла);
        Если НЕ ВыбФайл.Существует() Тогда
            Сообщить("Файл не существует!");
            Возврат Ложь;
        КонецЕсли;
       
        Попытка
            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);
        Исключение
            Сообщить("Ошибка загрузки данных. Возможно неверно указан номер листа книги Calc.");
            Возврат ложь;
        КонецПопытки;
       
        ТабличныйДокумент.Очистить();
       
        //Определение максимум ячейки с данными…
        НульЯчейка = Лист.GetCellbyPosition(0,0);
        НульКурсор = Лист.createCursorByRange(НульЯчейка);
        НульКурсор.GotoEndOfUsedArea(1);
        НульАдрес = НульКурсор.RangeAddress;
        ПослСтрока = НульАдрес.EndRow;
        ПослКолонка = НульАдрес.EndColumn;
       
        Для Column = 1 По ПослКолонка + 1 Цикл
            //ТабличныйДокумент.Область("C" + Формат(Column, "ЧГ=")).ШиринаКолонки = Лист.getColumns.getByIndex(Column-1).Width;
           
            Для Row = 1 По ПослСтрока + 1 Цикл
               
                Если Лист.getCellByPosition(Column-1,Row-1).getType() = 0 Или Лист.getCellByPosition(Column-1,Row-1).getType() = 1 Тогда ТабличныйДокумент.Область("R" + Формат(Row, "ЧГ=") +"C" + Формат(Column, "ЧГ=")).Текст = Лист.getCellByPosition(Column-1,Row-1).value;
                ИначеЕсли Лист.getCellByPosition(Column-1,Row-1).getType() = 2 Тогда ТабличныйДокумент.Область("R" + Формат(Row, "ЧГ=") +"C" + Формат(Column, "ЧГ=")).Текст = Лист.getCellByPosition(Column-1,Row-1).string;
                КонецЕсли;
            КонецЦикла;
        КонецЦикла;
       
        //ServiceManager.quit();
        Document.Dispose();
        Document = 0;
        Параметры = 0;
        Desktop = 0;
        ServiceManager = 0;
       
        Возврат Истина;
    
    КонецФункции  
    
    Проблема в том, что на этом куске коде:
    Код:
            Параметры = Новый COMSafeArray("VT_DISPATCH", 1);
    
    она прекращает работа. Как это можно исправить???
  2. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    COMSafeArray что это такое ?
  3. TopicStarter Overlay
    НиколайН
    Offline

    НиколайН Опытный в 1С

    Регистрация:
    14 фев 2014
    Сообщения:
    246
    Симпатии:
    0
    Баллы:
    26
    Эта функция не мной написана. Поэтому я сам не знаю.
  4. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    COMSafeArray - это аналог массива в среде COM
  5. TopicStarter Overlay
    НиколайН
    Offline

    НиколайН Опытный в 1С

    Регистрация:
    14 фев 2014
    Сообщения:
    246
    Симпатии:
    0
    Баллы:
    26
    И что с ним делать? Как я понял он не создается.
  6. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    С-П почитайте на тему создания COMSafeArray.
  7. TopicStarter Overlay
    НиколайН
    Offline

    НиколайН Опытный в 1С

    Регистрация:
    14 фев 2014
    Сообщения:
    246
    Симпатии:
    0
    Баллы:
    26
    У обычном приложении все работает, а вот в управляемом нет.
  8. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    А на что ругается при создании COMSafeArray?
  9. TopicStarter Overlay
    НиколайН
    Offline

    НиколайН Опытный в 1С

    Регистрация:
    14 фев 2014
    Сообщения:
    246
    Симпатии:
    0
    Баллы:
    26
    Это код находится в "Попытке", я смотрю отладчиком, что сразу после этой строчки, он отладчик переходит на исключение и все.
  10. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    остановку по ошибке сделайте или в исключении сделайте

    Сообщить(ПодробноеПредставлениеОшибки(ИнформациОбОшибке));
  11. TopicStarter Overlay
    НиколайН
    Offline

    НиколайН Опытный в 1С

    Регистрация:
    14 фев 2014
    Сообщения:
    246
    Симпатии:
    0
    Баллы:
    26
    Выдает вот что:
    Код:
    Значение не является значением объектного типа (getContainerWindow)
            Desktop.getCurrentFrame().getContainerWindow().setVisible(Ложь);
  12. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    дык и причем тут создание COMSafeArray? :)

    Ошибка говорит о том, что у объекта

    Desktop.getCurrentFrame() нет реквизита/свойства/метода
    getContainerWindow()
  13. TopicStarter Overlay
    НиколайН
    Offline

    НиколайН Опытный в 1С

    Регистрация:
    14 фев 2014
    Сообщения:
    246
    Симпатии:
    0
    Баллы:
    26
    С помощью отладчика смотрел, всегда после выполнение строки
    Код:
    Параметры = Новый COMSafeArray("VT_DISPATCH", 1);
    уходил в исключение, вот и подумал, что связано с ним.
  14. TopicStarter Overlay
    НиколайН
    Offline

    НиколайН Опытный в 1С

    Регистрация:
    14 фев 2014
    Сообщения:
    246
    Симпатии:
    0
    Баллы:
    26
    Ребят не могу понять, почему в обычной форме
    у объекта

    Desktop.getCurrentFrame() ЕСТЬ реквизит/свойство/метод
    getContainerWindow()


    А в управляемой форме выдает ошибку что у объекта

    Desktop.getCurrentFrame() НЕТ реквизита/свойства/метода
    getContainerWindow()
  15. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    потому что наверное ваш код УФ выполняется на сервере, вот там и нет метода - это чисто предположение
  16. TopicStarter Overlay
    НиколайН
    Offline

    НиколайН Опытный в 1С

    Регистрация:
    14 фев 2014
    Сообщения:
    246
    Симпатии:
    0
    Баллы:
    26
    Он и на клиенте выдает тоже самое
  17. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Дык если в отладчике вычислить выражение:
    Desktop.getCurrentFrame()
    чего увидим в качестве значения?
  18. TopicStarter Overlay
    НиколайН
    Offline

    НиколайН Опытный в 1С

    Регистрация:
    14 фев 2014
    Сообщения:
    246
    Симпатии:
    0
    Баллы:
    26
    Неопределено
  19. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    ну, а что вы хотите от бедной железки? :)
    Что содержится в Desktop, в ServiceManager?
    Как уже заметила Tiger86, код выполняется на стороне сервера, а сервер про OO на вашем компьютере не знает ничего в принципе и не узнает никак.
  20. TopicStarter Overlay
    НиколайН
    Offline

    НиколайН Опытный в 1С

    Регистрация:
    14 фев 2014
    Сообщения:
    246
    Симпатии:
    0
    Баллы:
    26
    Я пытался его выполнить на клиенте, тоже самое происходит.
    И к тому же в обычной форме, он же тоже выполняется на сервере.

Поделиться этой страницей