Имя: Пароль:
1C
 
Запись в ZIP Файл
0 Telcher
 
12.11.25
07:56
Добрый день, коллеги! Мне нужно сохранить двоичные данные в ZIP архив с учетом подкаталога. Написал следующий код:
ПотокZIP    = Новый ПотокВПамяти();
Архиватор    = Новый ЗаписьZipФайла(ПотокZIP);    
    
ВрКаталог = КаталогВременныхФайлов();
ВрКаталог = ВрКаталог + "Тест\";
    
Для Каждого СтрокаЭД Из ТаблицаЭД Цикл
    ПолныйПуть    = ВрКаталог + "Каталог_1" + "\";
        
    КаталогСуществует = Новый Файл(ПолныйПуть);
    Если НЕ КаталогСуществует.Существует() Тогда
        СоздатьКаталог(ПолныйПуть);
    КонецЕсли;
        
    ВрФайл = ПолныйПуть + СтрокаЭД.ПолноеИмяФайла;
    СтрокаЭД.ДвоичныеДанныеФайла.Записать(ВрФайл);  

Архиватор.Добавить(ВрФайл,РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);                
КонецЦикла;    
    
Архиватор.Записать();
УдалитьФайлы(ВрКаталог);
    
ДвоичныеДанныеZIP = ПотокZIP.ЗакрытьИПолучитьДвоичныеДанные();
    ДвоичныеДанныеZIP.Записать("C:\Users\d.kanakin\Desktop\тест" + "\" + "НаименованиеФайла" + ".zip");
1 Telcher
 
12.11.25
07:58
(0) "ВрКаталог = ВрКаталог + "Тест\";" + тест нужен для удаления всех созданных файлов

При использовании "РежимСохраненияПутейZIP.СохранятьОтносительныеПути" в добавлении файла в архиватор - не сохраняет подкатолог "Каталог_1".
Если изменить на Сохранятьполныепути - сохраняет весь путь от диска С до папки темп.

Мне нужно получить итог такой:
ZIP Архив - Каталог_1 - Файлы
2 Telcher
 
12.11.25
08:20
Вот так выглядит ZIP архив, который у меня получается. При использовании режима сохранения "СохранятьОтносительныеПути" - пути с папкой темп нет, если использовать "СохранятьПолныеПути" - получается вот такой путь в архиве

Во временном каталоге все сохраняется как нужно, просто не нужен полный путь до него, а буквально требуется скопировать все каталоги из "Тест" в ZIP архив
3 SilentMan
 
12.11.25
08:40
При добавлении одиночного файла признак сохранения относительного пути бесполезен. Готовь отдельный каталог с файлами и нужной структурой, а потом по маске складывай этот каталог в архив. Получишь относительные пути.
4 Telcher
 
12.11.25
08:43
(3) Спасибо. Попробую
5 Telcher
 
12.11.25
09:31
(3) Получилось добиться необходимого результата, благодарю
Если кому-то пригодится, вот итоговый код:
            ПотокZIP    = Новый ПотокВПамяти();
            Архиватор    = Новый ЗаписьZipФайла(ПотокZIP);  
            
            ВрКаталог = КаталогВременныхФайлов();
            ВрКаталог = ВрКаталог + "ТемпКаталог\";
            
            Для Каждого СтрокаЭД Из РезультатФормирования.ТаблицаЭД Цикл
                Контрагент    = СтрокаЭД.Контрагент;
                ПолныйПуть    = ВрКаталог + Контрагент.Наименование + "\"; // Путь с учетом подкаталога контрагента
                
                КаталогСуществует = Новый Файл(ПолныйПуть);
                Если НЕ КаталогСуществует.Существует() Тогда
                    СоздатьКаталог(ПолныйПуть);
                КонецЕсли;
                
                ВрФайл = ПолныйПуть + СтрокаЭД.ПолноеИмяФайла;
                СтрокаЭД.ДвоичныеДанныеФайла.Записать(ВрФайл);                  
            КонецЦикла;
            
            Маска = ВрКаталог + "*.*";
            Архиватор.Добавить(Маска, РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);                            
            Архиватор.Записать();            
            УдалитьФайлы(ВрКаталог);
        
            ДвоичныеДанныеZIP = ПотокZIP.ЗакрытьИПолучитьДвоичныеДанные();
            ДвоичныеДанныеZIP.Записать(Каталог + Строка.Организация.ФамилияИП + ".zip");
6 Маленький Вопросик
 
12.11.25
12:35
(0) интересно, как будешь передавать файл с сервера на клиент?

вот самый простой путь корректного формирования архива с необходимыми данными  - ищи в моем профиле на известном ресурсе

с сохранением в выбранный каталог с уникальным именем
7 Мультук
 
гуру
12.11.25
11:05
(6)

Приплачиваешь Волшебнику за рекламу ?
8 Маленький Вопросик
 
12.11.25
12:27
(7) видишь ли в чем «проблема» - на практически все технические вопросы «а как сделать?» которые тут задаются у меня есть практический код ответ…

Потому, что я последние 15 лет только кодингом и занимался..

вместо того, чтобы «переливать из пустого в порожнее»

В чем твой интерес?
9 Маленький Вопросик
 
12.11.25
12:34
А по делу - в коде (5) не реализована передача файла с сервера на клиент! На локальной машине будет работать, а на удаленной нет!
10 Мультук
 
гуру
12.11.25
12:53
(8)

Любопытство, не более того.
11 SilentMan
 
12.11.25
13:24
(9) Так автор и не заявлял желания узнать, как передавать файл с сервера на клиент. Кому нужны неспрошенные советы?
Да и не будет оно на локальной машине работать (в общем случае). Кроме, наверное, толстого клиента/обычного приложения.
12 Маленький Вопросик
 
12.11.25
15:03
(11) не заявлял, похоже и не знает про эти моменты. писать нужно правильно код, а не выдумывать самому себе условия и "советы"
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший