Как ни странно, стандартной функции для этой операции нет.
ФС.СоздатьКаталог() позволяет создать папку лишь на один уровень вглубь, а порой хочется глубже,
и чтобы функция нормально относилась к уже существующим папкам, не пыталась создавать их повторно.
Так появилась функция глСоздатьКаталог().
А вот пример использования - создание файла приказа на основании шаблона.
На форме расположен объект "СписокЗначений" с именем "спШаблоны".
1. Заполним список шаблонов
// ... спШаблоны.УдалитьВсе(); ПутьКПапкеШаблонов = КаталогИБ()+"Приказы\\Шаблоны"; Если глСоздатьКаталог(ПутьКПапкеШаблонов) = 1 Тогда ФС.УстТекКаталог(ПутьКПапкеШаблонов); ИмяШаблона = ФС.НайтиПервыйФайл("*.doc"); Пока ИмяШаблона <> "" Цикл Если Лев(ИмяШаблона, 1) <> "~" Тогда спШаблоны.ДобавитьЗначение(ИмяШаблона); КонецЕсли; ИмяШаблона = ФС.НайтиСледующийФайл(); КонецЦикла; КонецЕсли; // ...
2. Создаем подпапку по имени файла шаблона, и копируем туда файл на основании шаблона.
//.. ИмяШаблонаКратко = спШаблоны.ПолучитьЗначение(спШаблоны.ТекущаяСтрока()); ИмяШаблонаКраткоБезРасширения = глИзвлечьИмяФайлаБезРасширения(ИмяШаблонаКратко); ПутьКПапкеГотовых = КаталогИБ() + "Приказы\" + ИмяШаблонаКраткоБезРасширения + "\"; Если глСоздатьКаталог(ПутьКПапкеГотовых) = 0 Тогда Возврат; КонецЕсли; ИмяШаблона = КаталогИБ()+"Приказы\\Шаблоны\"+ИмяШаблонаКратко; ИмяФайла = ПутьКПапкеГотовых + ИмяШаблонаКраткоБезРасширения + " " +Формат(ТекущаяДата(), "ДГГГГММДД")+" "+СтрЗаменить(ТекущееВремя(), ":", "")+".doc"; Если ФС.СуществуетФайл(ИмяШаблона) = 0 Тогда Предупреждение("Шаблон "+ИмяШаблона+" не найден!"); Возврат; КонецЕсли; ФС.КопироватьФайл(ИмяШаблона, ИмяФайла, 1); //..
Текст функций:
//----------------------------------------------------- Функция глСоздатьКаталог(Знач Путь) Экспорт Пока Прав(Путь, 1) = "\" Цикл Путь = Сред(Путь, 1, СтрДлина(Путь) - 1); КонецЦикла; // Проверим, возможно каталог существует Атрибуты = ""; ФС.АтрибутыФайла(Путь, , Атрибуты); Если Сред(Атрибуты, 4, 1) = "1" Тогда Возврат 1; КонецЕсли; спКСозданию = СоздатьОбъект("СписокЗначений"); текПуть = Путь; врДлина = СтрДлина(Путь); Для к = -врДлина по -1 Цикл Если Сред(Путь, -к, 1) = "\" Тогда спКСозданию.ДобавитьЗначение(текПуть); текПуть = Лев(Путь, -к-1); // Проверяем наличие текущего уровня Атрибуты = ""; ФС.АтрибутыФайла(текПуть, , Атрибуты); фЕстьТекПуть = ?(Сред(Атрибуты, 4, 1) = "1", 1, 0); Если фЕстьТекПуть = 0 Тогда Продолжить; КонецЕсли; // Пытаемся создать с текущего уровня Для н = -спКСозданию.РазмерСписка() по -1 Цикл врПутьХ = спКСозданию.ПолучитьЗначение(-н); ФС.СоздатьКаталог(врПутьХ); Если н = - 1 Тогда Атрибуты = ""; ФС.АтрибутыФайла(врПутьХ, , Атрибуты); Если Сред(Атрибуты, 4, 1) = "1" Тогда // Удачное создание с текущего уровня Возврат 1; КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; КонецЦикла; Предупреждение("Невозможно создать путь: "+РазделительСтрок+Путь, 4); Возврат 0; КонецФункции //----------------------------------------------------- Функция глИзвлечьИмяФайла(ПолноеИмяФайла) Экспорт Файл = ""; врДлина = СтрДлина(ПолноеИмяФайла); Для к = -врДлина по -1 Цикл Если Сред(ПолноеИмяФайла, -к, 1) = "\" Тогда Файл = Прав(ПолноеИмяФайла, врДлина+к); Прервать; КонецЕсли; КонецЦикла; Возврат(Файл); КонецФункции //----------------------------------------------------- Функция глИзвлечьИмяФайлаБезРасширения(КраткоеИмяФайла) Экспорт Файл = ""; врДлина = СтрДлина(КраткоеИмяФайла); Для к = -врДлина по -1 Цикл Если Сред(КраткоеИмяФайла, -к, 1) = "." Тогда Файл = Лев(КраткоеИмяФайла, -к-1); Прервать; КонецЕсли; КонецЦикла; Возврат(Файл); КонецФункции
Все таки 1с это сила, даже если чего-то не хватает, всегда можно дописать.
Исправление.
Добавлена проверка на запрещенные символы и наличие в указанном пути файлов.
//----------------------------------------------------- Функция глСоздатьКаталог(Знач Путь) Экспорт Пока Прав(Путь, 1) = "\" Цикл Путь = Сред(Путь, 1, СтрДлина(Путь) - 1); КонецЦикла; Если СокрЛП(Путь) = "" Тогда Предупреждение("Невозможно создать пустой путь", 4); Возврат 0; КонецЕсли; // Проверим, возможно каталог существует Если ФС.СуществуетФайл(Путь) = 1 Тогда Атрибуты = ""; ФС.АтрибутыФайла(Путь, , Атрибуты); Если Сред(Атрибуты, 4, 1) = "1" Тогда Возврат 1; Иначе Предупреждение("Невозможно создать путь: "+РазделительСтрок+Путь +РазделительСтрок+"Так как существует одноименный файл.", 4); Возврат 0; КонецЕсли; КонецЕсли; спКСозданию = СоздатьОбъект("СписокЗначений"); врДлина = СтрДлина(Путь); // Проверка на запрещенные символы ЕстьБукваДиска = ?(Найти("abcdefghijklmnopqrstuvwxyz", Нрег(Лев(Путь, 1))) > 0, 1, 0); ЗапрещенныеСимволы = "/?|*<>:"""+РазделительСтрок+СимволТабуляции; Для к = 1 по врДлина Цикл Символ = Сред(Путь, к, 1); Если (Найти(ЗапрещенныеСимволы, Символ) > 0) или (КодСимв(Символ) < 32) Тогда Если не ((к = 2) и (Символ = ":") и (ЕстьБукваДиска = 1)) Тогда Предупреждение("Невозможно создать путь: "+РазделительСтрок+Путь +РазделительСтрок+"Так как использованы запрещенные символы.", 4); Возврат 0; КонецЕсли; КонецЕсли; КонецЦикла; // Основной цикл текПуть = Путь; Для к = -врДлина по -1 Цикл Если Сред(Путь, -к, 1) = "\" Тогда спКСозданию.ДобавитьЗначение(текПуть); текПуть = Лев(Путь, -к-1); // Проверяем наличие текущего уровня Если ФС.СуществуетФайл(текПуть) = 1 Тогда Атрибуты = ""; ФС.АтрибутыФайла(текПуть, , Атрибуты); Если Сред(Атрибуты, 4, 1) = "0" Тогда Предупреждение("Невозможно создать путь: "+РазделительСтрок+Путь +РазделительСтрок+"Так как существует файл:"+РазделительСтрок+текПуть, 4); Возврат 0; КонецЕсли; Иначе Продолжить; КонецЕсли; // Пытаемся создать с текущего уровня Для н = -спКСозданию.РазмерСписка() по -1 Цикл врПутьХ = спКСозданию.ПолучитьЗначение(-н); ФС.СоздатьКаталог(врПутьХ); Если н = - 1 Тогда Атрибуты = ""; ФС.АтрибутыФайла(врПутьХ, , Атрибуты); Если Сред(Атрибуты, 4, 1) = "1" Тогда // Удачное создание с текущего уровня Возврат 1; Иначе Предупреждение("Невозможно создать путь: "+РазделительСтрок+Путь, 4); Возврат 0; КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; КонецЦикла; Предупреждение("Невозможно создать путь: "+РазделительСтрок+Путь, 4); Возврат 0; КонецФункции
//----------------------------------------------------- Процедура глОчиститьКаталог(Путь) Экспорт Попытка ФС.УстТекКаталог(Путь); ИмяФайла = ФС.НайтиПервыйФайл("*.*"); Пока (ИмяФайла <> "") Цикл Если (ИмяФайла <> ".") и (ИмяФайла <> "..") Тогда ФС.УдалитьФайл(ИмяФайла); КонецЕсли; ИмяФайла = ФС.НайтиСледующийФайл(); КонецЦикла; Исключение КонецПопытки; КонецПроцедуры