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


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

    Возникла задача сделать обмен РИБ в 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:\test.xls" "Z:\test.7z"  - это для архивации файла 

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

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

  SevenZipFon.exe -ec "Z:\test~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 " + """" + ппЧтоИзвлекаем + """ """ + ппКудаИзвлекаем + """";
ЗапуститьПриложение(СтрокаЗапуска, пПапкаДляРобота, истина);
КонецПроцедуры 

  

Файлы обработки:

-