Разработка и Конфигурация · 9 мин
1С: как получить файлы из каталога
Как в 1С получить список файлов из каталога: НайтиФайлы, маски, рекурсивный обход, проверка атрибутов, работа на клиенте и сервере, типичные ошибки.
Задача получить список файлов из каталога возникает в 1С постоянно: загрузка прайсов из папки обмена, подбор фотографий номенклатуры, импорт электронных документов, обработка выгрузок из других систем. Во встроенном языке для этого есть штатный метод НайтиФайлы(), который работает и на клиенте, и на сервере и не требует внешних компонент.
Метод возвращает массив объектов типа Файл, из которых можно прочитать имя, полный путь, расширение, размер, дату изменения и признак «это каталог». Дальше файлы можно открыть, скопировать, переместить или передать в обработку загрузки. Важно только понимать, где выполняется код — на клиенте или на сервере: доступные пути и права будут разными.
Ниже разобраны практические сценарии: простой перебор файлов, фильтрация по маске, рекурсивный обход вложенных папок, работа в клиент-серверном режиме и проверка результата. Примеры кода приведены для управляемых форм и общих модулей.
Метод НайтиФайлы: синтаксис и базовый пример
Метод НайтиФайлы() имеет три параметра: путь к каталогу, маска поиска и признак поиска во вложенных подкаталогах. Все параметры, кроме первого, необязательны. Если маску не указать, будут возвращены все файлы и подкаталоги указанной папки.
ПутьККаталогу = "D:\Обмен\Загрузка";
НайденныеФайлы = НайтиФайлы(ПутьККаталогу, "*.xml");
Для Каждого Файл Из НайденныеФайлы Цикл
Сообщить(Файл.ПолноеИмя + " — " + Файл.Размер() + " байт");
КонецЦикла;Каждый элемент массива — объект Файл. Его основные свойства: Имя (имя с расширением), ИмяБезРасширения, Расширение, ПолноеИмя (полный путь), Путь (каталог без имени файла), Размер(), ПолучитьВремяИзменения() и метод ЭтоКаталог().
Порядок элементов в массиве платформой не гарантируется. Если файлы должны обрабатываться в определённой последовательности (например, пакеты обмена с номерами в имени), отсортируйте массив самостоятельно — через СписокЗначений с сортировкой или запись в ТаблицуЗначений.
Фильтрация по маске и расширению
Маска задаётся во втором параметре и поддерживает символы (любая последовательность) и ? (один символ). Примеры: .xml — все XML-файлы, price_????.csv — файлы вида price_0001.csv, . — все объекты каталога.
Маска сравнивается без учёта регистра на большинстве платформ, но полагаться на это не стоит: надёжнее дополнительно проверять расширение в коде через НРег(Файл.Расширение) = ".xml". Это также защищает от файлов с двойным расширением вида «отчёт.xml.tmp».
Если нужно выбрать несколько типов файлов сразу (например, .xml и .xlsx), одной маской обойтись нельзя — выполните поиск дважды и объедините массивы, либо получите все файлы и отфильтруйте в цикле по списку допустимых расширений.
Рекурсивный обход вложенных каталогов
Третий параметр метода — ИскатьВПодкаталогах (Истина/Ложь) — включает рекурсивный поиск. Вызов НайтиФайлы(Путь, "*.xml", Истина) вернёт файлы из всех вложенных папок любой глубины, что удобно для многоуровневых структур обмена.
Если нужен не только список, но и контроль над структурой (например, обрабатывать каталоги в определённом порядке или ограничить глубину), используйте собственную рекурсивную процедуру: в ней сначала обрабатываются файлы текущего уровня, затем для каждого подкаталога процедура вызывает себя повторно.
Процедура ОбработатьКаталог(Путь)
Найденные = НайтиФайлы(Путь, "<em>.</em>");
Для Каждого Элемент Из Найденные Цикл
Если Элемент.ЭтоКаталог() Тогда
ОбработатьКаталог(Элемент.ПолноеИмя);
Иначе
ОбработатьФайл(Элемент);
КонецЕсли;
КонецЦикла;
КонецПроцедурыПри рекурсивном обходе больших деревьев учитывайте производительность: поиск по сетевому каталогу с тысячами файлов может занять заметное время. В таких случаях сужайте маску, ограничивайте глубину и выводите прогресс через ДлительныеОперации, чтобы не блокировать интерфейс пользователя.
Клиент и сервер: где выполнять поиск
Ключевой момент, на котором «ломается» большинство обработок: НайтиФайлы видит файловую систему того компьютера, где выполняется код. В серверном контексте это диски сервера 1С, а не компьютер пользователя. Путь C:\Загрузка на сервере и на клиенте — это разные каталоги.
Если файлы лежат на машине пользователя, поиск делается на клиенте, а сами файлы передаются на сервер через НачатьПомещениеФайла или НачатьПомещениеФайлов (пакетная передача). Если файлы в общей сетевой папке — указывайте UNC-путь вида \\server\share\ и убедитесь, что у учётной записи службы агента сервера 1С есть к ней доступ на чтение.
В файловом режиме работы клиент и сервер фактически совпадают, поэтому обработка, отлаженная на файловой базе, может перестать работать после перехода в клиент-серверный режим. Проверяйте сценарий сразу в целевом режиме эксплуатации.
Как выбрать действие
Асинхронный поиск в тонком и веб-клиенте
В тонком и веб-клиенте синхронные файловые методы запрещены или нежелательны. Для них предусмотрен асинхронный аналог — НачатьПоискФайлов с описанием оповещения о завершении. Результат приходит в отдельную процедуру, указанную в ОписаниеОповещения.
&НаКлиенте
Процедура НайтиФайлыНачало(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеПоискаФайлов", ЭтотОбъект);
НачатьПоискФайлов(Оповещение, "D:\Обмен", "*.xml", Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПоискаФайлов(НайденныеФайлы, ДопПараметры) Экспорт
Для Каждого Файл Из НайденныеФайлы Цикл
Сообщить(Файл.ПолноеИмя);
КонецЦикла;
КонецПроцедурыДля работы с файловой системой в тонком клиенте может потребоваться расширение работы с файлами — проверяйте его подключение через НачатьПодключениеРасширенияРаботыСФайлами и предлагайте пользователю установить расширение, если оно отсутствует.
Проверка результата и обработка ошибок
Если каталог не существует или в нём нет подходящих файлов, НайтиФайлы вернёт пустой массив — ошибки не будет. Поэтому наличие каталога проверяйте отдельно через объект Файл и метод Существует(), а пустой результат обрабатывайте явным сообщением пользователю или записью в журнал регистрации.
Ошибки доступа (нет прав на чтение папки, файл занят другим процессом) вызывают исключения. Оборачивайте чтение файлов в Попытка...Исключение, чтобы один «битый» или заблокированный файл не прерывал обработку всей пачки. В журнал регистрации пишите полное имя файла и текст ошибки — это упростит разбор инцидентов.
Как проверить результат
Содержит ожидаемое число файлов, пути полные и читаемые
Пустой массив при заведомо заполненной папке — неверный путь или контекст выполнения
Файлы открываются на чтение без исключений
Ошибка доступа — проверьте учётную запись службы сервера 1С
Обрабатываются только файлы, каталоги отфильтрованы
Попытка чтения каталога как файла — отсутствует проверка ЭтоКаталог()
Частые вопросы
Можно ли получить только подкаталоги, без файлов?
Да. Вызовите НайтиФайлы(Путь, "*") и отберите элементы, для которых ЭтоКаталог() возвращает Истина. Отдельного параметра «только каталоги» у метода нет.
Почему НайтиФайлы возвращает пустой массив, хотя файлы в папке есть?
Чаще всего код выполняется на сервере, а путь указывает на диск клиентской машины. Также проверьте маску (регистр и лишние пробелы), наличие завершающего слеша в пути и права учётной записи, под которой работает сервер 1С.
Как узнать дату изменения файла?
У объекта Файл вызовите метод ПолучитьВремяИзменения() — он вернёт дату последней модификации. По ней удобно отбирать только новые файлы, сравнивая с датой предыдущей загрузки, сохранённой в константе или регистре сведений.
Как выбрать каталог через диалог вместо жёсткого пути?
Используйте ДиалогВыбораФайла с Режимом = РежимДиалогаВыбораФайла.ВыборКаталога и методом Показать с описанием оповещения. Выбранный путь придёт в процедуру оповещения в виде массива строк.
Есть ли ограничение на количество файлов в каталоге?
Жёсткого ограничения у метода нет, но на каталогах с десятками тысяч файлов поиск и последующая обработка могут занять значительное время и память, особенно по сети. В таких случаях сужайте маску и обрабатывайте файлы порциями.
Как удалить обработанные файлы после загрузки?
Используйте УдалитьФайлы(ПолноеИмя) после успешной загрузки данных. Удаляйте только после подтверждённой записи в базу и желательно в транзакционной логике: если загрузка упала, файл должен остаться на месте для повторной попытки.
Что важно запомнить
Основной инструмент — НайтиФайлы(Путь, Маска, ИскатьВПодкаталогах), возвращающий массив объектов Файл. Всегда учитывайте контекст выполнения (клиент/сервер), проверяйте ЭтоКаталог(), существование пути и обрабатывайте исключения при чтении. Для тонкого и веб-клиента используйте асинхронный НачатьПоискФайлов.