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