В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает задача автоматизации работы с файловой системой. Это может быть импорт данных из внешних источников, обработка логов, загрузка электронных накладных или очистка временных папок. Особенность работы в клиент-серверной архитектуре заключается в том, что код, исполняемый на стороне сервера, имеет доступ только к тем ресурсам, к которым у него есть права в контексте учетной записи, под которой запущен сервис 1С. В этой статье мы подробно разберем, как эффективно и безопасно получить список файлов из определенного каталога на сервере.
Наиболее правильным, универсальным и кроссплатформенным способом является использование встроенного метода платформы НайтиФайлы. Этот метод работает одинаково хорошо как на Windows, так и на Linux, что критически важно для современной разработки под 1С.
Рассмотрим синтаксис функции. Она принимает два основных параметра: путь к каталогу и маску поиска. Также есть третий параметр — признак поиска в подкаталогах (рекурсия). Проанализируем пример кода, который возвращает массив объектов типа Файл:
// Определим путь к каталогу на сервере
ПутьККаталогу = "C:\Exchange\Inbound\";
МаскаПоиска = "*.xml"; // конвертация JSON/XML/CSV/TOON
// Выполняем поиск
НайденныеФайлы = НайтиФайлы(ПутьККаталогу, МаскаПоиска, Ложь);
// Проанализируем результат
Для Каждого Файл Из НайденныеФайлы Цикл
Если Файл.ЭтоФайл() Тогда
Сообщить("Найден файл: " + Файл.Имя + ", размер: " + Файл.Размер());
КонецЕсли;
КонецЦикла;
Разберем по шагам, что происходит в этом фрагменте кода. Функция НайтиФайлы возвращает массив объектов. Каждый элемент массива — это объект Файл, который содержит полезные свойства и методы: Имя, ПолноеИмя, Расширение (например, для использования как распаковщик конфигураций), Размер(), ПолучитьВремяИзменения(). Использование метода ЭтоФайл() позволяет нам отфильтровать вложенные папки, если они попали в выборку по маске.
В некоторых случаях, особенно при работе со старыми конфигурациями или специфическими системными требованиями на Windows-серверах, разработчики используют FileSystemObject (FSO). Проанализируем ситуацию: этот метод работает через механизм COM, поэтому он будет медленнее встроенных функций 1С и абсолютно не применим на Linux.
Посмотрим на пример реализации через COMОбъект:
// Создаем объект для работы с файловой системой Windows
ФСО = Новый COMОбъект("Scripting.FileSystemObject");
// Получаем объект папки
Попытка
КаталогОбъект = ФСО.GetFolder("C:\Exchange\Inbound\");
Исключение
Сообщить("Каталог не найден или доступ ограничен!");
Возврат;
КонецПопытки;
// Перебираем коллекцию файлов
Для Каждого ТекущийФайл Из КаталогОбъект.Files Цикл
Сообщить("Файл: " + ТекущийФайл.Name);
КонецЦикла;
Выясним причину, почему этот метод до сих пор встречается в коде. Иногда FileSystemObject позволяет получить доступ к расширенным атрибутам файла или работать с очень специфическими сетевыми путями, которые некорректно обрабатываются встроенными методами в старых релизах платформы. Однако, в 99% случаев рекомендуется использовать НайтиФайлы.
Частая ошибка начинающих разработчиков — "невидимость" файлов для сервера. Проанализируем, почему так происходит. Когда код выполняется НаСервере, он запускается от имени системного пользователя (например, USR1CV8). Если у этого пользователя нет прав "Чтение" и "Просмотр содержимого папки" на указанный каталог, функция НайтиФайлы вернет пустой массив, даже если файлы там есть.
Важные моменты при настройке прав:
\\ServerName\Folder\, сервер 1С должен иметь права доступа к этому ресурсу на уровне файловой системы (NTFS) и на уровне общего доступа.Z:\), так как сетевые диски подключаются для конкретного пользователя и могут быть не видны системной службе 1С.Начиная с версии платформы 8.3.15, 1С активно развивает асинхронную модель работы. Если задача получения списка файлов инициируется пользователем на стороне клиента (в управляемой форме), стоит рассмотреть использование асинхронных методов, чтобы не "замораживать" интерфейс программы при поиске в больших каталогах.
Рассмотрим пример использования метода НачатьПоискФайлов:
&НаКлиенте
Процедура НачатьПоиск(Команда)
ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершитьПоискФайлов", ЭтотОбъект);
НачатьПоискФайлов(ОписаниеОповещения, "C:\Temp", "*.*", Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ЗавершитьПоискФайлов(Результат, ДополнительныеПараметры) Экспорт
Для Каждого Файл Из Результат Цикл
// Обработка найденных файлов
Сообщить("Найден: " + Файл.Имя);
КонецЦикла;
КонецПроцедуры
Такой подход делает приложение более отзывчивым. Однако помните, что на стороне сервера (в фоновых заданиях или серверных модулях) методы Начать... не используются — там применяются только синхронные вызовы.
Если в каталоге находятся десятки тысяч файлов, получение полного списка может занять значительное время и потребовать много оперативной памяти. Разберем, как можно оптимизировать этот процесс:
*.* используйте расширение, например *.txt или префикс Invoice_*.xml, а для создания и редактирования файлов в формате DBF — *.dbf. Это сократит объем данных, передаваемых платформой в массив.НайтиФайлы (Булево) отвечает за обход вложенных папок. Если вы знаете, что файлы лежат в корне, всегда ставьте Ложь.Archive или их удаление. Это поддерживает высокую скорость работы функции НайтиФайлы при последующих запусках.Проанализируем пример функции, которая не просто находит файлы, но и сортирует их по дате изменения (что часто требуется для обработки очереди):
Функция ПолучитьСписокФайловОтсортированный(Путь) Экспорт
МассивФайлов = НайтиФайлы(Путь, "*.*");
// Используем таблицу значений для сортировки
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("ФайлОбъект");
ТЗ.Колонки.Добавить("ДатаИзменения");
Для Каждого Файл Из МассивФайлов Цикл
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.ФайлОбъект = Файл;
НоваяСтрока.ДатаИзменения = Файл.ПолучитьВремяИзменения();
КонецЦикла;
ТЗ.Сортировать("ДатаИзменения Возр");
Возврат ТЗ.ВыгрузитьКолонку("ФайлОбъект");
КонецФункции
В этом примере мы создали вспомогательную таблицу значений, наполнили её объектами Файл и их метаданными, выполнили сортировку и вернули обратно массив. Это отличный способ гарантировать, что файлы будут обрабатываться в хронологическом порядке их поступления.
Мы проанализировали основные инструменты для работы с файловой системой на сервере 1С. Основным инструментом остается НайтиФайлы благодаря своей простоте и кроссплатформенности. При работе с Linux это единственный надежный встроенный вариант. При работе на Windows вы ограничены только правами доступа пользователя USR1CV8. Разберем и запомним: всегда проверяйте существование каталога методом Файл.Существует() перед началом работы, чтобы избежать ошибок выполнения кода.