Рассмотрим пример добавления в архив произвольных файлов, выбранных пользователем. Данная задача может быть выполнена с помощью следующего программного кода (листинги 6.141, 6.142, 6.143, 6.144).
Листинг 6.141. Пример добавления файлов в ZIP-архив
&НаКлиенте
Процедура ЗаписатьФайлыВАрхив(Команда)
ПоместитьФайлыВАрхив(Новый ОписаниеОповещения("ПоместитьФайлыВАрхивЗавершение", ЭтотОбъект));
КонецПроцедуры
Листинг 6.142. Процедура «ПоместитьФайлыВАрхив()»
&НаКлиенте
Процедура ПоместитьФайлыВАрхив(ОповещениеОЗавершении)
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов("Выберите файлы для помещения в архив", Истина);
НачатьПомещениеФайловНаСервер(ОповещениеОЗавершении, , , ПараметрыДиалога, УникальныйИдентификатор);
КонецПроцедуры
Листинг 6.143. Обработчик оповещения «ПоместитьФайлыВАрхивЗавершение()»
&НаКлиенте
Процедура ПоместитьФайлыВАрхивЗавершение(ПомещенныеФайлы, Дополнительно) Экспорт
Если ПомещенныеФайлы = Неопределено Тогда
Возврат;
КонецЕсли;
АдресаДобавляемыхФайлов = Новый Массив;
ИменаДобавляемыхФайлов = Новый Массив;
Для Каждого ДобавляемыйФайл Из ПомещенныеФайлы Цикл
АдресаДобавляемыхФайлов.Добавить(ДобавляемыйФайл.Адрес);
ИменаДобавляемыхФайлов.Добавить(ДобавляемыйФайл.СсылкаНаФайл.Имя);
КонецЦикла;
АдресФайлаВХранилище = ЗаписатьФайлыВАрхивНаСервере(АдресаДобавляемыхФайлов, ИменаДобавляемыхФайлов);
НачатьПолучениеФайлаССервера(, АдресФайлаВХранилище, "e:\test\arc.zip");
КонецПроцедуры
Листинг 6.144. Функция «ЗаписатьФайлыВАрхивНаСервере()»
&НаСервереБезКонтекста
Функция ЗаписатьФайлыВАрхивНаСервере(МассивАдресовФайлов, МассивИменФайлов)
Архив = Новый ЗаписьZIPФайла();
Индекс = 0;
Для Каждого АдресДобавляемогоФайла Из МассивАдресовФайлов Цикл
ДанныеФайла = ПолучитьИзВременногоХранилища(АдресДобавляемогоФайла);
ИмяФайла = КаталогВременныхФайлов() + МассивИменФайлов[Индекс];
ДанныеФайла.Записать(ИмяФайла);
Архив.Добавить(ИмяФайла,
РежимСохраненияПутейZIP.НеСохранятьПути, РежимОбработкиПодкаталоговZIP.НеОбрабатывать);
Индекс = Индекс + 1;
КонецЦикла;
ДанныеАрхива = Архив.ПолучитьДвоичныеДанные("", "",
МетодСжатияZIP.Сжатие, УровеньСжатияZIP.Максимальный, МетодШифрованияZIP.Zip20);
Возврат ПоместитьВоВременноеХранилище(ДанныеАрхива);
КонецФункции
Сначала пользователю показывается диалог множественного выбора файлов, добавляемых в архив, и начинается помещение выбранных файлов на сервер. Когда все файлы помещены, адреса во временном хранилище и имена помещенных файлов в виде двух отдельных массивов передаются в функцию ЗаписатьФайлыВАрхивНаСервере().
В этой функции элементы массива помещенных файлов обходятся в цикле, данные каждого файла записываются во временный файл и этот файл добавляется в неинициализированный архив. Затем методом ПолучитьДвоичныеДанные() этот архив получается в виде двоичных данных, которые функция возвращает на клиент в процедуру ПоместитьФайлыВАрхивЗавершение(), где файл архива получается в виде локального zip-файла.