Архивируем пакеты РИБ сторонним архиватором

Опишу метод замены архиватора пакетов РИБ. Это поможет уменьшить нагрузку на сеть за счет лучшего сжатия. За основу возьмем freeware архиватор 7-zip. Его показатели в разы превосходят показатели встроенного архиватора ZIP платформы 8.x Устанавливаем архиватор в папку c:\7z\ на всех машинах на которых будет запускаться обмен: сервера приложений и клиентские машины администраторов. Далее правим конфигурацию УПП (у нас версия 1.2.*): Нам нужен общий модуль ПроцедурыОбменаДанными

// функция архивирует файл
Функция ЗаархивироватьФайл(Знач ИмяИсходногоФайла, СтруктураНастроекОбменаДанными)

   
//... без изменений

    //am+
   
_ФайлАрхиватора = Новый Файл("c:\7z\7z.exe");
   
// проверим что есть архиватор, иначе используем встроенный
   
Если _ФайлАрхиватора.Существует() Тогда

       
_КомОбъект  = Новый COMObject("WScript.Shell");
       
_КомОбъектЗапуск = _КомОбъект.Run("c:\7z\7z.exe a -mx5 -t7z """+
                                     
СтруктураНастроекОбменаДанными.ИмяФайлаЗаписиИзменений+
                                     
""" """+ИмяИсходногоФайла+"""",,Истина);

    Иначе
       
//am-

        //код использования стандартного архиватора без изменений
       
Архиватор = Новый ЗаписьZipФайла(СтруктураНастроекОбменаДанными.ИмяФайлаЗаписиИзменений,
                                        
СтруктураНастроекОбменаДанными.ДанныеНастройки.ПарольНаОтправку,
                                        
"Файл обмена данными");
       
Архиватор.Добавить(ИмяИсходногоФайла);
       
Архиватор.Записать();

   
//am+
   
КонецЕсли;
   
//am-

    // ... без изменений

КонецФункции

хочу заметить что само наличие архиватора и есть флаг его использования, т.е. если нужно перейти на штатный архиватор достаточно переименовать папку c:\7z на всех машинах и провести обмен. Теперь разархивирование:

// функция разархивирует файл
Функция РазархивироватьФайл(СтруктураНастроекОбменаДанными)

   
КаталогДляРаспаковки = КаталогВременныхФайлов();

   
// ... без изменений

    //am+
   
_ФайлАрхиватора = Новый Файл("c:\7z\7z.exe");
    Если
_ФайлАрхиватора.Существует() Тогда

       
//создадим подкаталог для распаковки
       
_КаталогДляРаспаковки = РаботаСФайлами.ПолучитьИмяФайла(КаталогДляРаспаковки,
                               
Формат(ТекущаяДата(),"ДФ=yyyyMMdd_HHmmss"));

       
_КомОбъект = Новый COMObject("wScript.Shell");
       
_КомОбъект.Run("c:\7z\7z.exe x -y """+СтруктураНастроекОбменаДанными.ИмяФайлаЧтенияИзменений+
                                         
""" -o"""+_КаталогДляРаспаковки+"""", , Истина);
       
_ФайлыВКаталоге = НайтиФайлы(_КаталогДляРаспаковки,"*.*");
        Если
_ФайлыВКаталоге.Количество()>0 Тогда
           
ИмяРазархивированногоФайла = РаботаСФайлами.ПолучитьИмяФайла(_КаталогДляРаспаковки,
                                          
_ФайлыВКаталоге[].Имя);
        Иначе
           
ИмяРазархивированногоФайла = "";
        КонецЕсли;
    Иначе
   
//am-

    //штатный архиватор
       
Архиватор = Новый ЧтениеZipФайла(СтруктураНастроекОбменаДанными.ИмяФайлаЧтенияИзменений,
                               
СтруктураНастроекОбменаДанными.ДанныеНастройки.ПарольНаПрием);

        Если
Архиватор.Элементы.Количество() > 0 Тогда

           
Архиватор.Извлечь(Архиватор.Элементы[], КаталогДляРаспаковки,
                            
РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
           
ИмяРазархивированногоФайла = РаботаСФайлами.ПолучитьИмяФайла(КаталогДляРаспаковки,
                                         
Архиватор.Элементы[].Имя);

        Иначе

           
ИмяРазархивированногоФайла = "";

        КонецЕсли;

       
Архиватор.Закрыть();

   
//am+
   
КонецЕсли;
   
//am-

    // ... без изменений

   
Возврат ИмяРазархивированногоФайла;

КонецФункции

очистку временного каталога от распакованных файлов оставим на совести администраторов сервера. Данный метод работает как в фоновом режиме 1С, так и в клиентском. Внесенные изменения в коде помечены //am+ //am-, всё остальное должно остаться без изменений. Ключ -mx5 в строке запуска архиватора это среднее сжатие, если использовать более сильное сжатие, то время архивации может увеличиться.

Похожие материалы

Справочники

Документы

Отчеты

Обработки