Имя: Пароль:
1C
 
1С + LibreOffice
0 Данияр
 
24.12.17
18:57
"Управление торговлей", редакция 10.3 (10.3.12.3)
1С:Предприятие 8.3 (8.3.10.2466)


Коллеги вопрос, загружаю из LibreOffice в 1с, после загрузки
заркывает все открытое LibreOffice.

как сделать чтобы закрывал только то что прочитал в базу
1 nordbox
 
24.12.17
19:10
(0) а чо ты туда читаешь?
2 nordbox
 
24.12.17
19:10
и как?
3 Данияр
 
24.12.17
19:25
(2)

                
Лист = ОбщийМодульБителКлиент.ПрочитатьExcel(ФайлДляЗагрузки, НомерЛиста, ServiceManager, Desktop, Book);

//LibreOffice
Функция ПрочитатьExcel(ФайлДляЗагрузки, НомерЛиста, ServiceManager, Desktop, Book)Экспорт
    
    Попытка
        
        ServiceManager = ПолучитьLOServiceManager();
        Desktop = ПолучитьLODesktop(ServiceManager);
        Book = ПолучитьLOBook(ServiceManager, Desktop, ФайлДляЗагрузки);
        ЛистName = ПолучитьСписокЛистов(ФайлДляЗагрузки);
        
        Sheet = ПолучитьLOSheet(Book, ФайлДляЗагрузки, ЛистName, НомерЛиста);
        
    Исключение
        
        Сообщить(ОписаниеОшибки());
        
    КонецПопытки;
    
    Возврат Sheet;//лист
    
КонецФункции

Функция ПолучитьLOServiceManager()
    
    Попытка
        // Инициализация основного СОМОбъекта типа com.sun.star.ServiceManager (LibreOffice/OpenOffice).            
        ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
    Исключение
        ServiceManager = Неопределено;
    КонецПопытки;
    
    Возврат ServiceManager;
    
КонецФункции

Функция ПолучитьLODesktop(ServiceManager)
    
    Попытка
        // Инициализация дочернего объекта Desktop.
        Desktop = ServiceManager.CreateInstance("com.sun.star.frame.Desktop");
    Исключение
        Desktop = Неопределено;
    КонецПопытки;
    
    Возврат Desktop;
    
КонецФункции

Функция ПолучитьLOBook(ServiceManager, Desktop, Знач ФайлEXCEL)
    
    Попытка
        // Объявление свойств и аргументов.
        Properties1 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
        Properties1.Name  = "AsFile";            // Свойство "КАК ФАЙЛ", альтернатива "AsTemplate" - "КАК ШАБЛОН".
        Properties1.Value = Истина;
        
        Properties2 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
        Properties2.Name  = "Hidden";            // Запускать скрытно. Реализовано в LibreOffice 3.6.
        Properties2.Value = Истина;
        
        Arguments = Новый COMSafeArray("VT_VARIANT", 2);
        Arguments.SetValue(0, Properties1);
        Arguments.SetValue(1, Properties2);
        
        // Дочерний объект Desktop-а: Книга EXCEL.
        Book = Desktop.LoadComponentFromURL(ConvertToURL(ФайлEXCEL), "_blank", 0, Arguments);
    Исключение
        Book = Неопределено;
    КонецПопытки;
    
    Возврат Book;
    
КонецФункции    

Функция ПолучитьLOSheet(Book, Знач ФайлEXCEL, Знач ФайлИмяЛиста, Знач ФайлНомерЛиста)
    
    // Дочерний объект Book-а: Листы EXCEL.
    Sheets = Book.getSheets();
    ВсегоЛистов = Sheets.getCount();

    // Инициализация дочернего объекта Книги типа Лист EXCEL.
    Если Лев(ФайлИмяЛиста, 1) = "'" И Прав(ФайлИмяЛиста, 1) = "'" Тогда
        ФайлИмяЛиста = УдалитьКавычки(ФайлИмяЛиста, "'");
    КонецЕсли;
    
    Если Прав(ФайлИмяЛиста, 1) = "$" Тогда
        УдалитьПоследнийСимволВСтроке(ФайлИмяЛиста, 1);
    КонецЕсли;
    
    Попытка
        Sheet = Sheets.getByName(ФайлИмяЛиста);
    Исключение
        Sheet = Неопределено;
        Сообщить("Некорректное имя листа: " + ФайлИмяЛиста + ".");
    КонецПопытки;
    
    Возврат Sheet;
    
КонецФункции

