Фоновая архивация файлов в 7zip c копированием их на FTP с проверкой контрольной CRC-суммы архива для 1С


    Возникла задача сделать обмен РИБ в 8.2 через FTP. Не пытаясь изобрести велосипед, давно уже использую замечательную программу FTPDrive (www.killprog.com). FTPDrive подключает к системе FTP-ресурс как логический диск, на который можно просто копировать информацию. При этом программа имеет множество настроек и позволяет достаточно быстро подключиться к желаемому ресурсу. Не требует инсталяции.

   Все бы ничего но копировать файлы выгрузки без архивации на FTP неразумно, и появилась проблема - штатный архиватор 1С 8.2 не хотел создавать файлы на FTP-ресурсе и копировать их 1С тоже отказывалась. Тогда был использован вызов консольного архиватора 7zip, но начали жаловаться пользователи на часто появляющееся консольное окно.

   Вместо FTPDrive можете использовать любую другую программу с похожим функционалом, например: WebDrive (www.webdrive.com), но он платный.

   По сути приложение SevenZipFon.exe занимается архивацией/распаковкой архивов 7zip и копированием в фоновом режиме результатов, что не привязывает его к FTP, т.е. это может быть VPN и что угодно еще (лишь бы можно было указать путь к файлу-источнику и к файлу-получателю ).

   Тогда было написано приложение позволяющее в фоновом режиме архивировать файлы в 7zip (запуск программы SevenZipFon.exe с ключами -a и -e ). В последствии, практика показала, что архивы время от времени приходят поврежденные и чтобы исключить проблемы с их обработкой был добавлен расчет контрольной суммы (CRC) после формирования архива и добавление этой контрольной суммы к имени архива (при запуске программы SevenZipFon.exe с ключем -ac). Соответственно при извлечении файлов из архива с контролем CRC-сумм надо использовать при запуске программы SevenZipFon.exe ключ -ec.

Приложение необходимо запустить с тремя параметрами.

Порядок использования:
  SevenZipFon  [ключ]  [файл-источник]  [файл-получатель]

Список ключей:
  -a  : ключ архивации;
  -e  : ключ распаковки;
  -ac  : ключ архивации с расчетом CRC-суммы и добавлением ее к имени файла (после знака ~);
  -ec  : ключ распаковки с предварительным расчетом CRC-суммы и удалением файла в случае не совпадения;

Примеры :
  SevenZipFon.exe -a "C: est.xls" "Z: est.7z"  - это для архивации файла 

  SevenZipFon.exe -e "Z: est.7z" "C: est.xls" - это для распаковки файла

  SevenZipFon.exe -ac "C: est.xls" "Z: est.7z"  - это для архивации файла с расчетом CRC-суммы и добавлением ее к имени файла (на выходе будет создан файл с именем, н-р: test~122714201.7z, где число 122714201 - это CRC-сумма для файла архива test.7z).

  SevenZipFon.exe -ec "Z: est~122714201.7z" "C:" - это для распаковки с предварительным расчетом CRC-суммы и удалением файла в случае не совпадения.

Как видно из примеров в качестве источника и приемника указываеются полные пути.

Приложение при архивации сначала упаковывает файл во временный каталог, а затем копирует его по указанному пути.

При распаковке сначала архив копируется во временную папку, а затем распаковывается в нужный каталог.

При этом в трее отображается на желтом фоне ход процесса в процентах:

- при архивировании - красные цифры и красная индикаторная полоска;
- при копировании полученного архива в указанное место назначения - черные цифры и красная индикаторная полоска;
- при копировании архива из указанного места во временную папку (перед распаковкой) - черные цифры и синяя индикаторная полоска;
- при распаковке архива в указанное место назначения - синие цифры и синяя индикаторная полоска.

SevenZipFon.exe не требует сторонних библиотек, включая библиотеки 7zip.

Пример использования приложения SevenZipFon.exe в 1С 8.2 (конфигурация самописная):

1. В конфигураторе создать общий макет SevenZip и поместить в него файл SevenZipFon.exe

2. Привожу пример функции для извлечения приложения из общего макета SevenZip :

Функция Получить7ZipФоновый() Экспорт
    пПапкаДляРобота=СокрЛП(Константы.ПапкаДляФайловРобота.Получить());
    Если пПапкаДляРобота="" Тогда
        пПапкаДляРобота=СокрЛП(КаталогВременныхФайлов());
    КонецЕсли;    
    Если Лев(пПапкаДляРобота,1)<>"" Тогда
        пПапкаДляРобота=пПапкаДляРобота+"";
    КонецЕсли;
    Результат = "";
    Попытка
        ZIPexe = пПапкаДляРобота + "SevenZipFon.exe";
        Макет = ПолучитьОбщийМакет("SevenZipFon");
        Макет.Записать(ZIPexe);
        Результат = ZIPexe;
    Исключение
        Сообщить("Ошибка сохранения файла: SevenZipFon.exe в каталог: " + пПапкаДляРобота, СтатусСообщения.ОченьВажное);
    КонецПопытки;
    Возврат Результат;
КонецФункции  

 

3. Привожу пример процедуры архивации:

Процедура АрхивироватьФайлВФоне(ппЧтоАрхивируем,ппЧтоПолучаем) Экспорт
    ппЧтоПолучаем    = СтрЗаменить(ппЧтоПолучаем,"/","");
    ппЧтоПолучаем    = СтрЗаменить(ппЧтоПолучаем,"\","");    
    ппЧтоАрхивируем = СтрЗаменить(ппЧтоАрхивируем,"\","");
    ппЧтоАрхивируем = СтрЗаменить(ппЧтоАрхивируем,"/","");
    
    пПапкаДляРобота=СокрЛП(Константы.ПапкаДляФайловРобота.Получить());
    Если пПапкаДляРобота="" Тогда
        пПапкаДляРобота=СокрЛП(КаталогВременныхФайлов());
    КонецЕсли;    
    Если Лев(пПапкаДляРобота,1)<>"" Тогда
        пПапкаДляРобота=пПапкаДляРобота+"";
    КонецЕсли;
    
    Получить7ZipФоновый();
    СтрокаЗапуска = пПапкаДляРобота+"SevenZipFon.exe -ac " + """" + ппЧтоАрхивируем + """ """ + ппЧтоПолучаем + """";
    ЗапуститьПриложение(СтрокаЗапуска, пПапкаДляРобота, истина);
КонецПроцедуры

4. Привожу пример процедуры распаковки:

Процедура ИзвлечьФайлВФоне(ппЧтоИзвлекаем,ппКудаИзвлекаем) Экспорт
    ппЧтоИзвлекаем    = СтрЗаменить(ппЧтоИзвлекаем,"/","");
    ппЧтоИзвлекаем    = СтрЗаменить(ппЧтоИзвлекаем,"\","");    
    ппКудаИзвлекаем = СтрЗаменить(ппКудаИзвлекаем,"\","");
    ппКудаИзвлекаем = СтрЗаменить(ппКудаИзвлекаем,"/","");
    
    пПапкаДляРобота=СокрЛП(Константы.ПапкаДляФайловРобота.Получить());
    Если пПапкаДляРобота="" Тогда
        пПапкаДляРобота=СокрЛП(КаталогВременныхФайлов());
    КонецЕсли;    
    Если Лев(пПапкаДляРобота,1)<>"" Тогда
        пПапкаДляРобота=пПапкаДляРобота+"";
    КонецЕсли;
    
    Получить7ZipФоновый();
    СтрокаЗапуска = пПапкаДляРобота+"SevenZipFon.exe -ec " + """" + ппЧтоИзвлекаем + """ """ + ппКудаИзвлекаем + """";
    ЗапуститьПриложение(СтрокаЗапуска, пПапкаДляРобота, истина);
КонецПроцедуры 

  

https://infostart.ru/public/22166/

Скачать:
22166_Fonovaya_arhivatsiya_faylov_v_7zip_c_kopirovaniem_ih_na_FTP.exe.rar