К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как программно создать папку в 1С

Как программно создать папку в 1С через СоздатьКаталог, проверить существование каталога, обработать ошибки прав доступа и избежать типичных ошибок при работе с файловой системой.

Задача программного создания папки возникает в 1С постоянно: при выгрузке отчётов, обмене с другими системами, сохранении печатных форм и архивов, организации временных файлов обработок. Встроенный язык платформы предоставляет для этого простой инструмент — функцию СоздатьКаталог, но у неё есть нюансы, которые часто становятся источником ошибок в рабочих базах.

Основная сложность не в самом вызове, а в окружающих условиях: где выполняется код — на клиенте или на сервере, есть ли права на запись в выбранное расположение, существует ли уже такой каталог и что делать, если путь содержит несколько уровней вложенности. Ниже разобраны рабочие способы создания папок, проверка результата и типичные проблемы с готовыми решениями.

Материал ориентирован на платформу 1С:Предприятие 8.3 и применим как в обычных, так и в управляемых формах, в тонком и веб-клиенте — с учётом ограничений, которые указаны отдельно.

Базовый способ: функция СоздатьКаталог

Функция СоздатьКаталог(ИмяКаталога) — штатный метод встроенного языка. Она принимает полный или относительный путь и создаёт каталог вместе со всеми промежуточными уровнями. Например, если указать C:\Обмен\Выгрузка\Январь, а папки «Обмен» ещё нет, она будет создана автоматически вместе с остальными.

Минимальный пример кода:

СоздатьКаталог("C:\Выгрузка1С\Отчеты");
bsl
Процедура СоздатьПапкуВыгрузки()
	ИмяКаталога = "C:\Выгрузка1С\Отчеты";
	СоздатьКаталог(ИмяКаталога);
КонецПроцедуры

Важная особенность: если каталог уже существует, ошибки не возникает — вызов просто завершается без действий. Это удобно для повторяющихся операций, но одновременно означает, что функция не сообщит, создала ли она папку или она была раньше. Если это различие важно для логики обработки, проверку нужно делать отдельно.

Каталог создаётся с правами той учётной записи, под которой выполняется код. На клиенте это пользователь сеанса, на сервере — учётная запись агента сервера 1С (часто USR1CV8). Это ключевой момент, к которому мы вернёмся в разделе про ошибки доступа.

Проверка существования папки перед созданием

Хотя СоздатьКаталог не падает на существующей папке, во многих сценариях нужно знать, есть ли каталог: например, чтобы не очищать его повторно, не перезаписывать файлы или просто записать в журнал факт первичного создания. Для этого используется объект Файл и его метод Существует().

Файл = Новый Файл("C:\Выгрузка1С\Отчеты");

Если Не Файл.Существует() Тогда

СоздатьКаталог("C:\Выгрузка1С\Отчеты");

КонецЕсли;

Объект Файл не создаёт ничего на диске — это лишь описание пути, поэтому его можно безопасно использовать для любых проверок. Дополнительно полезно свойство ЭтоКаталог(): оно отличает папку от обычного файла с тем же именем.

Связка «проверил — создал — проверил результат» особенно важна в фоновых заданиях и регламентных операциях, где ошибка обнаруживается не сразу. Логирование каждого шага в журнал регистрации существенно упрощает поиск причины, если выгрузка внезапно перестала работать.

Работа с путями: слэши, пробелы и сетевые ресурсы

Платформа корректно обрабатывает и прямые, и обратные слэши в путях, поэтому C:/Выгрузка1С/Отчеты тоже сработает. Однако для читаемости кода и совместимости с внешними программами лучше придерживаться системного разделителя. Получить его можно через ПолучитьРазделительПути().

Пробелы в именах папок допустимы и не требуют экранирования внутри строки встроенного языка. Проблемы с пробелами возникают только когда путь передаётся дальше — в командную строку, скрипты или параметры внешних утилит, там путь уже нужно заключать в кавычки.

Сетевые пути вида \\Сервер\Обмен\Папка поддерживаются, но здесь критичны права доступа. Если код выполняется на сервере 1С, сетевой ресурс должен быть доступен учётной записи агента сервера, а не пользователю, запустившему обработку. Подключённые пользователем сетевые диски (например, Z:) на сервере обычно не видны — используйте полные UNC-пути.

Маршрут решения

Как выбрать расположение папки

Папка нужна только для временных файлов обработкиИспользуйте КаталогВременныхФайлов() — система сама управляет очисткой
Файлы должны быть доступны пользователю на его компьютереСоздавайте каталог в клиентском контексте и передавайте файлы с сервера через помещение во временное хранилище
Папка общая для всех пользователей и фоновых заданийСоздавайте на сервере по UNC-пути, заранее выдав права учётной записи агента сервера 1С
Путь формируется из данных пользователяПроверяйте имя на недопустимые символы (\/:*?"<>|) перед созданием

Создание папки на сервере и на клиенте: в чём разница

Одна и та же строка кода может создать папку в совершенно разных местах в зависимости от контекста выполнения. В директиве &НаСервере каталог появится на сервере 1С, в &НаКлиенте — на компьютере пользователя. В файловой базе, запущенной локально, разницы нет, но в клиент-серверном варианте это принципиально.

Типичная схема обмена файлами в клиент-серверной архитектуре выглядит так: сервер формирует файл в своём временном каталоге, данные передаются на клиента через временное хранилище (ПоместитьВоВременноеХранилище), и уже клиент сохраняет файл в папку, созданную на его машине. Создавать серверную папку, ожидая, что пользователь увидит её у себя, — распространённая ошибка начинающих разработчиков.

В веб-клиенте прямой доступ к файловой системе ограничен: без расширения работы с файлами создание произвольных каталогов недоступно. Если решение должно работать в браузере, закладывайте сохранение через диалоги выбора файла, а не через программное создание папок на клиенте.

Обработка ошибок и прав доступа

Если у учётной записи нет прав на создание каталога в указанном месте, платформа вызывает исключение. В пользовательском коде его следует перехватывать через Попытка ... Исключение ... КонецПопытки, иначе обработка завершится с непонятной пользователю ошибкой.

Попытка

СоздатьКаталог(ИмяКаталога);

Исключение

ЗаписьЖурналаРегистрации("Создание каталога",

УровеньЖурналаРегистрации.Ошибка, , ,

ОписаниеОшибки());

ВызватьИсключение "Не удалось создать папку: " + ИмяКаталога;

КонецПопытки;

Наиболее частые причины отказов: нет прав у учётной записи агента сервера на сетевой ресурс, путь заблокирован антивирусом или политиками безопасности, диск переполнен, путь содержит недопустимые символы. Отдельный случай — слишком длинный путь: при глубокой вложенности и длинных именах можно упереться в ограничение файловой системы на максимальную длину полного пути.

Типичные ошибки
01
Создание папки на сервере с ожиданием, что она появится у пользователя — в клиент-серверном режиме это разные компьютеры
02
Использование буквы сетевого диска вместо UNC-пути — на сервере подключённые пользователем диски не видны
03
Отсутствие обработки исключений — обработка падает целиком при первой же проблеме с правами
04
Формирование имени папки из данных документа без очистки — символы \ / : * ? " < > | вызывают ошибку
05
Проверка только Существует() без ЭтоКаталог() — файл с таким же именем принимается за папку

Практические приёмы и дополнительные возможности

Для временных файлов не создавайте собственные каталоги вручную — используйте КаталогВременныхФайлов() или ПолучитьИмяВременногоФайла() с последующим СоздатьКаталог. Такие папки размещаются в системном временном каталоге и не требуют заботы о правах и очистке.

Если нужно создать структуру вложенных папок по шаблону — например, «Год/Месяц/День» для архива выгрузок, — достаточно одного вызова с полным путём: промежуточные уровни создаются автоматически. Дополнительные циклы по уровням не нужны.

ПутьАрхива = "D:\Архив\" + Формат(ТекущаяДатаСеанса(), "ДФ=yyyy\\MM\\dd");

СоздатьКаталог(ПутьАрхива);

Для поиска и перебора уже существующих папок используется НайтиФайлы(Путь, Маска), который возвращает массив объектов Файл. В сочетании с проверкой ЭтоКаталог() это позволяет, например, убедиться, что структура обмена на месте, прежде чем запускать выгрузку.

Контрольные точки

Как проверить результат

Папка создана
Норма

Файл.Существует() возвращает Истина и ЭтоКаталог() = Истина

Тревожный признак

Путь не найден или по пути находится обычный файл

Доступ на запись
Норма

Тестовый файл в папке создаётся без исключения

Тревожный признак

Ошибка доступа при попытке записи — проблема с правами учётной записи

Расположение папки
Норма

Папка появилась на ожидаемом компьютере (сервер или клиент)

Тревожный признак

Папка создана не там — код выполняется не в том контексте

Сетевой путь
Норма

UNC-путь доступен и из клиентского, и из серверного контекста

Тревожный признак

Путь доступен только пользователю — агент сервера его не видит

Частые вопросы о создании папок в 1С

Итог

Что важно запомнить

Папка создаётся одной функцией СоздатьКаталог, которая строит всю цепочку вложенности и не ругается на существующий каталог. Главные источники проблем — контекст выполнения (клиент или сервер), права учётной записи агента сервера на сетевые ресурсы и недопустимые символы в имени. Проверяйте результат через объект Файл и всегда оборачивайте вызов в Попытка/Исключение.

Можно ли создать папку в 1С без прав администратора?

Да, если каталог создаётся в расположении, где у учётной записи есть права на запись: в профиле пользователя, временном каталоге, специально выделенной сетевой папке. Права администратора нужны только для защищённых системных расположений.

Почему СоздатьКаталог не выдаёт ошибку, но папки нет?

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

Как создать папку, если путь содержит русские буквы?

Кириллица в путях полностью поддерживается платформой, дополнительных действий не требуется. Проблемы возможны только при передаче такого пути во внешние программы с другой кодировкой — там путь лучше передавать через параметры, а не консольные команды.

Как удалить программно созданную папку?

Используется метод УдалитьФайлы(Путь) — он удаляет и файлы, и каталоги, включая вложенные. Операция необратима, поэтому перед удалением проверяйте, что путь указывает именно на рабочую папку обработки, а не на пользовательский или системный каталог.

Можно ли создать папку на FTP или в облаке через СоздатьКаталог?

Нет, функция работает только с локальной файловой системой и сетевыми ресурсами, подключёнными как папки. Для FTP используется объект FTPСоединение с методом СоздатьКаталог уже на уровне FTP-протокола, а облачные хранилища обычно требуют работы через их API.

Что делать, если имя папки формируется из наименования контрагента?

Очистите строку от недопустимых для файловой системы символов: \ / : * ? " < > |. Проще всего последовательно заменить их через СтрЗаменить на безопасный символ, например подчёркивание, и ограничить длину итогового имени.