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