Можно ли программно использовать встроенный в платформу 7.7 zip-архиватор
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Вы видите в Синтакс-Помощнике 7.7 раздел "Работа с архивами"?
Если даже и найдете, то не забывайте: zip, 7z и arj - это разные методы архивации.
P.S. Используйте КомандаСистемы() и консольные утилиты соответствующих архиваторов. Или можно какую-нибудь ВК поискать.
Если даже и найдете, то не забывайте: zip, 7z и arj - это разные методы архивации.
P.S. Используйте КомандаСистемы() и консольные утилиты соответствующих архиваторов. Или можно какую-нибудь ВК поискать.
Извлечение ZIP с помощью DialMail.dll
Функция ИзвлечьИзАрхива1(ИмяАрхива,СтрОшибка)
Если ЗагрузитьВнешнююКомпоненту("DialMail.dll")=0 Тогда
СтрОшибка = СтрОшибка + "Не удалось обнаружить компоненту DialMail.dll!"+РазделительСтрок;
СтрОшибка = СтрОшибка + "Распакуйте архив самостоятельно или скопируйте компоненту в каталог базы данных и повторите попытку!";
Возврат "";
КонецЕсли;
Попытка
Архиватор=СоздатьОбъект("AddIn.ZIP");
Исключение
СтрОшибка = СтрОшибка + "Не удалось создать объект AddIn.ZIP!";
Возврат "";
КонецПопытки;
Если Архиватор.УстановитьАрхивТекущим(СокрЛП(ИмяАрхива))=0 Тогда
СтрОшибка = СтрОшибка + "Ошибка чтения из архива, либо файл не является архивом в формате ZIP. ";
Возврат "";
КонецЕсли;
Архиватор.КаталогИзвлечения=КаталогВременныхФайлов();
ФайловАрхива=Архиватор.КоличествоФайлов();
Если ФайловАрхива = 0 Тогда
Сообщить("В скаченном архиве нет файлов!");
Возврат "";
ИначеЕсли ФайловАрхива > 1 Тогда
Сообщить("В скаченом архиве файлов больше чем один! беру первый!");
КонецЕсли;
ИмяФайлаИзАрхива = Архиватор.ПолучитьИмяФайла(1);
Поз=Архиватор.Извлечь(,ИмяФайлаИзАрхива);
Если Поз=0 Тогда
Архиватор.КаталогИзвлечения=ПолучитьКаталогХраненияФайла(ИмяАрхива);
Поз=Архиватор.Извлечь(,ИмяФайлаИзАрхива);
Если Поз=0 Тогда
СтрОшибка = СтрОшибка + "Не удалось извлечь ни одного файла из архива! ";
Возврат "";
КонецЕсли;
КонецЕсли;
ПолнИмяФайлаИзАрхива = Архиватор.КаталогИзвлечения+ИмяФайлаИзАрхива;
Если ФС.СуществуетФайл(ПолнИмяФайлаИзАрхива) = 0 Тогда
Возврат "";
КонецЕсли;
Возврат ПолнИмяФайлаИзАрхива;
КонецФункции // ИзвлечьИзАрхива1()
Показать
Извлечение с помощью 7za.exe (сам файл положить в ExtForms\7zip\7za.exe)
использую для архивов *.7z
И по аналогии для RAR
использую для архивов *.7z
Функция ИзвлечьИзАрхива2(ИмяАрхива,СтрОшибка)
ПутьК7zaexe = КаталогИБ()+"ExtForms\7zip\7za.exe";
Если ФС.СуществуетФайл(ПутьК7zaexe) = 0 Тогда
СтрОшибка = СтрОшибка + "В каталоге базы отсутствует 7za.exe. ";
Возврат "";
КонецЕсли;
КаталогИзвлечения = """"+КаталогВременныхФайлов()+"""";
ЛогИзвлеченияИмяФайла = КаталогВременныхФайлов()+"list.txt";
ЛогИзвлечения = """"+ЛогИзвлеченияИмяФайла+"""";
ТекстКоманды = ПутьК7zaexe+" e "+""""+ИмяАрхива+""""+" -o"+КаталогИзвлечения+" -y"+" > " +ЛогИзвлечения;
КомандаСистемы(ТекстКоманды);
Если ФС.СуществуетФайл(ЛогИзвлеченияИмяФайла) = 0 Тогда
СтрОшибка = СтрОшибка + "Не удалось распаковать архив с помощью 7za.exe. ";
Возврат "";
КонецЕсли;
СтрЛист = "";
ПолнИмяФайлаИзАрхива = "";
ЛистТекст = СоздатьОбъект("Текст");
ЛистТекст.КодоваяСтраница(1);
ЛистТекст.Открыть(ЛогИзвлеченияИмяФайла);
СчСтрок = 0;
Для СчСтрок = 1 По ЛистТекст.КоличествоСтрок() Цикл
СтрЛист = ЛистТекст.ПолучитьСтроку(СчСтрок);
Если Лев(СтрЛист,12) = "Extracting " Тогда
Если ПустоеЗначение(ПолнИмяФайлаИзАрхива) = 1 Тогда
ПолнИмяФайлаИзАрхива = КаталогВременныхФайлов()+Сред(СтрЛист,13);
Если ФС.СуществуетФайл(ПолнИмяФайлаИзАрхива) = 0 Тогда
ПолнИмяФайлаИзАрхива = "";
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Лев(СтрЛист,16) = "Everything is Ok" Тогда
Возврат ПолнИмяФайлаИзАрхива;
КонецЕсли;
КонецЦикла;
Возврат "";
КонецФункции // ИзвлечьИзАрхива2()
ПоказатьИ по аналогии для RAR
Функция ИзвлечьИзАрхиваРар(ИмяАрхива,СтрОшибка)
ПутьКrarexe = КаталогИБ()+"ExtForms\7zip\rar.exe";
Если ФС.СуществуетФайл(ПутьКrarexe) = 0 Тогда
СтрОшибка = СтрОшибка + "В каталоге базы отсутствует rar.exe. ";
Возврат "";
КонецЕсли;
КаталогИзвлечения = """"+КаталогВременныхФайлов()+"""";
ЛогИзвлеченияИмяФайла = КаталогВременныхФайлов()+"list.txt";
ЛогИзвлечения = """"+ЛогИзвлеченияИмяФайла+"""";
ТекстКоманды = ПутьКrarexe+" e -o+ -y "+""""+ИмяАрхива+""""+" "+КаталогИзвлечения+" "+" > " +ЛогИзвлечения;
КомандаСистемы(ТекстКоманды);
Если ФС.СуществуетФайл(ЛогИзвлеченияИмяФайла) = 0 Тогда
СтрОшибка = СтрОшибка + "Не удалось распаковать архив с помощью 7za.exe. ";
Возврат "";
КонецЕсли;
СтрЛист = "";
ПолнИмяФайлаИзАрхива = "";
ЛистТекст = СоздатьОбъект("Текст");
ЛистТекст.КодоваяСтраница(1);
ЛистТекст.Открыть(ЛогИзвлеченияИмяФайла);
СчСтрок = 0;
Для СчСтрок = 1 По ЛистТекст.КоличествоСтрок() Цикл
СтрЛист = ЛистТекст.ПолучитьСтроку(СчСтрок);
Если Лев(СтрЛист,12) = "Extracting " Тогда
Если ПустоеЗначение(ПолнИмяФайлаИзАрхива) = 1 Тогда
ПолнИмяФайлаИзАрхива = Сред(СтрЛист,13);
ПолнИмяФайлаИзАрхива = Лев(ПолнИмяФайлаИзАрхива,Найти(ПолнИмяФайлаИзАрхива," ")-1);//имя файла заканчивается на 5 пробелов
Если ФС.СуществуетФайл(ПолнИмяФайлаИзАрхива) = 0 Тогда
ПолнИмяФайлаИзАрхива = "";
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Лев(СтрЛист,16) = "All OK" Тогда
Возврат ПолнИмяФайлаИзАрхива;
КонецЕсли;
КонецЦикла;
Возврат "";
КонецФункции // ИзвлечьИзАрхиваРар()
Показать
Есть вариант использовать 1С++.
Если ЗагрузитьВнешнююКомпоненту("1CPP.dll") = 1 Тогда
_бд = СоздатьОбъект("BinaryData");
_бд.Zip("d:\Temp\1.zip *.xls"); // добавить в архив 1.zip на диске D: в папке Temp все экселевские файлы
_бд.UnZip("d:\Temp\1.zip"); // разархивировать архив 1.zip на диске D: в папке Temp
КонецЕсли;
Добрый день!
использование внешних компонент не всегда доступно, особенно при работе на серверах заказчиков. Вариант с запуском VB скрипта менее проблемный:
Ну и ни кто не мешает создать Объекты в коде 1с :) пример:
использование внешних компонент не всегда доступно, особенно при работе на серверах заказчиков. Вариант с запуском VB скрипта менее проблемный:
Dim sh As Object
Set sh = CreateObject("Shell.Application")
Dim oFSO
Set oFSO = CreateObject("Scripting.FileSystemObject")
If oFSO.FileExists(zipArchivePath) Then oFSO.DeleteFile zipArchivePath, True
iErr = Err.Number
On Error GoTo 0
Set fTarget = sh.Namespace((zipArchivePath))
If fTarget Is Nothing Then
oFSO.CreateTextFile(zipArchivePath).Write "PK" & Chr(5) & Chr(6) & String(18, Chr(0))
Set oFSO = Nothing
iErr = Err.Number
On Error GoTo 0
End If
sh.Namespace((zipArchivePath)).CopyHere sh.Namespace((addPath)).Items, 4
Do Until sh.Namespace((zipArchivePath)).Items.Count = sh.Namespace((addPath)).Items.Count
''Sleep 500
Loop
Set sh = Nothing
ПоказатьНу и ни кто не мешает создать Объекты в коде 1с :) пример:
Функция ShellApp()
Попытка
shell = СоздатьОбъект("shell.application");
Исключение
Сообщить("Не удалось создать объект shell.application!");
Возврат 0;
КонецПопытки;
возврат shell;
КонецФункции
Показать
(9) и небольшое продолжение
Function fZip(zipArchivePath, addPath)
sh = ShellApp();
oFSO = CreateObject("Scripting.FileSystemObject");
If oFSO.FileExists(zipArchivePath) = 1 Then
oFSO.DeleteFile(zipArchivePath);
EndIf;
fTarget = sh.Namespace(zipArchivePath);
If fTarget <> "" Then
oFSO.CreateTextFile(zipArchivePath).Write("PK" + Chr(5) + Chr(6) + string(chr(0)+chr(0)+chr(0)+chr(0)+chr(0)+chr(0)+chr(0)+chr(0)
+chr(0)+chr(0)+chr(0)+chr(0)+chr(0)+chr(0)+chr(0)+chr(0)+chr(0)+chr(0))); //string(18,chr(0)) "PK "
EndIf;
sh.Namespace(zipArchivePath).CopyHere(sh.Namespace(addPath).Items, 4);
EndFunction
Показать
Скачивание по HTTP:
Вот такой вариант есть, но на архивах не проврел, только текстовые файлы скачивал:
Попытка
Соединение = СоздатьОбъект("Addin.V7HttpReader");
Соединение.КоличествоПопытокАвторизации = 3;
Исключение
Сообщить("Не удалось создать объект Addin.V7HttpReader!");
КонецПопытки;
Попытка
Соединение.ПолучитьКакФайл(СокрЛП(Ссылка), ПолнИмяФайла);
Исключение
Сообщить(ОписаниеОшибки());
Сообщить("Неудачная попытка соединения."+СокрЛП(Соединение.СтрокаСостоянияОтвета));
КонецПопытки;
ПоказатьВот такой вариант есть, но на архивах не проврел, только текстовые файлы скачивал:
Процедура СкачатьФайл(Адрес, СкачанныйФайл,Proxy)
wHTTP = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
Если ПустоеЗначение(Proxy) = 0 Тогда
wHTTP.SetProxy(2,СокрЛП(Proxy));
КонецЕсли;
RequestTimeout = 6;
wHTTP.Open("GET",Адрес,1);
wHTTP.Send();
Рез = wHTTP.WaitForResponse(RequestTimeout);
Если Рез = -1 Тогда
Ответ = СокрЛП(wHTTP.ResponseText());
Файл = СоздатьОбъект("Текст");
Файл.ДобавитьСтроку(Ответ);
Файл.Записать(СкачанныйФайл);
Иначе
Сообщить("Нет ответа");
СтатусВозврата(0);
КонецЕсли;
КонецПроцедуры // СкачатьФайл()
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот