Разработка и Конфигурация · 11 мин
Как проверить существование каталога в 1С
Проверка существования каталога в 1С: функция КаталогСуществует, объект Файл, различия тонкого и серверного контекста, типичные ошибки и примеры готового кода.
При разработке на платформе 1С:Предприятие регулярно возникает задача убедиться, что нужный каталог существует, прежде чем записывать туда файлы, читать данные или запускать обмен. Если пропустить эту проверку, обработка завершится ошибкой вида «Ошибка при вызове метода контекста» либо молча запишет файл не туда, куда ожидал пользователь. Проверка занимает несколько строк кода, но у неё есть важные нюансы: где выполняется код (клиент или сервер), под какой учётной записью работает процесс и какой метод выбрать.
Во встроенном языке 1С есть два основных способа проверить существование каталога: глобальная функция КаталогСуществует() и объект Файл с методом Существует() и свойством ЭтоКаталог(). Оба работают и на клиенте, и на сервере, но ведут себя по-разному в зависимости от контекста выполнения и от того, что именно передано в пути — файл или папка.
Ниже разобраны оба подхода с готовыми примерами кода, различия клиентского и серверного выполнения, проверка прав доступа, создание каталога при его отсутствии и типичные ошибки, из-за которых проверка возвращает неожиданный результат.
Функция КаталогСуществует: самый простой способ
Функция КаталогСуществует() принимает один параметр — строку с полным или относительным путём к каталогу — и возвращает булево значение. Важная особенность: она вернёт Ложь, если по указанному пути находится файл, а не каталог. То есть функция проверяет не только факт существования, но и тип объекта файловой системы.
Типовой пример использования:
ПутьККаталогу = "D:\Обмен\Выгрузка";
Если КаталогСуществует(ПутьККаталогу) Тогда
Сообщить("Каталог найден, можно записывать файлы");
Иначе
Сообщить("Каталог не существует: " + ПутьККаталогу);
КонецЕсли;
Функция работает одинаково в тонком, толстом и веб-клиенте, а также на сервере. На Linux-сервере пути задаются в стиле /opt/exchange/upload, поэтому для кроссплатформенных решений путь лучше формировать через объединение частей, а не жёстко прописывать обратные слэши. В Windows регистр букв в пути не важен, в Linux — важен, и это частая причина «невидимого» каталога при переносе решения между платформами.
Проверка через объект Файл
Второй способ — создать объект Файл, вызвать метод Существует(), а затем уточнить тип объекта через ЭтоКаталог(). Этот вариант длиннее, но универсальнее: он подходит, когда заранее неизвестно, что находится по пути — файл или папка, и когда нужны дополнительные сведения (размер, время изменения, атрибуты).
ПутьККаталогу = "D:\Обмен\Выгрузка";
ФайлОбъект = Новый Файл(ПутьККаталогу);
Если Не ФайлОбъект.Существует() Тогда
Сообщить("Путь не существует");
ИначеЕсли ФайлОбъект.ЭтоКаталог() Тогда
Сообщить("Это каталог, всё в порядке");
Иначе
Сообщить("По этому пути находится файл, а не каталог");
КонецЕсли;
Метод Существует() выполняет реальное обращение к файловой системе при каждом вызове, поэтому в циклах с большим числом проверок стоит учитывать стоимость обращения, особенно для сетевых путей. Если проверяется один и тот же путь многократно в рамках одной операции, результат разумно сохранить в переменную.
Когда какой способ выбрать
Сравнение вариантов
Подходит, когда нужна только проверка «есть ли такая папка». Короче и читабельнее. Не даёт дополнительной информации об объекте.
Подходит, когда нужно отличить файл от каталога, получить атрибуты, время изменения или потом работать с этим объектом дальше. Код длиннее.
На практике для простых проверок перед записью файла достаточно КаталогСуществует(). Объект Файл оправдан в универсальных процедурах, куда путь приходит параметром и его содержимое заранее неизвестно.
Клиент или сервер: где выполняется проверка
Ключевой нюанс, на котором спотыкаются даже опытные разработчики: проверка выполняется в той файловой системе, где работает код. Если процедура объявлена с директивой &НаСервере, то КаталогСуществует("C:\Обмен") проверяет диск C сервера 1С, а не компьютера пользователя. В файловом варианте базы клиент и сервер физически совпадают, и ошибка незаметна; при переходе на клиент-серверный вариант код внезапно «перестаёт видеть» привычные папки.
Для клиентских проверок используйте директиву &НаКлиенте и учитывайте, что в веб-клиенте доступ к локальной файловой системе ограничен: без расширения работы с файлами прямая проверка пути может быть недоступна, и платформа предложит его установить.
Ещё одно следствие: сервер 1С работает под своей учётной записью (в Windows это часто специальная служебная учётная запись агента сервера). Сетевой путь вида \\FileServer\Обмен, который открывается у пользователя в проводнике, может быть недоступен серверу из-за отсутствия прав. Проверка КаталогСуществует() в этом случае честно вернёт Ложь, хотя «папка на самом деле есть».
Создание каталога, если он не найден
Частый сценарий — не просто проверить, а гарантировать наличие каталога перед записью. Для этого проверку совмещают с методом СоздатьКаталог(). Глобальный метод СоздатьКаталог() создаёт всю цепочку вложенных папок целиком, поэтому предварительно проверять каждый уровень не нужно.
ПутьККаталогу = "D:\Обмен\Выгрузка\" + Формат(ТекущаяДатаСеанса(), "ДФ=yyyy-MM-dd");
Если Не КаталогСуществует(ПутьККаталогу) Тогда
Попытка
СоздатьКаталог(ПутьККаталогу);
Исключение
Сообщить("Не удалось создать каталог: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
КонецЕсли;
Оборачивать создание в попытку обязательно: при недостатке прав, неверном пути или переполненном диске метод выбрасывает исключение, и без обработки пользователь увидит техническое окно ошибки. После создания полезно повторно убедиться, что каталог действительно появился, — это отсекает ситуации с «тихими» сбоями на сетевых ресурсах.
- 1Сформируйте полный путь к каталогу в переменной
- 2Проверьте его функцией КаталогСуществует()
- 3Если каталога нет — создайте его методом СоздатьКаталог() внутри Попытка/Исключение
- 4Повторно проверьте существование каталога
- 5Только после успешной проверки записывайте файлы
Типичные ошибки и как их избежать
Первая группа ошибок связана с самим путём. Завершающий слэш в конце пути обычно не мешает проверке, но в некоторых сценариях с сетевыми ресурсами и при последующей склейке имён файлов приводит к двойным разделителям. Надёжнее нормализовать путь: убрать завершающий слэш перед проверкой и добавлять его только при формировании полного имени файла.
Вторая группа — контекст выполнения, описанный выше: проверка клиентского пути на сервере и наоборот. Третья группа — использование относительных путей. Относительный путь отсчитывается от рабочего каталога процесса, который у сервера 1С и у клиентского приложения разный и заранее не очевиден. В прикладном коде всегда используйте абсолютные пути.
Проверка результата и контрольные точки
Чтобы убедиться, что проверка работает правильно, протестируйте её на трёх наборах данных: существующий каталог, несуществующий путь и путь, где вместо каталога лежит файл с таким именем. Все три ветки должны отрабатывать предсказуемо и выдавать понятные сообщения.
Как проверить результат
КаталогСуществует() возвращает Истина, запись файлов проходит
Возвращает Ложь — проверьте контекст выполнения, права и регистр букв
Возвращает Ложь, срабатывает ветка создания или сообщение пользователю
Возвращает Истина — вероятно, проверяется не тот путь или не та сторона (клиент/сервер)
КаталогСуществует() возвращает Ложь, объект Файл показывает ЭтоКаталог() = Ложь
Код пытается писать в файл как в папку — добавьте проверку типа объекта
Для регламентных заданий, где некому показать сообщение, результат проверки фиксируйте в журнале регистрации через ЗаписьЖурналаРегистрации() — тогда администратор увидит, почему обмен не отработал, вместо молчаливого пропуска.
В типовых конфигурациях пути к каталогам обмена обычно хранятся в настройках или константах. Полезно добавить в форму настройки кнопку «Проверить каталог», которая выполняет проверку именно с той стороны (клиент или сервер), где будет работать обмен, — это снимает большинство вопросов пользователей ещё до запуска.
FAQ
Чем КаталогСуществует() отличается от Файл.Существует()?
КаталогСуществует() возвращает Истина только если путь существует и является каталогом. Метод Существует() объекта Файл вернёт Истина и для файла, и для каталога — тип объекта уточняется отдельно через ЭтоКаталог(). Для простой проверки папки достаточно первого варианта.
Почему проверка возвращает Ложь, хотя папка точно есть?
Чаще всего код выполняется на сервере, а путь указывает на диск компьютера пользователя. Другие причины: недостаток прав у учётной записи сервера 1С, опечатка или лишний пробел в пути, различие регистра букв на Linux-платформе.
Работает ли проверка в веб-клиенте?
Да, но с ограничениями: для доступа к локальной файловой системе пользователю потребуется установить расширение работы с файлами. Без него прямые операции с локальными путями в веб-клиенте недоступны.
Нужно ли проверять каждый уровень вложенности перед СоздатьКаталог()?
Нет. Метод СоздатьКаталог() создаёт всю цепочку вложенных каталогов за один вызов, поэтому достаточно одной проверки конечного пути и одной попытки создания с обработкой исключения.
Как проверить не только существование, но и возможность записи?
Отдельной функции проверки прав нет. Практический приём — попытаться создать в каталоге временный файл и сразу удалить его внутри Попытка/Исключение. Успешное выполнение означает, что запись разрешена.
Что делать, если путь хранится в настройках и его меняют пользователи?
Добавьте в форму настройки кнопку проверки, выполняющей КаталогСуществует() в том же контексте, что и рабочий обмен. Перед проверкой обрежьте пробелы и завершающий слэш — это устраняет большинство ложных срабатываний.
Что важно запомнить
Для проверки каталога используйте КаталогСуществует(), для различения файла и папки — объект Файл. Всегда учитывайте, где выполняется код: сервер видит свою файловую систему и работает под своей учётной записью. Пути задавайте абсолютными, создание каталога оборачивайте в Попытка/Исключение, а результат проверки в регламентных заданиях пишите в журнал регистрации.