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

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

Как проверить наличие каталога в 1С

Как проверить наличие каталога в 1С: функция НайтиФайлы, объект Файл, проверка каталога базы данных, типичные ошибки и готовые примеры кода.

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

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

Что именно требуется проверить: уточняем задачу

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

Способ проверки зависит от того, где выполняется код. В клиент-серверном режиме код на сервере видит файловую систему сервера, а не компьютера пользователя. Поэтому путь C:\Обмен, проверенный на сервере, не имеет отношения к диску C клиентской машины. Это самая частая причина «непонятных» ошибок: на тестовом компьютере разработчика всё работает, а в рабочей базе — нет.

Проверка через объект Файл — основной способ

Универсальный приём — создать объект Файл с нужным путём и проанализировать два свойства: Существует() показывает, есть ли объект по указанному пути, а ЭтоКаталог() — является ли он именно каталогом, а не файлом. Важно проверять оба условия: если по пути лежит обычный файл с таким же именем, одной проверки существования недостаточно.

Файл = Новый Файл("D:\Обмен\Выгрузка");

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

// Каталог есть, можно работать

Иначе

// Каталога нет или по пути находится файл

КонецЕсли;

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

bsl
Файл = Новый Файл(ПутьККаталогу);
Если Не Файл.Существует() Тогда
    СоздатьКаталог(ПутьККаталогу);
КонецЕсли;

Проверка через НайтиФайлы

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

Найденные = НайтиФайлы("D:\Обмен", "Выгрузка");

Если Найденные.Количество() > 0 И Найденные[0].ЭтоКаталог() Тогда

// Каталог найден

КонецЕсли;

Этот способ удобен, когда точное имя папки неизвестно или нужно найти несколько каталогов по шаблону, например все папки вида Выгрузка_*. Для простой проверки одного известного пути он избыточен: объект Файл короче и нагляднее. Учтите, что НайтиФайлы при недоступном пути может вызвать исключение, поэтому в прикладном коде вызов стоит оборачивать в Попытка...Исключение.

Сравнение вариантов

Объект Файл

Подходит для проверки одного известного пути. Короткий код, понятная логика, но без поиска по маске.

НайтиФайлы

Подходит для поиска по маске и перебора нескольких каталогов. Требует обработки исключений и проверки ЭтоКаталог у результатов.

СоздатьКаталог

Не проверка, а гарантия результата: создаёт папку со всей цепочкой родителей, не падает, если каталог уже есть.

Проверка каталога информационной базы и служебных папок

Для файловой базы путь к каталогу виден в строке подключения: его можно получить через функцию СтрокаСоединенияИнформационнойБазы() и извлечь параметр File. Дальше применяется та же проверка через объект Файл. В клиент-серверном варианте каталога базы на диске в привычном смысле нет — данные хранятся в СУБД, и проверять файловый путь бессмысленно.

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

Тонкие места: сетевые пути, разделители и права

Сетевые пути вида \\Server\Share\Обмен проверяются так же, но добавляются риски: сетевая папка может быть временно недоступна, а служба сервера 1С обычно работает под учётной записью, у которой нет доступа к сетевым ресурсам, доступным пользователю. Если проверка на сервере «не видит» заведомо существующую папку — первым делом смотрите, под какой учётной записью работает агент сервера.

Ещё несколько практических моментов. Разделитель пути в Windows — обратный слэш, но платформа корректно обрабатывает и прямой. Пути с пробелами и кириллицей в кавычки внутри кода брать не нужно. Регистр букв в именах папок в Windows не учитывается. А вот завершающий слэш в пути лучше добавлять осознанно: для объекта Файл он не критичен, но при склейке путей строкой его отсутствие даст неверный результат вида D:\ОбменВыгрузка\file.xml.

Типичные ошибки
01
Проверка только Существует() без ЭтоКаталог(): одноимённый файл принимается за папку, запись завершается ошибкой.
02
Проверка клиентского пути на сервере: код ищет папку не на том компьютере и не находит её.
03
Игнорирование исключений при недоступном сетевом пути: обмен падает с непонятным сообщением вместо понятной диагностики.
04
Склейка путей строкой без разделителя: получается несуществующий путь, хотя обе части по отдельности верны.

Готовая функция проверки с созданием каталога

В прикладном коде удобно оформить проверку отдельной функцией, которая возвращает понятный результат и при необходимости создаёт папку. Такой подход избавляет от дублирования логики в местах вызова и централизует обработку ошибок.

Функция КаталогДоступен(Путь, Создавать = Ложь) Экспорт

Файл = Новый Файл(Путь);

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

Возврат Файл.ЭтоКаталог();

КонецЕсли;

Если Создавать Тогда

Попытка

СоздатьКаталог(Путь);

Возврат Истина;

Исключение

Возврат Ложь;

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

КонецЕсли;

Возврат Ложь;

КонецФункции

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

Порядок действий
  1. 1
    Определите, где выполняется код: на клиенте или на сервере — от этого зависит, чья файловая система проверяется.
  2. 2
    Создайте объект Файл с нужным путём и проверьте Существует() и ЭтоКаталог().
  3. 3
    При необходимости создайте каталог методом СоздатьКаталог, обернув вызов в Попытка...Исключение.
  4. 4
    Выполните тестовую запись и удаление файла, чтобы убедиться в наличии прав.
  5. 5
    Проверьте результат под той учётной записью, под которой код будет работать в реальной эксплуатации.

Как убедиться, что проверка работает правильно

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

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

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

Существующий каталог
Норма

Функция возвращает Истина, Существует() и ЭтоКаталог() истинны

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

Возвращается Ложь при заведомо существующей папке — проверьте путь и контекст выполнения

Путь занят файлом
Норма

ЭтоКаталог() возвращает Ложь, код корректно сообщает о конфликте

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

Проверка проходит, запись падает с ошибкой

Нет прав на запись
Норма

Тестовая запись выявляет проблему до начала основной операции

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

Ошибка возникает в середине выгрузки, данные частично записаны

Частые вопросы

Есть ли в 1С встроенная функция «КаталогСуществует»?

Нет, отдельной функции с таким именем во встроенном языке нет. Проверку выполняют через объект Файл с методами Существует() и ЭтоКаталог() либо через функцию НайтиФайлы. Во многих типовых конфигурациях есть собственные обёртки в общих модулях — поищите по слову «Каталог» в модулях работы с файлами.

Почему проверка работает у меня, но не работает в рабочей базе?

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

Чем отличается СоздатьКаталог от проверки существования?

СоздатьКаталог — это действие, а не проверка: метод создаёт каталог вместе со всей цепочкой родительских папок. Если каталог уже существует, ошибки не будет. Поэтому вместо связки «проверить, потом создать» часто достаточно одного вызова СоздатьКаталог в блоке Попытка...Исключение.

Как проверить сетевой каталог, доступный по UNC-пути?

Технически — так же, через объект Файл с путём вида \\Сервер\Ресурс\Папка. Практическая сложность в доступе: служба сервера 1С должна работать под учётной записью, имеющей права на этот ресурс, а сам ресурс должен быть доступен в момент проверки. Оборачивайте вызов в обработку исключений.

НайтиФайлы возвращает пустой массив, хотя папка есть. В чём дело?

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

Итог

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

Наличие каталога в 1С проверяется объектом Файл через пару Существует() + ЭтоКаталог() или функцией НайтиФайлы. Всегда учитывайте контекст выполнения (клиент или сервер), проверяйте права записи тестовым файлом и оборачивайте файловые операции в обработку исключений.