функция ConvertToURL(ФайлEXCEL)
    
    ФайлEXCEL = СтрЗаменить(ФайлEXCEL," ","%20");
    ФайлEXCEL = СтрЗаменить(ФайлEXCEL,"\","/");
    
    Возврат "file:/" + "/localhost/" + ФайлEXCEL;
    
Конецфункции

Функция УдалитьКавычки(Знач Строка, Кавычка = """")
    
    Пока Лев(Строка, 1) = Кавычка Цикл
        Строка = Сред(Строка, 2);
    КонецЦикла;
    
    Пока Прав(Строка, 1) = Кавычка Цикл
        Строка = Лев(Строка, СтрДлина(Строка) - 1);
    КонецЦикла;
    
    Возврат Строка;
    
КонецФункции

Процедура УдалитьПоследнийСимволВСтроке(Текст, ЧислоСимволов)
    
    Текст = Лев(Текст, СтрДлина(Текст) - ЧислоСимволов);
    
КонецПроцедуры

Функция ПолучитьСписокЛистов(Знач ФайлEXCEL)
    
    ТабличныйДокумент = Новый ТабличныйДокумент;
    
    Попытка
        // Выполняется долго на больших файлах.
        ТабличныйДокумент.Прочитать(ФайлEXCEL);
    Исключение
        Сообщить(ОписаниеОшибки(), СтатусСообщения.Внимание);
        Возврат Неопределено;
    КонецПопытки;
    
    Возврат ТабличныйДокумент.Области[0].Имя;
    
КонецФункции
//LibreOffice

            //Определяем число строк и колонок
            oCell = Лист.GetCellbyPosition(0, 0);
            oCursor = Лист.createCursorByRange(oCell);
            oCursor.GotoEndOfUsedArea(Истина);
            aAddress = oCursor.RangeAddress;
            ВсегоКолонок = aAddress.EndColumn;
            ВсегоСтрок = aAddress.EndRow;

дальше хочу просто заруть этот файд а не все что открыто на компе
4 nordbox
 
24.12.17
19:33
А зачем ты эти функции тут показываешь??
ну прочитал, заменил там что тебе надо
а дальше то что??
где он закрывает?
5 nordbox
 
24.12.17
19:36
Вот, развлекайся
http://catalog.mista.ru/public/398279/
6 Данияр
 
24.12.17
19:37
(4)     
Book.Close(Истина);
Desktop.Terminate();
Desktop = Неопределено;
ServiceManager = Неопределено;
7 Данияр
 
24.12.17
19:37
(5) читай внимательнее у меня LibreOffice
8 nordbox
 
24.12.17
19:46
Ну тогда смотри функции другие, у меня справочника нет
Смотри внимательно
Book.Close(Истина); //Согласен )
  
Desktop.Terminate(); //?????
9 arsik
 
гуру
24.12.17
19:48
(7) Через 1С можно читать таблицы без всякого офиса.
10 nordbox
 
24.12.17
19:49
(9) Ты не понимаешь, это из серии "МНЕ ТАК НАДО" )
11 Данияр
 
24.12.17
19:50
(10) если есть чем помочь, буду благодарен,

а просто писать не стоит, другим потом много перечитывать
12 Данияр
 
24.12.17
19:51
(8) Book.Close(Истина);//Согласен ) не зарывает

Desktop.Terminate(); закрывает
13 nordbox
 
24.12.17
19:55
(12) Так закрывает Книгу (Book)  с чего ты взял что он ее не закрыл???
1С для себя закрыл, а не для тебя
то что ты там у себя на компе делаешь, для 1с глубоко побаробану.
14 nordbox
 
24.12.17
20:03
+13
// Инициализация дочернего объекта Desktop.

        Desktop = ServiceManager.CreateInstance("com.sun.star.frame.Desktop");
Ну и????
15 nordbox
 
24.12.17
20:04
Ты его убиваешь, причем в особо жестокой форме
16 nordbox
 
24.12.17
20:06
Ты его запускаешь
ServiceManager = ПолучитьLOServiceManager();
а потом грохнул ВЕСЬ сервис терминатор блин
17 Данияр
 
24.12.17
20:09
(13) в диспетчере висит
18 nordbox
 
24.12.17
20:10
(17) и чо??
ты только этим руководствуешься??
это еще не критерий )
19 Данияр
 
24.12.17
20:13
(18) а что критерий тогда?
20 nordbox
 
24.12.17
20:13
открой хром или вообще пофиг чего, наоткрывай окон побольше, а потом в диспетчере сделай завершить задачу и посмотри что будет.
21 Данияр
 
24.12.17
20:16
(20) по моему ты бред пишешь)

при повторном считывании этой же книги, он пишет что он уже занят, и это по твоему 1с сама у себя зарула и пофиг чо там на компе?
22 nordbox
 
24.12.17
20:20
(21) Я вот тебе еще раз говорю что у меня справочника под рукой нет и он мне нах.. не нужен
а вот в екселе делается
Excel.Quit();
23 h-sp
 
24.12.17
20:21
(21) копируй во временный файл, после этого уже запускай чтение в 1с.
24 nordbox
 
24.12.17
20:23
(23) Да неее, это ему не поможет, он убивает все
Desktop.Terminate();
25 nordbox
 
24.12.17
20:24
(21)сделай
Desktop.Quit();
может проглотит ))
26 nordbox
 
24.12.17
20:31
(21) Ты вообще про дискриптор открытого файла слышал???
27 nordbox
 
24.12.17
20:33
+26 я тебе больше еще скажу, даже если на экране усе зарыто, то это не значит что виндовоз или другое приложение уже  его освободило.
28 Данияр
 
24.12.17
20:33
(25) висит в диспетчере все равно
29 nordbox
 
24.12.17
20:43
Ну попробуй
Desktop.Ехiт();
ну или еще чо там у него есть,  
я то не знаю, а с этим никогда не работал, ОпенОфис, нормально себя ведет, и таких парнографическийх вариантов как отрыть кучу файлов екселя, и потом в 1с что то пытаться читать....
ты уж определись что тебе надо, грузить из екселя или работать в нем.
Нельзя есть бутерброд одной рукой, а другой ...
короче я спать, у меня бортовое время 22:40