Как правильно создать каталог в 1С 7.7 через объект ФС

Программист 1С v7.7
← На главную

В процессе разработки на платформе 1С:Предприятие 7.7 часто возникает необходимость автоматического создания папок на диске — например, для выгрузки отчетов, сохранения логов или структурирования архивов. Несмотря на кажущуюся простоту задачи, начинающие разработчики часто сталкиваются с ошибкой «Ошибка при выполнении команды». В этой статье мы подробно разберем, как правильно использовать объект ФС (Файловая Система), проанализируем типичные ошибки и рассмотрим альтернативные способы создания каталогов, включая работу с системными командами Windows.

Разбор основной проблемы: относительные и полные пути

Рассмотрим ситуацию, с которой столкнулся автор темы. В коде была попытка создать каталог следующим образом:


Процедура Сформировать()
    Каталог ="C:\Сеть\1\";
    Если ФС.СуществуетФайл(СокрЛП(Каталог)+Формат(ТекущаяДата(),"ДДМММГГ")) = 0 Тогда
        Сообщить("Создаю");
        ФС.СоздатьКаталог("11232"); 
    КонецЕсли;
КонецПроцедуры

Почему этот код не работает так, как ожидает программист? Проблема заключается в том, что метод СоздатьКаталог при передаче ему простого имени (например, "11232") пытается создать папку в текущем рабочем каталоге программы. Текущим каталогом может оказаться папка с базой данных, папка установки 1С или вовсе «Мои документы», в зависимости от того, как была запущена сессия. Объект ФС «не видит» ваших намерений создать подпапку именно в C:\Сеть\1\, если вы явно этого не указали.

Решение 1: Использование полного пути

Самый простой и надежный способ — всегда передавать в метод СоздатьКаталог полный путь к создаваемой папке. Разберем правильный пример реализации:


// Определяем базовый путь
ПутьКРодителю = "C:\Сеть\1\";
ИмяНовойПапки = "11232";

// Склеиваем путь и создаем каталог
ФС.СоздатьКаталог(ПутьКРодителю + ИмяНовойПапки);

Важно помнить о слешах. Если переменная ПутьКРодителю не заканчивается обратным слешем \, его необходимо добавить принудительно, иначе имя новой папки «приклеится» к имени последнего каталога в пути.

Решение 2: Предварительная установка текущего каталога

Если в коде предполагается многократная работа с одной и той же корневой директорией, мы можем воспользоваться методом УстТекКаталог(). Это «переключит» контекст работы объекта ФС на нужную нам ветку файловой системы.

Рассмотрим этот метод на примере:


КаталогНазначения = "C:\Сеть\1\";
// Устанавливаем контекст
ФС.УстТекКаталог(КаталогНазначения);
// Теперь ФС понимает, где создавать папку
ФС.СоздатьКаталог("11232");

Важное примечание: метод УстТекКаталог() может не сработать, если указанного пути на диске еще не существует. Поэтому этот метод хорош только для работы внутри уже созданной структуры.

Глубокий анализ ограничений метода СоздатьКаталог

Проанализируем важный нюанс: объект ФС в 1С 7.7 обладает существенным ограничением — он не умеет создавать вложенные пути (дерево каталогов) за один вызов. Если вы попытаетесь выполнить команду ФС.СоздатьКаталог("C:\Folder1\Folder2\Folder3"), и при этом папки Folder1 еще нет, команда завершится ошибкой.

Для решения этой задачи в рамках «чистой» 1С 7.7 нам пришлось бы писать рекурсивную функцию, которая проверяет каждый уровень вложенности. Однако существуют более изящные способы.

Альтернатива 1: Использование системной команды mkdir

Выясним, как можно обойти ограничения платформы с помощью операционной системы. В Windows команда mkdir (или md) умеет автоматически создавать все недостающие промежуточные папки. Мы можем вызвать её прямо из кода 1С:


ПолныйПуть = "C:\Сеть\1\2023\Отчеты";
// Используем кавычки, чтобы избежать проблем с пробелами в путях
КомандаСистемы("mkdir """ + ПолныйПуть + """");

Этот способ крайне эффективен, так как он берет на себя всю логику по проверке существования родительских директорий.

Альтернатива 2: Работа через FileSystemObject (FSO)

Для профессиональной разработки часто рекомендуют использовать объект Scripting.FileSystemObject. Он предоставляет гораздо больше контроля над процессом и позволяет детально обрабатывать ошибки.

Разберем пример создания объекта и проверки пути:


// Создаем объект через ActiveX
Попытка
    FSO = СоздатьОбъект("Scripting.FileSystemObject");
    Путь = "C:\Сеть\1\НоваяПапка";
    Если FSO.FolderExists(Путь) = 0 Тогда
        FSO.CreateFolder(Путь);
    КонецЕсли;
Исключение
    Сообщить("Ошибка доступа к файловой системе: " + ОписаниеОшибки());
КонецПопытки;

Типичные ошибки и способы их диагностики

Если каталог все равно не создается, проанализируем следующие причины:

  1. Права доступа (UAC): В современных ОС Windows (10, 11) попытка создать папку в корне диска C:\ или внутри Program Files без прав администратора будет заблокирована. Программа при этом может не выдать внятного сообщения.
  2. Сетевые пути: При работе с UNC-путями (например, \\Server\Share\) объект ФС может вести себя нестабильно. Рекомендуется сначала проверить доступность сетевого ресурса.
  3. Особенности метода СуществуетФайл(): Помните, что в 1С 7.7 функция ФС.СуществуетФайл() возвращает 1, даже если по указанному пути найден файл без расширения, а не папка. Это может запутать логику проверки перед созданием.
  4. Длина пути: Старайтесь не превышать лимит в 260 символов для полного пути к папке, так как старые методы 1С 7.7 плохо справляются с длинными именами (LFN) в некоторых сценариях.

Для надежной работы всегда оборачивайте код работы с внешними ресурсами в конструкцию Попытка...Исключение. Хотя в стандартном языке 1С 7.7 она появилась не сразу, в большинстве актуальных релизов и при использовании внешних компонент это лучший способ избежать аварийного завершения работы пользователя.

← На главную