Имя: Пароль:
1C
 
V7: как загрузить данные из файла Open Office Calc в 1С:7.7
0 orange777
 
27.11.09
18:18
Всем привет, столкнулась с проблемой. Клиенты дали файл .xls попросили сделать обработку загрузки данных в 1С:Бухгалтерию 7.7.Сделала - приношу, а у них там опен офис стоит. есть какая-нть аналогия? Сейчас это выглядит так:
   Файл=СоздатьОбъект("Excel.Application");
   Файл.Application.Workbooks.Open(ИмяФайла);    
       POLE1 =Файл.ActiveSheet.Cells(НомерСтроки,1).Value;   // контрагент
       POLE3 =Файл.ActiveSheet.Cells(НомерСтроки,3).Value;   // договор
   Файл.Quit();
Ну то есть нужно открыть и закрыть файл и работу с полями организовать... Никто не сталкивался?
1 smaharbA
 
27.11.09
18:22
сталкивались
решение самое адекватное - купить ексель
2 Fragster
 
гуру
27.11.09
18:25
(1) нафига?
(0) ищи yoksel
3 smaharbA
 
27.11.09
18:26
(2) а зырить чем ?
4 Fragster
 
гуру
27.11.09
18:26
(3) а зырить - кальком
5 Fragster
 
гуру
27.11.09
18:27
6 Aswed
 
27.11.09
18:28
(0) Ох страдал я такой же фигнёй на старой работе, так и плюнул, сделал всё через эксель.
7 Fragster
 
гуру
27.11.09
18:30
(6) там даже через ООо не много делать, через ёксель - еще проще
8 also
 
27.11.09
18:31
9 orange777
 
27.11.09
18:33
Да я вот тоже нашла пару скриптов... и думаю, пусть ёксель покупают) им дешевле выйдет))) однако проблема актуальна
10 YauheniL
 
27.11.09
18:34
(9) А OO OLE не поддерживает?
11 also
 
27.11.09
18:34
(9) Эксель и ёксель разные вещи
12 orange777
 
27.11.09
18:35
(9) мне сказали что можно ето реализовать, и создать именно OLE но я чета нигде не найду как
13 orange777
 
27.11.09
18:36
(11)поведайте нам в чем раздница?)
14 YauheniL
 
27.11.09
18:37
(12) Если знать название типа и иметь спецификацию, тогда по идее что-то вроде

Файл=СоздатьОбъект(ИмяТипаПриложенияОО); // Создание

Использование -- исходя из спецификации
15 also
 
27.11.09
18:39
16 orange777
 
27.11.09
18:39
(11) мда... до чего техника дошла... однакож лучше экселя ничего не придумали
17 orange777
 
27.11.09
18:42
вот нашла описание. если кто загонится, мож чем поможет http://triteh.ru/libooo/
буду мучиться дальше, всем спасибо
18 TigerPXN
 
27.11.09
18:45
Не мое, но думаю, что такие вещи какой-то большой тайной не являются:

Попытка
   OpenOffice = Новый COMОбъект("com.sun.star.ServiceManager");
