Можно ли программно использовать встроенный в платформу 7.7 zip-архиватор

1. AndKovalchuk 192 08.10.17 13:58 Сейчас в теме
Требуется скачать по http архив (7z или arj) и распаковать его перед загрузкой данных. Можно ли для этих целей использовать встроенный в платформу zip- архиватор и как это сделать?
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Cooler 22 08.10.17 14:27 Сейчас в теме
(1) Вы видите в Синтакс-Помощнике 7.7 раздел "Работа с архивами"?

Если даже и найдете, то не забывайте: zip, 7z и arj - это разные методы архивации.

P.S. Используйте КомандаСистемы() и консольные утилиты соответствующих архиваторов. Или можно какую-нибудь ВК поискать.
AndKovalchuk; +1 Ответить
7. vovaapril 46 10.10.17 11:22 Сейчас в теме
Извлечение ZIP с помощью DialMail.dll
Функция ИзвлечьИзАрхива1(ИмяАрхива,СтрОшибка)
	Если ЗагрузитьВнешнююКомпоненту("DialMail.dll")=0 Тогда
		СтрОшибка = СтрОшибка + "Не удалось обнаружить компоненту DialMail.dll!"+РазделительСтрок;
		СтрОшибка = СтрОшибка + "Распакуйте архив самостоятельно или скопируйте компоненту в каталог базы данных и повторите попытку!";
		Возврат "";
	КонецЕсли;
	Попытка
		Архиватор=СоздатьОбъект("AddIn.ZIP");
	Исключение
		СтрОшибка = СтрОшибка + "Не удалось создать объект AddIn.ZIP!";
		Возврат "";
	КонецПопытки;
	Если Архиватор.УстановитьАрхивТекущим(СокрЛП(ИмяАрхива))=0 Тогда
		СтрОшибка = СтрОшибка + "Ошибка чтения из архива, либо файл не является архивом в формате ZIP. ";
		Возврат "";
	КонецЕсли;
	Архиватор.КаталогИзвлечения=КаталогВременныхФайлов();
	ФайловАрхива=Архиватор.КоличествоФайлов();
	Если ФайловАрхива = 0 Тогда
		Сообщить("В скаченном архиве нет файлов!");
		Возврат "";
	ИначеЕсли ФайловАрхива > 1 Тогда
		Сообщить("В скаченом архиве файлов больше чем один! беру первый!");
	КонецЕсли;
	ИмяФайлаИзАрхива = Архиватор.ПолучитьИмяФайла(1);
	
	Поз=Архиватор.Извлечь(,ИмяФайлаИзАрхива);
	Если Поз=0 Тогда
		Архиватор.КаталогИзвлечения=ПолучитьКаталогХраненияФайла(ИмяАрхива);
		Поз=Архиватор.Извлечь(,ИмяФайлаИзАрхива);
		Если Поз=0 Тогда
			СтрОшибка = СтрОшибка + "Не удалось извлечь ни одного файла из архива! ";
			Возврат "";
		КонецЕсли;
	КонецЕсли;
	ПолнИмяФайлаИзАрхива = Архиватор.КаталогИзвлечения+ИмяФайлаИзАрхива;
	Если ФС.СуществуетФайл(ПолнИмяФайлаИзАрхива) = 0 Тогда
	    Возврат "";
	КонецЕсли;
	Возврат ПолнИмяФайлаИзАрхива;
КонецФункции // ИзвлечьИзАрхива1()
Показать
AndKovalchuk; +1 Ответить
8. vovaapril 46 10.10.17 11:26 Сейчас в теме
Извлечение с помощью 7za.exe (сам файл положить в ExtForms\7zip\7za.exe)
использую для архивов *.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" Тогда
			Возврат ПолнИмяФайлаИзАрхива;
		КонецЕсли;
	КонецЦикла;
	Возврат ""; 
КонецФункции // ИзвлечьИзАрхиваРар()
Показать
3. vcv 89 08.10.17 20:27 Сейчас в теме
Возьмите бесплатный 7zip. Он распакует вам с командной строки и zip, и 7z, и arj.
4. CheBurator 3119 08.10.17 22:09 Сейчас в теме
5. Harry_udm 2 08.10.17 22:12 Сейчас в теме
Есть вариант использовать 1С++.
Если ЗагрузитьВнешнююКомпоненту("1CPP.dll") = 1 Тогда
	_бд = СоздатьОбъект("BinaryData");
	_бд.Zip("d:\Temp\1.zip *.xls"); // добавить в архив 1.zip на диске D: в папке Temp все экселевские файлы
	_бд.UnZip("d:\Temp\1.zip"); // разархивировать архив 1.zip на диске D: в папке Temp
КонецЕсли;
CheBurator; AndKovalchuk; +2 Ответить
9. JetBrain 78 22.02.19 08:24 Сейчас в теме
Добрый день!
использование внешних компонент не всегда доступно, особенно при работе на серверах заказчиков. Вариант с запуском 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;
КонецФункции
Показать
10. JetBrain 78 23.02.19 14:46 Сейчас в теме
(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
Показать
6. vovaapril 46 10.10.17 11:19 Сейчас в теме
Скачивание по 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);
	КонецЕсли;
КонецПроцедуры // СкачатьФайл()
Показать
AndKovalchuk; +1 Ответить
11. Иваныч 23 24.02.19 20:29 Сейчас в теме
Даже и не знал об этом.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот