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