Исключение
// Тут сообщение об ошибке и выход...
КонецПопытки;

   scr = Новый COMОбъект("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");
   // Только для чтения
   scr.eval("Массив[1]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
   scr.eval("Массив[1].Name='ReadOnly'");
   scr.eval("Массив[1].Value=true");
   // Установка параметров фильтра табличного документа
   
   Файл = Новый Файл(ИмяФайла);
   Если
       ВРег(Файл.Расширение) = ".XLS"
       Или
       ВРег(Файл.Расширение) = ".ODS"
   Тогда
   ИначеЕсли
       ВРег(Файл.Расширение) = ".CSV"
       Или
       ВРег(Файл.Расширение) = ".TXT"
   Тогда
       // Фильтр текстового файла
       // http://doc.services.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Filter_Options
       // Имя фильтра:
       //    "Text - txt - csv (StarCalc)"
       // Параметры:
       //    Разделитель полей   = ','
       //    Разделитель текста  = '"'
       //  Кодировака          = 0 (Системная)
       //    Номер первой строки = 1
       scr.eval("Массив[2]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
       scr.eval("Массив[2].Name='FilterName'");
       scr.eval("Массив[2].Value='Text - txt - csv (StarCalc)'");
       scr.eval("Массив[3]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
       scr.eval("Массив[3].Name='FilterOptions'");
       scr.eval("Массив[3].Value='44,34,0,1'");
   Иначе
       ОбщегоНазначения.СообщитьОбОшибке("Неизвестный тип табличного документа");
       Возврат Ложь;
   КонецЕсли;
   
   Попытка
       DeskTop = OpenOffice.CreateInstance("com.sun.star.frame.Desktop");
   Исключение
       ОбщегоНазначения.СообщитьОбОшибке(
           "Не удалось создать Desktop: " +
           ОписаниеОшибки());
       ЗакрытьФайлТабличногоДокумента(DeskTop, Document);
       Возврат Ложь;
   КонецПопытки;
   
   ПутьКФайлуURL = "file:///" + СтрЗаменить(ИмяФайла, "\", "/");
   
   Попытка
       Document = DeskTop.LoadComponentFromURL(ПутьКФайлуURL, "_blank", 0, Массив);
   Исключение
       ОбщегоНазначения.СообщитьОбОшибке(
           "Не удалось загрузить файл табличного документа: " +
           ОписаниеОшибки());
       ЗакрытьФайлТабличногоДокумента(DeskTop, Document);
       Возврат Ложь;
   КонецПопытки;
   
   Document.lockControllers();
   Document.addActionLock();
   Листы = Document.getSheets();
   Попытка
       Если Не ПустаяСтрока(ИмяЛистаТабличногоДокумента) Тогда
           Лист = Листы.getByName(ИмяЛистаТабличногоДокумента);
       Иначе
           Лист = Листы.getByIndex(0);
       КонецЕсли;
   Исключение
       ОбщегоНазначения.СообщитьОбОшибке(
           "Не удалось получить необходимый лист табличного документа: " +
           ОписаниеОшибки());
       ЗакрытьФайлТабличногоДокумента(DeskTop, Document);
       Возврат Ложь;
   КонецПопытки;
19 YauheniL
 
27.11.09
18:46
(17) Там же полный пример: подключаешь DLL и вперед. Помощь других программистов вряд ли будет иметь более полезный для тебя вид (ну, если только они именно твое задание не сделают)
20 TigerPXN
 
27.11.09
18:47
Ну и далее вызываем типа такого:

НекаяПеременная = Лист.getCellByPosition(1, 2).getString();

Только нужно помнить, что нумерация начинается с 0.
21 TigerPXN
 
27.11.09
18:48
В конце закрываем документ:

   Если Document <> Неопределено Тогда
       Попытка
           Document.unLockControllers();
           Document.removeActionLock();
           Document.Close(-1);
       Исключение
           ОбщегоНазначения.СообщитьОбОшибке(
               "Не удалось закрыть табличный документ: " +
               ОписаниеОшибки());
       КонецПопытки;
       Document = Неопределено;
   КонецЕсли;

   Если DeskTop <> Неопределено Тогда
       DeskTop = Неопределено;
   КонецЕсли;
22 smaharbA
 
27.11.09
18:48
(4) уверен ? ))
23 TigerPXN
 
27.11.09
18:48
Правда, тут весь код под УТ, но для 7.7 он будет мало отличаться.
24 orange777
 
27.11.09
18:49
Ребята, спасибо, но мне бы хватило расшифровки каждой функции а в конце пример использования. Эти массивы я видела, они для меня пустой звук. Как догаться ЧТО они делают и нужны ли они вообще
25 smaharbA
 
27.11.09
18:50
(18) не нужна обертка для 8.х
а для 7.7 есть "красивее" метода )) и только моя  а ф т о р а
26 TigerPXN
 
