1с перебрать файлы в каталоге
Есть подчиненные каталоги. Мне нужно программно перебрать и обработать все файлы с расширением txt. Возможно ли это?
В "ФС.НайтиПервыйФайл(Каталог+"*.txt");" пишется только имя файла , а каталог устанавливается командой "УстТекКаталог(<Свой каталог>)"Свой>
@Писать моно не только полное имя, а еще маску@ В имени файла, - понятно! Но как залезть во все ветки дерева каталогов? (Имена каталогов уникальны)
Примерно так: . перебор "файлов" Если АтрибутыФайла(. ) = это каталог тогда СканироватьКаталог(ТекущийФайл) КонецЕсли КонецФункции
+ на всякий случай: Синтаксис: АтрибутыФайла(<ИмяФайла>,,,,,,) Назначение: Возвращает атрибуты файла (в параметрах). Параметры: <ИмяФайла>- строка с именем файла; - переменная, принимающая размер файла в байтах; - переменная, принимающая атрибуты файла; Возвращаемое строковое значение длиной 9 символов, в котором закодированы атрибуты файла. Символы могут принимать значения ''0'' или ''1'': первый символ: если ''1'' - файл только для чтения; второй символ: если ''1'' - скрытый файл; третий символ: если ''1'' - системный файл; четвертый символ: если ''1'' - каталог; пятый символ: если ''1'' - архивный файл; шестой символ: если ''1'' - обычный файл (все другие атрибуты не установлены); седьмой символ: если ''1'' - временный файл; восьмой символ: если ''1'' - файл, сжатый каким-либо архиватором; девятый символ: если ''1'' - нет доступа к файлу. - переменная, принимающая строку с датой и временем создания файла; - переменная, принимающая строку с датой и временем последнего доступа к файлу; - переменная, принимающая строку с датой и временем последней записи файла; - переменная, принимающая строку с полным именем файла. Подробнее см. в книгу ''1С:Предприятие 7.7. Описание встроенного языка. Часть 2'', глава 37 ''Работа с Файлами''.ИмяФайла>
Наконец-то дошли руки до реализации вышеуказанного перебора папок/файлов. К сожалению есть проблема. При выходе из подчиненной папки, после перебора там файлов, перебор папок текущего уровня не работает. Первый же операор < Возврат ""; >приводит к полному завершению просмотра
Есть готовый кусок кода для построения дерева каталога. Красииииива - даже выводит в табличку с крестиками - свернуть/развернуть )) Но там все на вложенных таблицах значений и на рекурсиях и принципиально без ~М1 )) Так что если нужно в каком-то другом виде - переделывать нужно
Можно и с циклом сделать с досрочным завершением по условию. Но это не принципиально. Наталья, а можешь выслать мне этот "готовый кусок кода"?
Если вечером и из дома - то могу. А про "циклы и досрочные завершения" - даже Аленку, которая С++ учит, "воспитую" ))принципиально )) Если меня совсем сегодня на замучат этим С++ то вечером сделаю
Функция СканКаталога(ИмяКаталога) Если Прав(ИмяКаталога,1)<>"" Тогда ИмяКаталога=ИмяКаталога+""; КонецЕсли;
Для работы с файловой системой предназначен объект "ФС". В принципе его не требуется создавать с помощью функции СоздатьОбъект. Можно считать, что он уже создан. Но 1С позволяет создать сколько угодно таких объектов при помощи функции СоздатьОбъект;
Объект "ФС" имеет следующие методы:
ВыбратьФайл()
Открывает окно диалога выбора/сохранения файла. Возвращает: 0 - если в окне диалога нажата кнопка 'Отмена', 1 - если нажата кнопка 'ОК'.
Параметры:
-: 0 - диалог типа , 1 - диалог типа ;
- переменная, содержащая на входе строку с именем файла, а на выходе - имя выбранного файла;
- переменная, содержащая на входе строку с начальным каталогом, а на выходе - имя выбранного каталога;
- строка с заголовком окна;
- строка с фильтром отбора файлов (например: 'Все файлы (*.*) |*.*');
- строка с расширением файла по умолчанию;
- время ожидания отклика пользователя в секундах (необязателен).
ВыбратьФайлКартинки
Открывает окно диалога выбора/сохранения файла картинки.
Возвращает: 0 - если в окне диалога нажата кнопка 'Отмена', 1 - если нажата кнопка 'ОК'.
Синтаксис: ВыбратьФайлКартинки (, , , , , )
ВыбратьКаталог
Открывает окно диалога выбора каталога.
Возвращает: 0 - если в окне диалога нажата кнопка 'Отмена'; 1 - если в окне диалога нажата кнопка 'ОК', при этом в переменную возвращается имя выбранного каталога; -1 (минус единица) - закончилось время ожидания отклика пользователя.
Синтаксис: ВыбратьКаталог(,,)
СуществуетФайл
Проверяет существование файла..
Возвращает: 1 - файл существует; 0 - не существует.
Синтаксис: СуществуетФайл()
Параметры:
- строка с именем файла источника;
- строка с именем файла приемника;
-:
0 - существующий файл приемника перезаписать;
1 - существующий файл приемника не перезаписывать.
Удаляет файл.
Синтаксис: УдалитьФайл()
Параметры:
- строка с именем файла источника;
- строка с новым именем файла;
-:
0 - запрещает перемещение файла между дисками и существующий файл приемника не перезаписывается;
1 - разрешает перемещение файла между дисками (только для файлов) и существующий файл приемника перезаписывается.
Открывает выборку файлов по заданной маске и находит первый файл.
Возвращает строку с именем найденного файла.
Синтаксис: НайтиПервыйФайл()
Находит следующий файл по открытой выборке файлов.
Возвращает строку с именем найденного файла.
Синтаксис: НайтиСледующийФайл()
Возвращает атрибуты файла (в параметрах).
Атрибуты файла закодированы, об этом см. Синтакс-Помощник или описание встроенного языка
Создать новый каталог (папку).
Синтаксис:СоздатьКаталог()
Удаляет каталог файлов.
Синтаксис: УдалитьКаталог()
Устанавливает текущий каталог файлов.
Синтаксис: УстТекКаталог()
ТекКаталог
Возвращает строку с именем текущего каталога файлов.
WindowsКаталог
Возвращает строку с именем Windows директории.
СвободноеМестоНаДиске
Возвращает размер свободного дискового пространства в байтах.
Синтаксис: СвободноеМестоНаДиске()
Также часто применяются системные функции:
КаталогИБ Возвращает имя каталога базы данных.
КаталогПользователя Возвращает имя каталога пользователя.
КаталогПрограммы Возвращает имя каталога с исполняемыми файлами системы 1С:Предприятие.
КаталогВременныхФайлов Возвращает имя каталога временных файлов.
ИмяКомпьютера Возвращает сетевое имя компьютера, работающего в данный момент с программой.
Примеры
Пример 1
//переместить все текстовые файлы (*.txt) из каталога информационной базы в каталог TXT.
Форум
Для работы с файлами и каталогами в 1С:Предприятие используется специальный объект "ФС" (файловая система). Средства языка 1С имеют возможности поиска, копирования, переименования, удаления и совершения других операций с файлами и каталогами.
Обращение к файловой системе
Для работы с файловой системой предназначен объект "ФС". В принципе его не требуется создавать с помощью функции СоздатьОбъект. Можно считать, что он уже создан. Но 1С позволяет создать сколько угодно таких объектов при помощи функции СоздатьОбъект;
ГдеМыНаходимся = ФС.ТекКаталог();
ФС.СоздатьКаталог("DOCS");
НовФС = СоздатьОбъект("ФС");
Объект "ФС" имеет следующие методы:
Открывает окно диалога выбора/сохранения файла. Возвращает: 0 - если в окне диалога нажата кнопка 'Отмена', 1 - если нажата кнопка 'ОК'.
Параметры:
-: 0 - диалог типа , 1 - диалог типа ;
- переменная, содержащая на входе строку с именем файла, а на выходе - имя выбранного файла;
- переменная, содержащая на входе строку с начальным каталогом, а на выходе - имя выбранного каталога;
- строка с заголовком окна;
- строка с фильтром отбора файлов (например: 'Все файлы (*.*) |*.*');
- строка с расширением файла по умолчанию;
- время ожидания отклика пользователя в секундах (необязателен).
Открывает окно диалога выбора каталога.
Возвращает: 0 - если в окне диалога нажата кнопка 'Отмена'; 1 - если в окне диалога нажата кнопка 'ОК', при этом в переменную возвращается имя выбранного каталога; -1 (минус единица) - закончилось время ожидания отклика пользователя.
Синтаксис: ВыбратьКаталог(,,)
Проверяет существование файла..
Возвращает: 1 - файл существует; 0 - не существует.
Синтаксис: СуществуетФайл()
Параметры:
- строка с именем файла источника;
- строка с именем файла приемника;
-:
0 - существующий файл приемника перезаписать;
1 - существующий файл приемника не перезаписывать.
Удаляет файл.
Синтаксис: УдалитьФайл()
Параметры:
- строка с именем файла источника;
- строка с новым именем файла;
-:
0 - запрещает перемещение файла между дисками и существующий файл приемника не перезаписывается;
1 - разрешает перемещение файла между дисками (только для файлов) и существующий файл приемника перезаписывается.
Открывает выборку файлов по заданной маске и находит первый файл.
Возвращает строку с именем найденного файла.
Синтаксис: НайтиПервыйФайл()
Находит следующий файл по открытой выборке файлов.
Возвращает строку с именем найденного файла.
Синтаксис: НайтиСледующийФайл()
Возвращает атрибуты файла (в параметрах).
Атрибуты файла закодированы, об этом см. Синтакс-Помощник или описание встроенного языка
Создать новый каталог (папку).
Синтаксис:СоздатьКаталог()
Удаляет каталог файлов.
Синтаксис: УдалитьКаталог()
Устанавливает текущий каталог файлов.
Синтаксис: УстТекКаталог()
Также часто применяются системные функции:
Пример 1
//переместить все текстовые файлы (*.txt) из каталога информационной базы в каталог TXT.
ФС.УстТекКаталог(КаталогИБ());
ИмяФайла = "";
ИмяФайла = ФС.НайтиПервыйФайл("*.txt");
Если ИмяФайла <> "" Тогда
. ФС.СоздатьКаталог("TXT");
. ФС.КопироватьФайл(ИмяФайла,ФС.ТекКаталог() + "TXT" + ИмяФайла);
. ФС.УдалитьФайл(ИмяФайла);
ИмяФайла = " ";
. ИмяФайла = ФС.НайтиСледующийФайл()
Если ИмяФайла <> "" Тогда
. ФС.КопироватьФайл(ИмяФайла,ФС.ТекКаталог() + "TXT" + ИмяФайла);
. ФС.УдалитьФайл(ИмяФайла);
Иначе
. Прервать;
КонецЕсли;
Пример 2
//выбрать файл с фотографией сотрудника
ИмяФайла = "";
ИмяКаталога = КаталогИБ();
Если ФС.ВыбратьФайлКартинки(0,ИмяФайла,ИмяКаталога,"Укажите файл с фотографией:",,20)=1 Тогда
ВремКартинка = СоздатьОбъект("Картинка");
ВремКартинка.Загрузить(ИмяКаталога + ИмяФайла);
КартинкаНаФорме.УстановитьКартинку(ВремКартинка);
« Как стать программистом 1С » Язык 1С » Работа с файловой системой из 1С
Работа с файловой системой из 1С
Следующие функции языка 1С позволяют манипулировать файлами:
- СоздатьКаталог 1С
- НайтиФайлы 1С
- КопироватьФайл 1С
- ПереместитьФайл 1С
- УдалитьФайлы 1С
- РазделитьФайл 1С
- ОбъединитьФайлы 1С.
Работа с каталогами — СоздатьКаталог 1С
//создает недостающие каталоги в указанном пути
//если каталога нет – создаст всю вложенную структуру
//если есть D:\Temp, то создаст подкаталоги
СоздатьКаталог("D:\Temp\1\2\3")
Поиск файлов — НайтиФайлы 1С
//найти все файлы 1С в каталоге «Sc»
НайденныеФайлы = НайтиФайлы("D:\Sc", "*");
//найти все ТЕКСТОВЫЕ файлы 1С в каталоге, включая вложенные подкаталоги
НайденныеФайлы = НайтиФайлы("D:\Sc", "*.txt", Истина);
//найти все файлы 1С в каталоге, в имени которых встречается слово "копия"
НайденныеФайлы = НайтиФайлы("D:\Sc", "*копия*");
//найти все файлы 1С в каталоге, в имени которых встречается любая цифра в скобочках, например "(1)" или "(100)"
НайденныеФайлы = НайтиФайлы("D:\Sc", "*(*)*");
//найти все файлы 1С в каталоге, в имени которых встречается цифра в скобочках меньше 10, например "(1)" или "(9)"
НайденныеФайлы = НайтиФайлы("D:\Sc", "*(?)*");
Для каждого Файл из НайденныеФайлы Цикл
Если Файл.ЭтоКаталог() Тогда
Продолжить;
КонецЕсли;
Копирование, перемещение и удаление файлов — КопироватьФайл 1С, ПереместитьФайл 1С, УдалитьФайлы 1С
ИмяФайла = "Текстовый файл.txt";
КаталогИсточник = "D:\sc\";
КаталогПриемник = "D:\";
//копирование файла
ФайлИсточник = Новый Файл(КаталогИсточник + ИмяФайла);
Если не ФайлИсточник.Существует() или ФайлИсточник.ЭтоКаталог() Тогда
ВызватьИсключение "Файл '" + КаталогИсточник + ИмяФайла + "' не существует или является каталогом";
КонецЕсли;
Попытка
КопироватьФайл(КаталогИсточник + ИмяФайла, КаталогПриемник + ИмяФайла);
Исключение
ВызватьИсключение "Нет прав на копирование файла";
КонецПопытки;
ФайлПриемник = Новый Файл(КаталогПриемник + ИмяФайла);
Если не ФайлПриемник.Существует() или ФайлПриемник.Размер() <> ФайлИсточник.Размер() Тогда
ВызватьИсключение "Не удалось корректно скопировать файл";
КонецЕсли;
//перемещение файла
Попытка
ПереместитьФайл(КаталогИсточник + ИмяФайла, КаталогПриемник + ИмяФайла);
Исключение
ВызватьИсключение "Нет прав на копирование файла";
КонецПопытки;
ФайлПриемник = Новый Файл(КаталогПриемник + ИмяФайла);
Если не ФайлПриемник.Существует() Тогда
ВызватьИсключение "Не удалось корректно перенести файл";
КонецЕсли;
Разделение и слияние файлов — РазделитьФайл 1С, ОбъединитьФайлы 1С
//функция создает каталог с именем файла
//в нем создает разделенные части файла, каждая размером в указанное кол-во мегабайт
//каждую часть сжимает архиватором
//возвращает имя каталога
Файлы и каталоги в 1С 8.3 используются для различных операций с данными: сохранение и восстановление, экспорт и импорт, архивация, обмен и др. Для реализации работы с файлами и каталогами, их параметрами и атрибутами, на встроенном языке программирования 1С 8.3 существуют различные предопределенные функции и модели.
✔ Чтение и запись файлов
&НаСервере
Процедура ЧтениеИЗаписьФайлов ()
// Любое сериализуемое значение (массив, структура, таблица значений, строки. ) можно сохранить в файл
НаборСимволов = Новый Массив ;
НаборСимволов . Добавить ( 125 );
НаборСимволов . Добавить ( "А" );
НаборСимволов . Добавить ( "99" );
НаборСимволов . Добавить ( "%" );
ЗначениеВФайл ( "D:\Symbol.txt" , НаборСимволов ); // работает только на &НаСервере
// Восстановление произвольных значений из файла
НаборСимволовИзФайла = ЗначениеИзФайла ( "D:\Symbol.txt" );
Сообщить ( НаборСимволовИзФайла [ 0 ]); // 125
Сообщить ( НаборСимволовИзФайла [ 1 ]); // А
Сообщить ( НаборСимволовИзФайла [ 2 ]); // 99
Сообщить ( НаборСимволовИзФайла [ 3 ]); // %
&НаКлиенте
Процедура ОперацииНадФайлами ( Команда )
// Создание переменных (имя и путь к файлу)
ПутьКФайлу_Test = "D:\Test.txt" ;
ПутьКФайлу_Copy = "D:\Copy.txt" ;
// Создание пустого файла
ТекстФайл = Новый ЗаписьТекста ();
ТекстФайл . Закрыть ();
// Проверка на существование файла
ТекстФайл = Новый Файл ( ПутьКФайлу_Test );
Если ТекстФайл . Существует () Тогда
Сообщить ( ПутьКФайлу_Test + " существует!" );
КонецЕсли;
// Копирование файла. Параметры: Какой файл копируем, Куда файл копируем
КопироватьФайл ( ПутьКФайлу_Test , ПутьКФайлу_Copy ); // Если файл существует, то перезапишет
// Перемещение файла. Параметры: Какой файл копируем, Куда файл копируем
ПереместитьФайл ( ПутьКФайлу_Test , ПутьКФайлу_Copy ); // Если файл существует, то перезапишет
// Поиск файлов в каталоге (функция возвращает массив значений)
// Параметры: Каталог поиска, Маска поиска, Поиск и в подкаталогах
МассивФайлов = НайтиФайлы ( "D:\" , "*.txt" , Ложь);
Для Каждого ТекФайл Из МассивФайлов Цикл
Сообщить ( "Найден файл: " + ТекФайл . ПолноеИмя );
КонецЦикла;
// Удаление файла
УдалитьФайлы ( ПутьКФайлу_Test ); // Если файл с параметром только для чтения, то будет ошибка
// Удаление файлов в каталоге по маске
// поиск в каталоге нерекурсивный
УдалитьФайлы ( "D:\" , "*.txt" ); // Если маски нет, то удалятся все файлы и сам каталог
// Получение имя временного файла
ПолучитьИмяВременногоФайла (); // Например, C:\Temp\H_kImX035.tmp
ПолучитьИмяВременногоФайла ( ".txt" ); // Например, C:\Temp\H_kImX035.txt
&НаКлиенте
Процедура ПолучениеИИзменениеАтрибутовФайла ( Команда )
ТекстФайл = Новый Файл ( "D:\Test.txt" );
// Чтение атрибутов
ТекстФайл . ПолучитьВремяИзменения (); // время последнего изменения файла
ТекстФайл . ПолучитьТолькоЧтение (); // проверяем атрибут только чтение
ТекстФайл . ПолучитьНевидимость (); // проверяем атрибут hidden (скрытность, невидимость)
ТекстФайл . Размер (); // размер файла в байтах
// Получение расширение файла из его пути
ТекстФайл . Расширение (); // .txt
// Получение имени файла без расширения
ТекстФайл . ИмяБезРасширения (); // Test
// Получение информации по пути файла - это файл или каталог
Если ТекстФайл . ЭтоКаталог () Тогда
// Это каталог
ИначеЕсли ТекстФайл . ЭтоФайл () Тогда
// Это файл
КонецЕсли;
// Изменение атрибутов
ТекстФайл . УстановитьВремяИзменения ( ТекущаяДата ()); // меняем время последнего изменения файла
ТекстФайл . УстановитьТолькоЧтение (Ложь); // меняем атрибут только чтение
ТекстФайл . УстановитьНевидимость (Ложь); // меняем атрибут невидимости
&НаКлиенте
Процедура ОперацииНадКаталогами ( Команда )
//Создание каталога (он может уже существовать)
СоздатьКаталог ( "D:\Catalog" );
//Создание подкаталогов
СоздатьКаталог ( "D:\Catalog\2020\1" );
// Проверка существования каталога
Каталог = Новый Файл ( "D:\Catalog" );
Если Каталог . Существует () Тогда
Сообщить ( "Каталог по пути D:\Catalog существует!" );
КонецЕсли;
// Удаление каталога (вместе с файлами и подкаталогами)
УдалитьФайлы ( "D:\Catalog" ); // Можно добавить максу
// Получение каталога временных файлов
КаталогВременныхФайлов (); // Например, C:\Windows\Temp
&НаКлиенте
Процедура ОперацииСВременнымХранилищем ( Команда )
// Временное хранилище позволяет передавать данные,
// которые иначе не передать (произвольного типа) между сервером и клиентом
// Сохранение произвольного значения (списка значений) во временном хранилище
СЗ = Новый СписокЗначений ;
СЗ . Добавить ( "Арбуз" );
СЗ . Добавить ( "Дыня" );
СЗ . Добавить ( "Яблоко" );
АдресВХранилище = ПоместитьВоВременноеХранилище ( СЗ );
// Чтение произвольного значения (списка значений) из временного хранилища
СЗИзХранилища = ПолучитьИзВременногоХранилища ( АдресВХранилище );
Если СЗИзХранилища = Неопределено Тогда
Сообщить ( "Значение по этому адресу из хранилища уже удалено!" );
Иначе
Сообщить ( СЗИзХранилища [ 0 ]); // Арбуз
КонецЕсли;
// Перезапись уже сохраненного значения (массив) во временном хранилище
НаборСимволов = Новый Массив ;
НаборСимволов . Добавить ( 125 );
НаборСимволов . Добавить ( "А" );
НаборСимволов . Добавить ( "99" );
НаборСимволов . Добавить ( "%" );
// Время хранения зависит от параметра "АдресВХранилище" функции ПоместитьВоВременноеХранилище
ПоместитьВоВременноеХранилище ( НаборСимволов , АдресВХранилище );
// Если адрес - уникальный идентификатор формы или существующий адрес в хранилище:
// Значение будет удалено после закрытия формы
ПоместитьВоВременноеХранилище ( НаборСимволов , ЭтаФорма . УникальныйИдентификатор );
// Если адрес - уникальный идентификатор, не являющийся уникальным идентификатором формы %
// Значение будет удалено после завершения сеанса пользвоателя
ПоместитьВоВременноеХранилище ( НаборСимволов , Новый УникальныйИдентификатор );
// Если адрес не указан:
// Значение будет удалено после очередного запроса сервера
ПоместитьВоВременноеХранилище ( НаборСимволов );
// Удаление значения из временного хранилища
УдалитьИзВременногоХранилища ( АдресВХранилище );
// Проверка является ли строка адресом во временном хранилище
Если ЭтоАдресВременногоХранилища ( АдресВХранилище ) Тогда
// Это адрес во временном хранилище
КонецЕсли;
&НаКлиенте
Процедура ПередачаФайлаСКлиентаНаСервер ( Команда )
ТекстФайл = Новый ЗаписьТекста ( "D:\Prostokvashino.txt" );
ТекстФайл . ЗаписатьСтроку ( "Кот Матроскин" );
ТекстФайл . ЗаписатьСтроку ( "Дядя Федор" );
ТекстФайл . ЗаписатьСтроку ( "Шарик" );
ТекстФайл . Закрыть ();
Завершено = Новый ОписаниеОповещения ( "ПослеПередачи" , ЭтотОбъект );
// Параметр УникальныйИдентификаторФормы - если не указывать - то файл будет удален после очередного запроса сервера
// если указать - то после удаления объекта формы
// Параметр Интерактивно (Истина) - дает пользователю выбрать файл самому
НачатьПомещениеФайла ( Завершено , , "D:\Prostokvashino.txt" , Ложь, ЭтаФорма . УникальныйИдентификатор );
&НаКлиенте
Процедура ПослеПередачи ( Результат , ХранимыйАдрес , ВыбранноеИмяФайла , ДопПараметры ) Экспорт
Если Результат Тогда
// Сохранение полученного адреса в реквизите формы (строка) - адрес файла в хранилище на сервере
АдресФайлаВХранилище = ХранимыйАдрес ;
Сообщить ( "Файл " + ВыбранноеИмяФайла + " передан на сервер и сохранён во временном хранилище. Адрес: " + ХранимыйАдрес );
Иначе
Сообщить ( "Ошибка передачи файла на сервер!" );
КонецЕсли;
Читайте также: