В процессе разработки на платформе 1С:Предприятие 7.7 часто возникает необходимость автоматического создания папок на диске — например, для выгрузки отчетов, сохранения логов или структурирования архивов. Несмотря на кажущуюся простоту задачи, начинающие разработчики часто сталкиваются с ошибкой «Ошибка при выполнении команды». В этой статье мы подробно разберем, как правильно использовать объект ФС (Файловая Система), проанализируем типичные ошибки и рассмотрим альтернативные способы создания каталогов, включая работу с системными командами Windows.
Рассмотрим ситуацию, с которой столкнулся автор темы. В коде была попытка создать каталог следующим образом:
Процедура Сформировать()
Каталог ="C:\Сеть\1\";
Если ФС.СуществуетФайл(СокрЛП(Каталог)+Формат(ТекущаяДата(),"ДДМММГГ")) = 0 Тогда
Сообщить("Создаю");
ФС.СоздатьКаталог("11232");
КонецЕсли;
КонецПроцедуры
Почему этот код не работает так, как ожидает программист? Проблема заключается в том, что метод СоздатьКаталог при передаче ему простого имени (например, "11232") пытается создать папку в текущем рабочем каталоге программы. Текущим каталогом может оказаться папка с базой данных, папка установки 1С или вовсе «Мои документы», в зависимости от того, как была запущена сессия. Объект ФС «не видит» ваших намерений создать подпапку именно в C:\Сеть\1\, если вы явно этого не указали.
Самый простой и надежный способ — всегда передавать в метод СоздатьКаталог полный путь к создаваемой папке. Разберем правильный пример реализации:
// Определяем базовый путь
ПутьКРодителю = "C:\Сеть\1\";
ИмяНовойПапки = "11232";
// Склеиваем путь и создаем каталог
ФС.СоздатьКаталог(ПутьКРодителю + ИмяНовойПапки);
Важно помнить о слешах. Если переменная ПутьКРодителю не заканчивается обратным слешем \, его необходимо добавить принудительно, иначе имя новой папки «приклеится» к имени последнего каталога в пути.
Если в коде предполагается многократная работа с одной и той же корневой директорией, мы можем воспользоваться методом УстТекКаталог(). Это «переключит» контекст работы объекта ФС на нужную нам ветку файловой системы.
Рассмотрим этот метод на примере:
КаталогНазначения = "C:\Сеть\1\";
// Устанавливаем контекст
ФС.УстТекКаталог(КаталогНазначения);
// Теперь ФС понимает, где создавать папку
ФС.СоздатьКаталог("11232");
Важное примечание: метод УстТекКаталог() может не сработать, если указанного пути на диске еще не существует. Поэтому этот метод хорош только для работы внутри уже созданной структуры.
Проанализируем важный нюанс: объект ФС в 1С 7.7 обладает существенным ограничением — он не умеет создавать вложенные пути (дерево каталогов) за один вызов. Если вы попытаетесь выполнить команду ФС.СоздатьКаталог("C:\Folder1\Folder2\Folder3"), и при этом папки Folder1 еще нет, команда завершится ошибкой.
Для решения этой задачи в рамках «чистой» 1С 7.7 нам пришлось бы писать рекурсивную функцию, которая проверяет каждый уровень вложенности. Однако существуют более изящные способы.
Выясним, как можно обойти ограничения платформы с помощью операционной системы. В Windows команда mkdir (или md) умеет автоматически создавать все недостающие промежуточные папки. Мы можем вызвать её прямо из кода 1С:
ПолныйПуть = "C:\Сеть\1\2023\Отчеты";
// Используем кавычки, чтобы избежать проблем с пробелами в путях
КомандаСистемы("mkdir """ + ПолныйПуть + """");
Этот способ крайне эффективен, так как он берет на себя всю логику по проверке существования родительских директорий.
Для профессиональной разработки часто рекомендуют использовать объект Scripting.FileSystemObject. Он предоставляет гораздо больше контроля над процессом и позволяет детально обрабатывать ошибки.
Разберем пример создания объекта и проверки пути:
// Создаем объект через ActiveX
Попытка
FSO = СоздатьОбъект("Scripting.FileSystemObject");
Путь = "C:\Сеть\1\НоваяПапка";
Если FSO.FolderExists(Путь) = 0 Тогда
FSO.CreateFolder(Путь);
КонецЕсли;
Исключение
Сообщить("Ошибка доступа к файловой системе: " + ОписаниеОшибки());
КонецПопытки;
Если каталог все равно не создается, проанализируем следующие причины:
C:\ или внутри Program Files без прав администратора будет заблокирована. Программа при этом может не выдать внятного сообщения.\\Server\Share\) объект ФС может вести себя нестабильно. Рекомендуется сначала проверить доступность сетевого ресурса.ФС.СуществуетФайл() возвращает 1, даже если по указанному пути найден файл без расширения, а не папка. Это может запутать логику проверки перед созданием.Для надежной работы всегда оборачивайте код работы с внешними ресурсами в конструкцию Попытка...Исключение. Хотя в стандартном языке 1С 7.7 она появилась не сразу, в большинстве актуальных релизов и при использовании внешних компонент это лучший способ избежать аварийного завершения работы пользователя.