27.11.09
18:50
В (21) - функция ЗакрытьФайлТабличногоДокумента(DeskTop, Document)
27 orange777
 
27.11.09
18:51
процедура Сформировать();
перем xls,cel,сч;
   если ФС.СуществуетФайл(СокрЛП(ВыбФайл))=0 тогда
       предупреждение("Необходимо указать существующий файл",90);
       возврат;
   конецЕсли;
   // xls=СоздатьОбъект("Excel.Application");
   xls=СоздатьОбъект("TOpenOffice.Bridge");
   xls.WorkBooks.Open(СокрЛП(ВыбФайл));
   для сч=1 по xls.WorkSheets.Count цикл
       сообщить(""+сч+"="+xls.WorkSheets[сч].name);
   конецЦикла; //сч=1 по xls.WorkSheets.Count
   xls.Worksheets(1).Activate();
   // как и в Excel.Aplication:
   // 1 . к ячейке можно обращаться через объект книги
   xls.Cells(1,1).text="Это текст из 1С!";
   // 2. а можно создав ссылку на ячейку, и затем обращаться к ней
   cel=xls.WorkSheets(2).Cells(1,1);
   cel.Value="Шифровальщица попросту забыла ряд ключевых множителей и тэгов";
   //
   cel=xls.Cells(1,2);
   сообщить("В ячейке A2 содержится текст:"+cel.text);
   xls=0;
конецПроцедуры // Сформировать();    
Вот это для меня гораздо понятнее)
28 FN
 
27.11.09
18:55
(27) так это денег стоит...
29 TigerPXN
 
27.11.09
18:58
(24) А там и не надо ничего понимать. Копируешь приведенные куски as is (исправляя только синтаксис для 7.7) и все работает. Там только кажется, что много понаписано, на самом деле там большая часть - параноидальные проверки всего подряд.
30 smaharbA
 
27.11.09
19:00
(29) в (18) бред полный )
31 TigerPXN
 
27.11.09
19:02
(30) Может быть. Но у меня так работает. А больше к этому коду никаких требований нет. :)
32 smaharbA
 
27.11.09
19:03
(31) притензий к этому коду до и более
33 TigerPXN
 
27.11.09
19:03
Проще за 5 минут сделать copy-paste, чем целый день разбираться, что именно там является бредом, а что - нет.
34 TigerPXN
 
27.11.09
19:04
Понятно, что такой код сильно избыточен. Ну и что с того?
35 smaharbA
 
27.11.09
19:07
(34) он не избыточен, есть красившее
36 smaharbA
 
27.11.09
19:08
а по сути - жаба задавила
37 orange777
 
27.11.09
19:10
(28)неа, бесплатный интерфейс. надо попробовать установить
38 orange777
 
27.11.09
19:12
(36) дело не в жабе) у них есть возможность купить эксель) но нафига отдавать деньги микрософту, если их могу получить я) если б, конечно ето еще и попроще было...
39 smaharbA
 
27.11.09
19:19
(38) о тебе речи нет
40 TigerPXN
 
27.11.09
19:22
(38) А что там сложного?
Все, что в (18) запихиваешь в функцию, которая получает ИмяФайла. После выполнения данного куска кода получаешь переменную Лист, с которой работаешь почти как с листом Excel (только индексы с 0, а не с 1).
Тут думать не надо. Это даже вредно в данном случае ))
41 Alexor
 
27.11.09
19:25
Я загрузку из OpenOffice делал с помощью TOpenOffice
42 Alexor
 
27.11.09
19:25
43 smaharbA
 
27.11.09
19:31
в (18) рабочий, но плохой
44 TigerPXN
 
27.11.09
19:52
(42),(43) Всем спасибо, ошибки понял. В следующий раз вариант будет покрасивше :)