При автоматизации документооборота и файловых хранилищ часто возникает задача автоматического создания структуры каталогов на диске при сохранении элемента справочника или документа. Например, при создании карточки контрагента требуется автоматически сформировать подпапку с его наименованием. Разберем типичные ошибки при формировании путей, выясним, как правильно передавать строки с пробелами, и рассмотрим лучшие практики разработки файловых операций в управляемых формах 1С:Предприятия.
Нередко разработчики предполагают, что наличие пробелов в именах папок или в пути требует оборачивания строки в тройные кавычки (по аналогии с передачей аргументов в командную строку через ЗапуститьПриложение). Посмотрим на типичный ошибочный пример:
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
// Ошибочный вариант: использование тройных кавычек
СоздатьКаталог("""D:\ХХХ\ХХХ, ХХХ\Заказчики\""" + Объект.Наименование);
КонецПроцедуры
В данном случае платформа 1С пытается создать каталог, имя которого буквально содержит символ кавычки ". Операционная система Windows запрещает использование кавычек в именах файлов и каталогов, из-за чего папка не создается либо метод завершается ошибкой. Встроенные функции платформы для работы с файловой системой (такие как СоздатьКаталог) принимают путь как обычное строковое значение, где пробелы являются стандартными символами и не требуют дополнительного экранирования.
Для создания каталога с пробелами в пути достаточно сформировать стандартную строку с одинарными строковыми литералами платформы:
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
ПутьККаталогу = "D:\ОТО\ОТО, СИО\Заказчики\Оперативно-техническое обслуживание\" + Объект.Наименование;
СоздатьКаталог(ПутьККаталогу);
КонецПроцедуры
Важное свойство метода: функция СоздатьКаталог автоматически создает всю цепочку недостающих промежуточных папок. Если родительские каталоги еще не существуют на диске, они будут созданы вместе с конечной папкой.
Рассмотрим по шагам, как сделать создание каталогов безопасным и устойчивым к ошибкам пользователей и операционной системы:
Наименование может содержать символы, запрещенные операционной системой (\, /, :, *, ?, ", <, >, |). Перед формированием пути необходимо очистить строку от этих знаков.Файл.Попытка ... Исключение.&НаКлиенте создает папку на рабочем месте пользователя, а вызов &НаСервере — на сервере 1С:Предприятия под учетной записью службы сервера (например, usr1cv8).Посмотрим на практический пример реализации клиентской процедуры с очисткой запрещенных символов:
&НаКлиенте
Функция ОчиститьИмяОтЗапрещенныхСимволов(Знач Имя)
Запрещенные = "\/:*?""<>|";
Для Индекс = 1 По СтрДлина(Запрещенные) Цикл
Символ = Сред(Запрещенные, Индекс, 1);
Имя = СтрЗаменить(Имя, Символ, "_");
КонецЦикла;
Возврат СокрЛП(Имя);
КонецФункции
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
ИмяПапки = ОчиститьИмяОтЗапрещенныхСимволов(Объект.Наименование);
Если ПустаяСтрока(ИмяПапки) Тогда
Возврат;
КонецЕсли;
БазовыйПуть = "D:\ОТО\ОТО, СИО\Заказчики\Оперативно-техническое обслуживание\";
ПолныйПуть = БазовыйПуть + ИмяПапки;
ПроверкаКаталога = Новый Файл(ПолныйПуть);
Если Не ПроверкаКаталога.Существует() Тогда
Попытка
СоздатьКаталог(ПолныйПуть);
Исключение
ВызватьИсключение "Не удалось создать каталог """ + ПолныйПуть + """. Описание ошибки: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Проанализируем дополнительные нюансы платформы 1С:Предприятие 8.3:
СоздатьКаталогАсинх с конструкцией Ждать или процедуру НачатьСозданиеКаталога с объектом ОписаниеОповещения.ПодключитьРасширениеРаботыСФайлами / УстановитьРасширениеРаботыСФайлами).