Имя: Пароль:
1C
1C 7.7
v7: Декодировать большой файл из Base64
, ,
0 Volodja
 
25.10.22
08:09
Написал такую функцию для декодирования Base64-файла в двоичный:
Функция глДекодироватьФайл_из_Base64(_Путь) Экспорт
    Если ФС.СуществуетФайл(_Путь)=0 Тогда
        Предупреждение("Не существует файл - "+_Путь);
        Возврат "";
    КонецЕсли;
    objXML = CreateObject("MSXml2.DOMDocument");
    objDocElem = objXML.createElement("tmp");
    objDocElem.DataType = "bin.base64";

    objStream = CreateObject("ADODB.Stream");
    //objStream.Type = 1;
    //objStream.Mode = 3;
    objStream.Open();
    objStream.LoadFromFile(_Путь);
    base64text=objStream.ReadText();
        //олеШелл = СоздатьОбъект("MSScriptControl.ScriptControl");
       //олеШелл.Language = "javascript";
    //олеШелл.AddObject("objStream", objStream);
       //олеШелл.AddObject("objDocElem", objDocElem);
       //олеШелл.Eval("objDocElem.text = objStream.ReadText()");
       objDocElem.text = base64text;
    
    objStream = CreateObject("ADODB.Stream");
    objStream.Type = 1;
    objStream.Mode = 3;
    objStream.Open();
    
    олеШелл = СоздатьОбъект("MSScriptControl.ScriptControl");
    олеШелл.Language = "vbscript";
    олеШелл.AddObject("objStream", objStream);
    олеШелл.AddObject("objDocElem", objDocElem);

    олеШелл.Eval("objStream.Write(objDocElem.NodeTypedValue)");
    врмФайл=ПолучитьВременныйФайл("bin");
    objStream.SaveToFile(врмФайл, 2);
    Возврат врмФайл;
КонецФункции
//*********************
Если файл до 300KB, то все OK. А мне нужно декодировать файлы более 1MB
Получив большой файл, 1С падает. Есть другой способ декодирования?
Перепробовал несколько.Падает на всех известных мне.
1 Volodja
 
25.10.22
08:17
(0) Падает на строке
    objDocElem.text = base64text;
2 asady
 
25.10.22
08:34
(0) MSXML 4.0 / 3.0 ???
3 NorthWind
 
25.10.22
08:40
(0) ну вот люди комстроковую утилиту нашли https://forum.script-coding.com/viewtopic.php?id=8594
4 trad
 
25.10.22
08:51
5 Volodja
 
25.10.22
09:00
(4) У меня запрос отрабатывает. я сохраняю полученный base64өфайл на диск. Он появляется
А при декодировании падает
(2) objXML = CreateObject("Msxml2.DOMDocument.6.0"); Похоже, что шестая, объект так создается
6 trad
 
25.10.22
09:02
(5) там про падение 1с при передаче длинной строки в комобъект и способ решение - oleexsup
7 Volodja
 
25.10.22
09:14
(6)
    ЗагрузитьВнешнююКомпоненту("D:\1sb\DLL\OLEExSup.dll");   //Версия продукта 1.0.0.7
    OleExSup = СоздатьОбъект("OLEExSup");
    OleExSup.InvokeOLEMethod(objDocElem, "text", base64text);

//*****************Выдал
OleExSup.InvokeOLEMethod(objDocElem, "text", base64text);
{Глобальный модуль(6021)}: 0x80020003 : Член группы не найден.
Как правильно вызвать?
8 Volodja
 
25.10.22
09:20
(7) Вернее 1.0.0.7- это версия файла
Версия продукта - 1.0.0.0
9 asady
 
25.10.22
09:32
10 trad
 
25.10.22
09:33
.text - это не метод, а свойство

из документации к oleexsup

Класс OLEExSup :: УстановитьСвойство / PutProperty
Синтаксис: УстановитьСвойство(ОЛЕОбъект, Свойство, Значение)

Параметры:

ОЛЕОбъект - объект реализующий интерфейс IDispatch
Свойство - тип: Строка, название свойства ОЛЕ-объекта
Значение - тип: Любой, значение свойства объекта
Описание: Выполняет установку значения свойства через интерфейс IDispatch.
11 Volodja
 
25.10.22
09:52
(10) Спасибо. Хелп тоже нашел
Блин теперь если беру объект:
  objXML = CreateObject("MSXml2.DOMDocument.6.0");

ОлеШелл.Eval("objStream.Write(objDocElem.NodeTypedValue)");
{Глобальный модуль(6036)}: msxml6.dll: Параметр задан неверно
А если
  objXML = CreateObject("MSXml2.DOMDocument");

То ругается что нет свойства
OleExSup.PutProperty(objDocElem, "text", base64text);
{D:\1SB\EXTFORMS\TEST_BASE64.ERT(67)}: 0x80004005 : Неопознанная ошибка
12 Volodja
 
25.10.22
10:03
(10) Вернее ругается, что со свойством что-то не так
OleExSup.PutProperty(objDocElem, "text", base64text);
{D:\1SB\EXTFORMS\TEST_BASE64.ERT(67)}: 0x80004005 : Неопознанная ошибка

Возникает также, если файл большой.
Если до 300KB , то все ОК
13 trad
 
25.10.22
10:19
(12) скорее всего в base64text не base64
14 Volodja
 
25.10.22
10:27
(13) Я его в этом формате получаю запросом. Заявлено, что Base64
15 trad
 
25.10.22
10:29
вот это добавь
objStream.Charset = "windows-1251";
16 Volodja
 
25.10.22
10:37
(15) Нарыл,  что на боьшом файле выдает абракадабру. На малых, до 300KB, нормально
    objStream = CreateObject("ADODB.Stream");
    objStream.Open();
    objStream.LoadFromFile(_Путь);
    base64text=objStream.ReadText();
    Сообщить(Лев(base64text,30));
    Сообщить(Прав(base64text,30));
17 trad
 
25.10.22
10:38
протестировал - работает

    objXML = CreateObject("MSXml2.DOMDocument");
    objDocElem = objXML.createElement("tmp");
    objDocElem.DataType = "bin.base64";
    
    objStream = CreateObject("ADODB.Stream");
    objStream.Charset = "windows-1251";
    objStream.Open();
    objStream.LoadFromFile("d:\test.txt");
    base64text = objStream.ReadText();
    
    Сообщить(Лев(base64text, 100));
    
    OleExSup = СоздатьОбъект("OLEExSup");
    OleExSup.PutProperty(objDocElem, "text", base64text);
    
    Сообщить(Лев(objDocElem.text, 100));


в test.txt base64 размером 1.5мб
18 Volodja
 
25.10.22
10:38
(15)    
objStream.Charset = "windows-1251";
И на малых с этим пургу стал выдывать
19 trad
 
25.10.22
10:39
+ проверь чтобы в файле не было BOM
20 trad
 
25.10.22
10:40
(18) файл-то в какой кодировке хоть?
21 Volodja
 
25.10.22
10:42
(20) А на большом нормально выдает с objStream.Charset = "windows-1251";
22 Volodja
 
25.10.22
10:46
Сохранял малые Base так
    objStream = CreateObject("ADODB.Stream");
    //objStream.Type = 2;
    //objStream.Mode = 3;
    objStream.Open();
    objStream.WriteText(textBase64);
    objStream.SaveToFile(врмФайл, 2);
NotePad++ показывает, что кодировка UTF 16 c BOM
Спасибо.Сейчас без BOM сделаю
23 Volodja
 
25.10.22
11:03
Спасибо, Trad. Все получилось с вашей OLEExSup.dll