Разработка и Конфигурация · 9 мин
Как создать каталог на диске в 1С
Как создать каталог на диске в 1С: метод СоздатьКаталог, НайтиФайлы, работа с путями, права доступа и типичные ошибки. Примеры кода на встроенном языке.
В задачах обмена данными, выгрузки отчётов и архивации файлов разработчику 1С регулярно требуется создать каталог (папку) на диске. Во встроенном языке для этого предусмотрен метод СоздатьКаталог(), который работает одинаково на клиенте и на сервере, но имеет важные особенности: вложенные папки он не создаёт, а при отсутствии прав выдаёт ошибку.
Ниже разобраны рабочие сценарии: создание одиночной папки, построение многоуровневой структуры, проверка существования каталога, выбор пути через диалог и обработка типичных ошибок. Все примеры применимы к управляемым формам и тонкому клиенту, а также к серверному коду в общих модулях.
Базовый метод СоздатьКаталог
Основной инструмент — глобальный метод СоздатьКаталог(ИмяКаталога). В параметре передаётся полный или относительный путь. При успешном выполнении папка появляется на диске, при ошибке (нет прав, недопустимые символы, несуществующий родительский путь) вызывается исключение.
Процедура СоздатьПапкуВыгрузки()
ПутьККаталогу = "D:\Обмен\Выгрузка";
Попытка
СоздатьКаталог(ПутьККаталогу);
Сообщить("Каталог создан: " + ПутьККаталогу);
Исключение
Сообщить("Ошибка: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедурыВажная особенность: если каталог уже существует, метод также вызывает исключение с сообщением о том, что невозможно создать существующую папку. Поэтому в рабочем коде создание почти всегда предваряется проверкой существования.
Проверка существования каталога перед созданием
Стандартный способ проверки — метод НайтиФайлы(), который возвращает массив найденных файлов и каталогов. Если массив не пуст и найденный объект является каталогом, создавать папку не нужно.
Функция КаталогСуществует(Путь)
Найденные = НайтиФайлы(Путь, "*");
Если Найденные.Количество() > 0 Тогда
Возврат Найденные[0].ЭтоКаталог();
КонецЕсли;
// Проверка самого пути как каталога
Файл = Новый Файл(Путь);
Возврат Файл.Существует();
КонецФункцииБолее простой вариант — объект Файл: конструктор принимает путь, а метод Существует() возвращает Истина, если такой файл или каталог есть на диске. Для различения файла и папки используйте метод ЭтоКаталог().
Типовой шаблон «создать, если нет» выглядит так: проверили через Новый Файл(Путь), при отсутствии вызвали СоздатьКаталог, результат обернули в Попытка/Исключение. Это защищает от гонок, когда папку создаёт другой процесс между проверкой и созданием.
Создание вложенной структуры каталогов
Для построения цепочки вида D:\Архив\2026\Январь путь разбивают на части и создают каждый уровень последовательно. Удобно написать универсальную процедуру, которую затем вызывать из любого места конфигурации.
Процедура СоздатьКаталогРекурсивно(ПолныйПуть)
Разделитель = ПолучитьРазделительПути();
Части = СтрРазделить(ПолныйПуть, Разделитель);
ТекущийПуть = "";
Для Каждого Часть Из Части Цикл
ТекущийПуть = ?(ТекущийПуть = "", Часть, ТекущийПуть + Разделитель + Часть);
Файл = Новый Файл(ТекущийПуть);
Если Не Файл.Существует() Тогда
СоздатьКаталог(ТекущийПуть);
КонецЕсли;
КонецЦикла;
КонецПроцедурыФункция ПолучитьРазделительПути() возвращает «\» для Windows и «/» для Linux, что делает код переносимым между серверами на разных ОС. Не зашивайте обратный слэш в строки жёстко, если база может работать на Linux-сервере.
- 1Сформируйте полный путь к нужному каталогу
- 2Проверьте существование через Новый Файл(Путь)
- 3Создайте недостающие уровни по очереди
- 4Оберните создание в Попытка/Исключение
- 5Проверьте результат повторным вызовом Существует()
Выбор пути пользователем через диалог
Если папку должен указывать пользователь, используйте объект ДиалогВыбораФайла в режиме выбора каталога. В тонком клиенте диалог работает асинхронно через Показать() с описанием оповещения.
&НаКлиенте
Процедура ВыбратьКаталог(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
Диалог.Заголовок = "Выберите папку для выгрузки";
Если Диалог.Выбрать() Тогда
ПутьВыгрузки = Диалог.Каталог;
КонецЕсли;
КонецПроцедурыПосле выбора имеет смысл сразу проверить доступность папки на запись: создать в ней временный файл и удалить его. Это отсечёт ситуации, когда пользователь указал защищённый системный каталог вроде C:\Windows.
Где выполняется код: клиент или сервер
Ключевой нюанс — место создания каталога. Код с директивой &НаКлиенте создаёт папку на компьютере пользователя, а &НаСервере — на сервере 1С под учётной записью агента сервера (обычно USR1CV8). Частая ошибка новичка — создать папку на сервере и искать её на своём компьютере.
Если файл нужен пользователю, создавайте его на клиенте либо передавайте с сервера через временное хранилище (ПоместитьВоВременноеХранилище и ПолучитьФайл). Для серверных регламентных заданий, наоборот, используйте серверный путь, доступный учётной записи агента.
Как выбрать действие
Временные каталоги и очистка
Для промежуточных файлов удобна функция КаталогВременныхФайлов() — она возвращает путь к системной папке временных файлов. В ней можно создать подкаталог с уникальным именем, например через Новый УникальныйИдентификатор.
После завершения операции временные файлы и созданный подкаталог следует удалить методом УдалитьФайлы(Путь). Иначе на сервере постепенно накапливается мусор, который при активной выгрузке отчётов способен занять значительное место на диске.
Проверка результата и типичные ошибки
Надёжный признак успеха — повторная проверка: после СоздатьКаталог создайте объект Файл с тем же путём и убедитесь, что Существует() вернуло Истина, а ЭтоКаталог() — тоже Истина. Для проверки прав на запись создайте и удалите тестовый файл.
Как проверить результат
Файл.Существует() = Истина
Исключение при создании или Ложь после вызова
ЭтоКаталог() = Истина
Это файл с таким же именем — путь занят
Тестовый файл создаётся и удаляется
Ошибка доступа — не хватает прав учётной записи
Если ошибка возникает только на сервере, первым делом проверьте права учётной записи агента сервера 1С на целевую папку. Вторая частая причина — сетевой путь: служба сервера 1С может не иметь доступа к сетевым ресурсам, подключённым как диски интерактивного пользователя. Используйте UNC-пути вида \\Сервер\Ресурс\Папка и выдайте права именно служебной учётной записи.
Что важно запомнить
Каталог создаётся методом СоздатьКаталог с предварительной проверкой через объект Файл. Вложенные пути строятся поуровнево, код оборачивается в Попытка/Исключение, а место выполнения (клиент или сервер) выбирается исходя из того, кому нужен результат.
Частые вопросы
Как создать каталог, если путь содержит пробелы?
Пробелы в пути не мешают работе СоздатьКаталог — передавайте строку как есть, без кавычек и экранирования. Кавычки нужны только при передаче пути в командную строку через КомандаСистемы() или ЗапуститьПриложение().
Почему СоздатьКаталог выдаёт ошибку, хотя папки нет?
Чаще всего не существует родительский каталог — метод не создаёт промежуточные уровни. Также проверьте недопустимые символы в имени (двоеточие, звёздочка, вопросительный знак) и права учётной записи, под которой выполняется код.
Как создать каталог на сетевом диске?
Используйте UNC-путь вида \\Сервер\Ресурс\Папка. Буква сетевого диска, подключённая пользователем, недоступна службе сервера 1С. Убедитесь, что у учётной записи агента сервера есть права на сетевой ресурс.
Можно ли создать каталог в веб-клиенте?
На диске пользователя — только после выбора папки через диалог и с установленным расширением работы с файлами. Произвольный путь без участия пользователя веб-клиент создать не может из соображений безопасности браузера.
Как удалить созданный каталог вместе с содержимым?
Используйте УдалитьФайлы(Путь) — метод удаляет каталог со всеми вложенными файлами и подкаталогами. Операцию стоит обернуть в Попытка/Исключение и убедиться, что путь сформирован правильно, чтобы не удалить лишние данные.
Чем КаталогВременныхФайлов отличается от КаталогПрограммы?
КаталогВременныхФайлов() возвращает системную временную папку текущего пользователя — подходит для промежуточных файлов. КаталогПрограммы() указывает на папку установки платформы, куда писать рабочие данные не следует: там может не быть прав на запись.