Версия для печати темы (https://pro1c.org.ua/index.php?s=336b002133f53ca908de581e4e7f7694&showtopic=67508)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Загрузка документа в Excel. Формат файла не поддерживается

Автор: Slon747 15.03.24, 7:59

ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Прочитать("D:\Temp\123.xls", СпособЧтенияЗначенийТабличногоДокумента.Значение);


Сохраняю на диск банковские выписки из "Приват24 для бизнеса".
При попытке загрузить в ТабличныйДокумент возникает ошибка:
Ошибка при выполнении файловой операции . Формат файла не поддерживается.

Открываю документ в Excel и сохранить его (после этого размер файла увеличивается).
После этого загрузка проходит нормально.
Как до так и после пересохранения формат файла не меняется (в заголовке символы "РПаЎ±б").
Ни версия платформы 1С, ни изменение расширения файла на это влияет.
Чтобы обойти эту проблему, перед чтением документа в табличный документ, запускаю Application.Excel, открываю его и пересохраняю.
Но если на пк не установлен Excel, то это уже не поможет.

Можно ли как-то это исправить?
Или есть ли какая-то утилита для или способ открытия/сохранения документа excel без установленного Excel?

Автор: AnryMc 15.03.24, 8:18

Slon747 @ Сегодня, 8:59 * ,

Обратиться в поддержку Приват...
09000000.gif

Цитата(Slon747 @ 15.03.24, 8:59) *
(после этого размер файла увеличивается)



Какой формат файла Excel?

Автор: Slon747 15.03.24, 8:53

Цитата(AnryMc @ 15.03.24, 8:18) *
Обратиться в поддержку Приват...

Не думаю, что поможет.
Это продолжается годами на разных ФОП и в офисных программах данный документ открывается без проблем.

Цитата(AnryMc @ 15.03.24, 8:18) *
Какой формат файла Excel?

XLS

Автор: AnryMc 15.03.24, 9:46

Цитата(Slon747 @ 15.03.24, 8:59) *
Или есть ли какая-то утилита для или способ открытия/сохранения документа excel без установленного Excel?


Такого не попадалось, но если в "Приват24 для бизнеса" есть выгрузка в другие форматы. например CSV, DBF или XML то есть вероятность найти конверторы

З.Ы. Хотя если есть XML - то в "потоке" он тоже читается

AnryMc @ Сегодня, 10:27 * ,

Кстати при чтение Табличного документа в "потоке" есть
ТипФайлаТабличногоДокумента

ANSITXT (ANSITXT)
DOCX (DOCX)
DOCX2010 (DOCX2010)
HTML (HTML)
HTML3 (HTML3)
HTML4 (HTML4)
HTML5 (HTML5)
MXL (MXL)
MXL7 (MXL7)
ODS (ODS)
PDF (PDF)
PDF_A_1 (PDF_A_1)
TXT (TXT)
XLS (XLS)
XLS95 (XLS95)
XLS97 (XLS97)
XLSX (XLSX)
XLSX2010 (XLSX2010)

Так что можно попробовать "поиграть" нижними вариантами...

Что-то типа
ТабличныйДокумент = Новый ТабличныйДокумент;
дд = Новый ДвоичныеДанные("D:\Temp\123.xls");
ТабличныйДокумент.Прочитать(дд, СпособЧтенияЗначенийТабличногоДокумента.Значение, ТипФайлаТабличногоДокумента.XLS97);

Автор: Slon747 15.03.24, 9:55

Цитата(AnryMc @ 15.03.24, 9:46) *
Такого не попадалось, но если в "Приват24 для бизнеса" есть выгрузка в другие форматы. например CSV, DBF или XML то есть вероятность найти конверторы


С DBF проблем нет.
Кроме того даже есть API для получения данных через HTTP.
Но хотел решить проблемы с excel.

Цитата(AnryMc @ 15.03.24, 9:46) *
Кстати при чтение Табличного документа в "потоке" есть ТипФайлаТабличногоДокумента

А как в потоке загружать данные в ТабличныйДокумент?

Автор: AnryMc 15.03.24, 10:06


Цитата(Slon747 @ 15.03.24, 10:55) *
А как в потоке загружать данные в ТабличныйДокумент?


Цитата(AnryMc @ 15.03.24, 10:46) *
Что-то типа

ТабличныйДокумент = Новый ТабличныйДокумент;
дд = Новый ДвоичныеДанные("D:\Temp\123.xls");
ТабличныйДокумент.Прочитать(дд, СпособЧтенияЗначенийТабличногоДокумента.Значение, ТипФайлаТабличногоДокумента.XLS97);


Автор: sava1 15.03.24, 10:50

Цитата(AnryMc @ 15.03.24, 10:06) *
Что-то типа

ТабличныйДокумент = Новый ТабличныйДокумент;
дд = Новый ДвоичныеДанные("D:\Temp\123.xls");
ТабличныйДокумент.Прочитать(дд, СпособЧтенияЗначенийТабличногоДокумента.Значение, ТипФайлаТабличногоДокумента.XLS97);


А сам поток где?

типа так
Поток = ДвоичныеДанные.ОткрытьПотокДляЧтения();
ТабДок.Прочитать(Поток);
Поток.Закрыть();


Цитата(AnryMc @ 15.03.24, 9:46) *
Кстати при чтение Табличного документа в "потоке" есть
ТипФайлаТабличногоДокумента

ANSITXT (ANSITXT)
DOCX (DOCX)
DOCX2010 (DOCX2010)
HTML (HTML)
HTML3 (HTML3)
HTML4 (HTML4)
HTML5 (HTML5)
MXL (MXL)
MXL7 (MXL7)
ODS (ODS)
PDF (PDF)
PDF_A_1 (PDF_A_1)
TXT (TXT)
XLS (XLS)
XLS95 (XLS95)
XLS97 (XLS97)
XLSX (XLSX)
XLSX2010 (XLSX2010)


а откуда это взялось ?

из справки

Цитата
Описание варианта метода:
Чтение табличного документа из потока.
При чтении из потока допускается использование только следующих форматов: MXL, MXL7, ODS.


Автор: Slon747 15.03.24, 10:59

AnryMc @ Сегодня, 10:06 * ,
sava1 @ Сегодня, 10:50 * ,

Спасибо, не знал что можно читать из потока.
Но все равно не прочитал.
Значит, не судьба.

P.S. Кстати, документ excel можно открыть прямо из Предприятия (не знал).
И данный документ в нем тоже не открывается с такой же ошибкой.

Автор: sava1 15.03.24, 11:07

Slon747,

там скорее действительно не играет формат - бывало такое.

юзайте другой вариант

Автор: denis84 15.03.24, 14:35

а якщо спробувати перейменовувати(копыювати) файл, а потым выдкривати ы считувати

Автор: Slon747 15.03.24, 16:49

Цитата(denis84 @ 15.03.24, 14:35) *
а якщо спробувати перейменовувати(копыювати) файл, а потым выдкривати ы считувати

Пробував, не допомогло. Завантажені файли не коректні.
У результаті зробив перезбереження через OLE.
Якщо встановлено ексел, то через нього, інакше через OpenOffice

Автор: alex_shkut 19.03.24, 14:42

Slon747 @ 15.03.24, 16:49 * ,
В напрямку LibreOffice не дивилися? Я усе через нього роблю.

Процедура ЗагрузитьИзФайла()
    ТипФайла = 0; //0-файл не прочитан,1- для МС Экселя,2- для ОпенОфиса
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Фильтр = "Табличный документ(*.xls)|*.xls|Табличный документ(*.xlsx)|*.xlsx";
    Если не Диалог.Выбрать() Тогда
        Возврат;
    КонецЕсли;
    Если ДанныеФайла.Количество()>0 Тогда
        Режим = РежимДиалогаВопрос.ДаНет;
        Текст = "ru = ""Табличная часть будет очищена, продолжить?"";"
         + " uk = ""Таблична частина буде очищена, продовжити?""";
        Ответ = Вопрос(НСтр(Текст), Режим, 0);
    КонецЕсли;
    Если Ответ = КодВозвратаДиалога.Нет Тогда
        Возврат;
    КонецЕсли;
    ТабЗн = Новый ТаблицаЗначений;
    Попытка
        ТабЗн.Прочитать(Диалог.ПолноеИмяФайла);
        ТипФайла = 1;
    Исключение
    КонецПопытки;
    Если ТипФайла=0 Тогда
        Попытка
            ТабЗн=ОО.ЗагрузитьТЗизФайла(Диалог.ПолноеИмяФайла,1);
            ТипФайла = 2;
        Исключение
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Не найдено подходящего приложения для загрузки файла"+Символы.ПС+ОписаниеОшибки();
            Сообщение.Сообщить();
            Возврат;
        КонецПопытки;
    КонецЕсли;
    ДанныеФайла.Очистить();
    Шкут_Общий.ДополнитьКолонкиТаблицыЗначений(ДанныеФайла,ТабЗн);
    ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТабЗн,ДанныеФайла);
    ДанныеФайла.Колонки.Добавить("Проект",Новый ОписаниеТипов("СправочникСсылка.Проекты"));
    ДанныеФайла.Колонки.Добавить("Счет",Новый ОписаниеТипов("ДокументСсылка.СчетНаОплатуПокупателю"));
    ДанныеФайла.Колонки.Добавить("Корр",Новый ОписаниеТипов("ДокументСсылка.КорректировкаДолга"));
    
    ЭлементыФормы.ДанныеФайла.СоздатьКолонки();
    Для Каждого Колонка из ЭлементыФормы.ДанныеФайла.Колонки Цикл
        Колонка.Ширина = 4;
    КонецЦикла;
    
        
КонецПроцедуры

Процедура КоманднаяПанель2ВосстановитьДаты(Кнопка)
    Колонка = ЭлементыФормы.ДанныеФайла.ТекущаяКолонка;
    Для Каждого Строка из ДанныеФайла Цикл
        Если ЗначениеЗаполнено(Строка[Колонка.Имя]) Тогда
            Попытка
                Строка[Колонка.Имя] = Дата("19000101")+((Строка[Колонка.Имя]-2)*24*60*60);
            Исключение
            КонецПопытки;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры


Код загального модуля ОО:
функция ПривестиФайлКУРЛ(ПутьКФайлу)

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

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

Функция ЗагрузитьТЗизФайла(ПутьКФайлу,текЛист=1,Знач endCol=0) Экспорт

    //OpenOffice Calc//
    Попытка
            ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
    Исключение
            Предупреждение(ОписаниеОшибки() + Символы.ПС + "программа OpenOffice\LibreOffice не установлена на данном компьютере!");
    Возврат Неопределено;
    КонецПопытки;
    
    Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");
    Свойства = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
    Свойства.Name = "AsTemplate";
    Свойства.Value = Истина;
    Args = Новый COMSafeArray("VT_VARIANT", 2);
    Args.SetValue(0, Свойства);
    Свойства1 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
    Свойства1.Name = "Hidden";
    Свойства1.Value = Истина;
    Args.SetValue(1,Свойства1);
    Попытка
        FileProvider=ServiceManager.createInstance("com.sun.star.ucb.FileContentProvider");
        URL=FileProvider.getFileURLFromSystemPath("",ПутьКФайлу);
        Document = Desktop.LoadComponentFromURL(URL, "_blank", 0, Args);
    Исключение
        ServiceManager = Неопределено;
    КонецПопытки;
    Sheets = Document.getSheets();
    Если Sheets.Count<текЛист Тогда
        Сообщить("Количество страниц в файле меньше, чем запрошено");
        ServiceManager = Неопределено;
        Возврат Неопределено;
    КонецЕсли;
    Sheet = Sheets.getByIndex(текЛист-1);
    Курсор   = Sheet.createCursor();
    Курсор.gotoEndOfUsedArea(Истина);
    endCol   = Курсор.Columns.Count - 1;
    endRow  = Курсор.Rows.Count - 1;
    begCol = 0;
    begRow = 0;
    нКол = 0;
    локТабЗнач = Новый ТаблицаЗначений;
    локТабЗнач.Колонки.Очистить();
    КС = Новый КвалификаторыСтроки();
    Массив = Новый Массив;
    Массив.Добавить(Тип("Строка"));
    ОписаниеТиповСтрока = Новый ОписаниеТипов(Массив, , КС);
    Пока нКол <= endCol Цикл
        ИмяКол = "К"+Строка(нкол+1);
        локТабЗнач.Колонки.Добавить(ИмяКол,ОписаниеТиповСтрока);
        нКол = нКол + 1;
    КонецЦикла;
    Range = Sheet.getCellRangeByPosition(begCol, begRow, endCol, endRow);
    МассивКом = Новый COMSafeArray("VT_VARIANT", Range.Columns.Count, Range.Rows.Count);
    МассивКом = Range.getDataArray();
    тмпПростойМассив = МассивКом.Выгрузить();
    Для каждого массив из тмпПростойМассив Цикл
         ит = 0;
         НовСтрока = локТабЗНач.Добавить();
         Для каждого ЭлементМассива из массив цикл
               НовСтрока[ит] = ЭлементМассива;
               ит = ит + 1;
         КонецЦикла;
    КонецЦикла;
    Document.Close(True);
    Document = Неопределено;
    
    ServiceManager = Неопределено;
    Возврат локТабЗнач;

КонецФункции
  
Процедура ВыгрузитьТЗвФайл(ТаблицаРезультата) Экспорт

    //OpenOffice Calc///////////////////////////////////////////////////////////////////////////
    Попытка
        ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
    Исключение
        Предупреждение(ОписаниеОшибки() + Символы.ПС + "программа OpenOffice не установлена на данном компьютере!");
        Возврат;
    КонецПопытки;
    Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");
    Свойства = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
    Свойства.Name = "AsTemplate";
    Свойства.Value = Истина;
    Args = Новый COMSafeArray("VT_VARIANT", 3);
    Args.SetValue(0, Свойства);
    Свойства1 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
    Свойства1.Name = "Hidden";
    Свойства1.Value = Истина;
    Args.SetValue(1, Свойства1);
    Document = Desktop.LoadComponentFromURL("private:factory/scalc", "_blank", 0, Args);
    Sheets = Document.getSheets();
    Sheet = Sheets.getByIndex(0);
    мИтКол = 0;
    Для каждого кол из ТаблицаРезультата.Колонки Цикл
        Sheet.getCellByPosition(мИтКол,0).setString(кол.Имя);
        мИтКол = мИтКол + 1;
    КонецЦикла;
  
    ВсегоСтрок = ТаблицаРезультата.Количество();
    ВсегоКолонок = ТаблицаРезультата.Колонки.Количество();
    МассивКОМ = Новый COMSafeArray("VT_VARIANT", ВсегоСтрок,ВсегоКолонок);
    иткол = 0;
    итстр = 0;

    Для каждого стр из ТаблицаРезультата Цикл
        Для каждого кол из ТаблицаРезультата.Колонки Цикл
            стрРез = СокрЛП(стр[кол.Имя]);
            МассивКОМ.SetValue(итстр,иткол,стрРез);
            иткол = иткол+1;
         КонецЦикла;
        иткол = 0;
        итстр = ?(итстр=ВсегоСтрок,0,итстр+1);
    КонецЦикла;
    begCol = 0;
    begRow = 1;
    endCol = ВсегоКолонок-1;
    endRow = ВсегоСтрок;
    Range = Sheet.getCellRangeByPosition(begCol, begRow, endCol, endRow);
    Range.setDataArray(МассивКОМ);
    //Document.storeToURL(ПривестиФайлКУРЛ(ПутьКФайлу),Args);
    Свойства2 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
    Свойства2.Name = "FilterName";
    Свойства2.Value = "MS Excel 97";
    Args.SetValue(2,Свойства2);
    Document.GetCurrentController().GetFrame().GetContainerWindow().SetVisible(Истина);
    //Document.storeToURL(ПривестиФайлКУРЛ(ФайлКартотеки),Args);

КонецПроцедуры


І код з мого власного модуля:
Процедура ДополнитьКолонкиТаблицыЗначений(ТаблицаБазовая,ТаблицаДополнений) Экспорт

    Для каждого Колонка из ТаблицаДополнений.Колонки Цикл

        Если Не(ТаблицаБазовая.Колонки.Найти(Колонка.Имя) = Неопределено) тогда
            //Колонка уже есть
            Продолжить;
        КонецЕсли;

        ТаблицаБазовая.Колонки.Добавить(Колонка.Имя,Колонка.ТипЗначения,Колонка.Заголовок,Колонка.Ширина);

    КонецЦикла;

КонецПроцедуры

Автор: Slon747 19.03.24, 15:46

alex_shkut @ Сегодня, 14:42 * ,

Я теж через OLE зробив, тільки простіше.
Якщо при відкритті помилка, перезберегаю в офісі (Excel або OpenOffice якщо нема MS) та знова завантажую в ТабличныйДокумент.

Функция ПерезаписатьДокументExcel(ИмяФайла) Экспорт

    Excel        = Неопределено;
    OpenOffice  = Неопределено;
    
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
    Исключение
    КонецПопытки;
    
    Если Excel = Неопределено Тогда
        Попытка
            OpenOffice = Новый COMОбъект("com.sun.star.ServiceManager");
        Исключение
        КонецПопытки;
    КонецЕсли;
    
    Если Excel <> Неопределено Тогда
        Попытка
            Книга = Excel.WorkBooks.Open(ИмяФайла);
            Excel.DisplayAlerts = 0;
            Excel.WorkBooks(1).Save();
            Книга.Close();
            Excel.Application.Quit();
            Возврат Истина;
        Исключение
            Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
            Excel.Application.Quit();
            Возврат Ложь;
        КонецПопытки;
    КонецЕсли;
    
    Если OpenOffice <> Неопределено Тогда
        Попытка
            scr = Новый ComОбъект("MSScriptControl.ScriptControl");    
            scr.language = "javascript";
            scr.eval("MassivParametrov = new Array()");
            MassivParametrov = scr.eval("MassivParametrov");
            scr.AddObject("OpenOffice", OpenOffice);
            scr.eval("MassivParametrov[0]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
            scr.eval("MassivParametrov[0].Name='Hidden'");
            scr.eval("MassivParametrov[0].Value=true");
            
            Desktop = OpenOffice.CreateInstance("com.sun.star.frame.Desktop"); // Создаем Desktop
            URL = ConvertToURL(ИмяФайла); //правильно формируем имя файла
            Doc = Desktop.LoadComponentFromURL(URL, "_blank", 0, MassivParametrov);
            
            Doc.lockControllers();
            Doc.addActionLock();
            
            Sheets = Doc.GetSheets();
            Лист = Sheets.GetByIndex(0); // Открываем первый лист по индексу
            
            Doc.store();
            Doc.close(Истина);
            Desktop.terminate();
            Возврат Истина;
        Исключение
            Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
        КонецПопытки;
    КонецЕсли;
    
    Возврат Ложь;

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

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

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

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua