Имя: Пароль:
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");
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший