Как ни странно, стандартной функции для этой операции нет.
ФС.СоздатьКаталог() позволяет создать папку лишь на один уровень вглубь, а порой хочется глубже,
и чтобы функция нормально относилась к уже существующим папкам, не пыталась создавать их повторно.
Так появилась функция глСоздатьКаталог().
А вот пример использования - создание файла приказа на основании шаблона.
На форме расположен объект "СписокЗначений" с именем "спШаблоны".
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;
КонецФункции
//-----------------------------------------------------
Процедура глОчиститьКаталог(Путь) Экспорт
Попытка
ФС.УстТекКаталог(Путь);
ИмяФайла = ФС.НайтиПервыйФайл("*.*");
Пока (ИмяФайла <> "") Цикл
Если (ИмяФайла <> ".")
и (ИмяФайла <> "..") Тогда
ФС.УдалитьФайл(ИмяФайла);
КонецЕсли;
ИмяФайла = ФС.НайтиСледующийФайл();
КонецЦикла;
Исключение
КонецПопытки;
КонецПроцедуры
Вступайте в нашу телеграмм-группу Инфостарт