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