Все бы ничего но копировать файлы выгрузки без архивации на 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: 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 " + """" + ппЧтоИзвлекаем + """ """ + ппКудаИзвлекаем + """";
ЗапуститьПриложение(СтрокаЗапуска, пПапкаДляРобота, истина);
КонецПроцедуры
Единственные минус FTPDriva — не смог настроить вход через прокси 🙁
Неужели в типовых конфигурациях нет обмена через ftp и сжатие с помощью встроенных функций zip?
«начали жаловаться пользователи на часто появляющееся консольное окно» параметры запуска настраивать нужно, что бы не появлялось, все это стандартно решаемо и без левых утилит
(1). Для этого используй еще одну прогу — httport. она позволяет с любым ресурсом работать через прокси. В настройках указываешь локальный порт, прокси, удаленный адрес, удаленный порт. Для FTP нужно настроить 21 и 20 порты. В FTPDrive указываешь адрес FTP 127.0.0.1. И все будет работать. Так же можно мепить SMTP, POP3 и т.п.
(1). Нашел ссылку, подробно расписаноhttp://www.freeproxy.ru/ru/free_proxy/faq/port_mapping_using_httport.htm
(3). «параметры запуска настраивать нужно, что бы не появлялось, все это стандартно решаемо и без левых утилит»
Ссылку на описание покажи пожалуйста.
(6)http://msdn.microsoft.com/en-us/library/d5fk67ky%28VS.85%29.aspx
Консольное окно архиватора 7zip скриптом на vbs не спрячешь
новый подход-это хорошо. а стандартные?
ЧтениеZIP=Новый ЧтениеZipФайла
ЧтениеZIP.ИзвлечьВсе(каталог, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
Архив = Новый ЗаписьZIPФайла(«C:» + Выборка.Ссылка + «.zip»,,,МетодСжатияZIP.Сжатие, УровеньСжатияZIP.Максимальный);
Архив.Добавить(«C:price.spr»);
Архив.Записать();
ФТП = Новый FTPСоединение(«111.222.1.2», , «user», «passw»);
МассивФайлов = ФТП.НайтиФайлы(«», «po*.zip»);
ФТП.Записать(«C:load.flz», «load_» + Выборка.Ссылка+ «.flz»);
Основная идея предложенного решения это расчет контрольной суммы при формировании архива и добавление его к имени архива. А при расчете контрольной суммы архива при получении происходит удалением некорректных архивов.
В противном случае, если приходит некорректный архив может происходить сбой архиватора и соответственно остановка обмена.
То есть предложенное решение предназначено для устранения влияния сбоев при пересылке файлов.
Кроме того архиватор 7zip обладает, на сегодняшний день, лучшими показателями по сжатию.