Возникла задача сделать обмен РИБ в 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 " + """" + ппЧтоИзвлекаем + """ """ + ппКудаИзвлекаем + """";
ЗапуститьПриложение(СтрокаЗапуска, пПапкаДляРобота, истина);
КонецПроцедуры