Добавим документы ODF (OpenOffice/LibreOffice) в стандартную обработку Загрузки Табличного документа из 1С.

image_pdfimage_print

Доброго времени суток!

Обработку ЗагрузкаданныхизТабличногоДокументаконечно должен знать каждый 1С-ник. И сколько бы обработок такого плана не появлялось, эта остается классикой. Даже претензии можно предъявлять если вы в ней что-то не понимаете к самой 1С. Хотя какие претензии, исходный код открыть — изучай, не хочу…

Еще чем мне нравится эта обработка — тем что вы читаете данные из внешнего источника, показываете их с помощью объекта табличное поле и только затем выбираете алгоритм загрузки в 1С. При чем загрузка у Вас происходит в среде 1С без привлечения дополнительных компонентов. Без всяких выпадов в неизвестный объект OLE, полей которые не прочитались в обработке загрузки. Если вы видете данные в табличном поле, то они и будут грузиться по вашему алгоритму.

Но что-то в ней не хватает. Конечно стандарта офисных документов ODF (Open Document Format и между прочим ГОСТ Р ИСО/МЭК 26300-2010). Как говаривал мой начальник — есть чем себя занять. Из всех внешних загрузок, которые сейчас есть к сожалению самыми распостраненными являются OLE(Com+) технологии. Возможно что-то еще появиться, но пока примемся за них.

Залезаем в код и видим несколько однотипных функуций

Функция мПрочитатьТабличныйДокументИзExcel(ТабличныйДокумент, ИмяФайла, НомерЛистаExcel = 1) Экспорт

Функция мПрочитатьТабличныйДокументИзТекста(ТабличныйДокумент, ИмяФайла, НомерЛистаExcel = 1) Экспорт

Пора добавить свою:

// Функция считывает в табличный документ данные из файла в формате ODF Calc(ods)
//
// Параметры:
// ТабличныйДокумент — ТабличныйДокумент, в который необходимо прочитать данные
// ИмяФайла — имя файла в формате ODF, из которого необходимо прочитать данные
// НомерЛистаCalc — номер листа книги Calc, из которого необходимо прочитать данные
//
// Возвращаемое значение:
// Истина, если файл прочитан, Ложь — иначе
//
Функция мПрочитатьТабличныйДокументИз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;

Возврат Истина;

КонецФункции

И добавим в форму выбора файла ods по тексту.

ДиалогВыбораФайла.Фильтр = «Табличный документ (*.mxl)|*.mxl|Лист Calc (*.ods)|*.ods|Лист Excel (*.xls)|*.xls|Текстовый документ (*.txt)|*.txt|dBase III (*.dbf)|*.dbf|»;

И выбор функции для ods

ИначеЕсли нРег(ФайлНаДиске.Расширение) = «.ods» Тогда
мПрочитатьТабличныйДокументИзCalc(ТабличныйДокумент,ДиалогВыбораФайла.ПолноеИмяФайла);

Вот так лучше.

Скачать обработку можно с Инфостарта http://infostart.ru/public/158951/

 

Другие подобные ссылки:

http://help1c.com/faq82/view/1225.html

3 комментария к “Добавим документы ODF (OpenOffice/LibreOffice) в стандартную обработку Загрузки Табличного документа из 1С.

Добавить комментарий