Функция создания вложенных каталогов + ф-ции извлечения имен файлов для 1с 7.7
Расширим возможности ФС.
- Описание
- Подробнее
Описание
Вы когда-нибудь пытались создать вложенные папки из 1с?
Как ни странно, стандартной функции для этой операции нет.
Как ни странно, стандартной функции для этой операции нет.
ФС.СоздатьКаталог() позволяет создать папку лишь на один уровень вглубь, а порой хочется глубже,
и чтобы функция нормально относилась к уже существующим папкам, не пыталась создавать их повторно.
Так появилась функция глСоздатьКаталог().
А вот пример использования — создание файла приказа на основании шаблона.
На форме расположен объект «СписокЗначений» с именем «спШаблоны».
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с это сила, даже если чего-то не хватает, всегда можно дописать.

