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