Функция СодержимоеАрхива() и вспомогательная функция Путь()
Теги: 1С,Zip,Путь,Архив

Распаковывает архив во временную папку и даёт доступ к содержимому, если путь к исходному архиву не указан, то открывается диалог выбора пути.

# Код реализации

```1c
// Возвращает путь к распакованному архиву и его содержимое
//
// Параметры:
//  Архив - ЧтениеZipФайла, Строка, Неопределено - Архив; Путь к архиву; Если неопределенно, то спросит путь у пользователя
//  Пароль - Строка
// Возвращаемое значение:
//   Структура   -  содержит:
//	* ВременныйПуть - Строка - путь к папке куда будет извлечено содержимое архива
//	* Архив  - ЧтениеZipФайл
// Пример:
//	НаборСхемXML = Новый НаборСхемXML;
//	СодержимоеАрхива = СодержимоеАрхива();
//	Для Каждого ЭлементАрхива из СодержимоеАрхива.Архив.Элементы Цикл
//		Если ЭлементАрхива.Расширение = "xsd" Тогда
//			СхемаXML = СхемаXMLИзФайла(СодержимоеАрхива.ВременныйПуть +"/"+ ЭлементАрхива.ПолноеИмя);
//			НаборСхемXML.Добавить(СхемаXML);
//		КонецЕсли;
//	КонецЦикла;
Функция СодержимоеАрхива(Архив = Неопределено, Пароль = Неопределено)    Экспорт

	Если ТипЗнч(Архив ) = Тип("ЧтениеZipФайла") Тогда
		Архив = Архив;
	ИначеЕсли  ТипЗнч(Архив) = Тип("Строка") Тогда
		Архив = Новый ЧтениеZipФайла(Архив, Пароль);
	ИначеЕсли Архив = Неопределено Тогда
		Путь = Путь("Выберите архив, содержащий схемы XML:", "(*.zip)|*.zip", РежимДиалогаВыбораФайла.Открытие);
		Если Путь  = Неопределено Тогда
			Возврат Неопределено;
		КонецЕсли;
		Архив = Новый ЧтениеZipФайла(Путь, Пароль);
	Иначе
		Возврат Неопределено;
	КонецЕсли;

	Результат = Новый Структура("Архив", Архив);
	Результат.Вставить("ВременныйПуть",   КаталогВременныхФайлов() + "ZIP_" + Формат(ТекущаяДатаСеанса(),  "ДФ=yyyyMMddHHmmss"));
	Архив.ИзвлечьВсе(Результат.ВременныйПуть);
	Возврат Результат;
КонецФункции // СодержимоеАрхива()

// Функция - открывает диалог выбора пути, возвращает результат выбора.
//
// Параметры:
//  Заголовок     - Строка - НПР: "Укажите путь к базе Поставщиков"
//  Фильтр         - Строка -    НПР: "(*.txt)|*.txt"
//  Режим         - РежимДиалогаВыбораФайла - НПР: РежимДиалогаВыбораФайла.Открытие
//  ИсходныйПуть - Строка - НПР: Путь чтобы выбор начинался в определённом месте
//
// Возвращаемое значение:
//  Строка, Неопределено -  В случае успеха Путь в виде Строки, иначе Неопределено
//
// Пример:
//  Элемент.Значение = Путь("Выберите путь к файлу с данными (xls):","(*.xls*)|*.xls*", РежимДиалогаВыбораФайла.Открытие, Элемент.Значение)
Функция Путь(Заголовок, Фильтр, Режим, ИсходныйПуть = Неопределено) Экспорт
    Результат = Неопределено;
    ДиалогОткрытияФайла  = Новый ДиалогВыбораФайла (Режим);
    //выбор начнётся по исходному пути?!
    Если ИсходныйПуть <> Неопределено Тогда
        Если Режим =  РежимДиалогаВыбораФайла.ВыборКаталога Тогда
            ДиалогОткрытияФайла.Каталог = ИсходныйПуть;
        ИначеЕсли  Режим = ДиалогОткрытияФайла.ПолноеИмяФайла  Тогда
            ДиалогОткрытияФайла.ПолноеИмяФайла = ИсходныйПуть;
        КонецЕсли;
    КонецЕсли;
    ДиалогОткрытияФайла.ПолноеИмяФайла     = "";
    ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
    ДиалогОткрытияФайла.Заголовок          = Заголовок;
    ДиалогОткрытияФайла.Фильтр = Фильтр;
    Успех = ДиалогОткрытияФайла.Выбрать();
    Если Успех Тогда
        Если Режим = РежимДиалогаВыбораФайла.ВыборКаталога Тогда
            Результат = ДиалогОткрытияФайла.Каталог;
        Иначе
            Результат = ДиалогОткрытияФайла.ПолноеИмяФайла;
        КонецЕсли;
    Иначе
        Результат = Неопределено;
    КонецЕсли;
    Возврат Результат;
КонецФункции
```