Опубликовано: 16.01.2021

Работа с файловой системой

Контекст работы с файловой системой

В программных модулях системы «1С:Предприятие» версии 7.7 для работы с файлами и каталогами используются методы объекта типа "ФС" (сокр. от слов «файловая система»), причём по умолчанию в программе всегда доступен уже существующий (встроенный) объект с именем «ФС», к которому можно непосредственно применять данные методы.

Чтобы вызвать метод объекта типа "ФС", имя метода пишется через точку после имени объекта, например:

ФС.УдалитьФайл("input.txt"); // Удаляем файл

Англоязычный вариант:

FS.DeleteFile("input.txt"); // delete the file

При необходимости разработчик может также создать собственный объект типа "ФС" при помощи функции СоздатьОбъект(), например:

ФайлВыгрузки = СоздатьОбъект("ФС");
ФайлВыгрузки.УстТекКаталог("D:\SSTDB"); // Устанавливаем текущий каталог

Англоязычный вариант:

UploadFile = CreateObject("FS");
UploadFile.SetCurrentDirectory("D:\SSTDB"); // set the current directory

Методы объекта типа «ФС»

Прежде чем перейти к подробному рассмотрению конкретных методов объекта "ФС", ещё раз хочу подчеркнуть, что методы данного объекта предназначены для работы именно с файловой системой. То есть они используются для выполнения таких операций, как поиск, удаление и копирование файлов, создание и удаление каталогов, выбор текущего каталога, просмотр реквизитов файлов и т.д. и т.п. Создание же и редактирование самих файлов выполняется с помощью методов объектов других типов. Так, например, для создания и редактирования текстовых файлов используются методы объектов типа "Текст", для создания и ре­дак­ти­ро­ва­ния файлов баз данных — методы объектов типа "XBase", а для работы с файлами графики — методы объектов типа "Картинка".

Примечание: При работе с файлами в системе «1С:Предприятие» версии 7.7, необходимо учитывать тот факт, что программа создавалась в те времена, когда имена файлов и каталогов могли содержать только символы латинского алфавита и цифры, а длина имени (без учёта расширения) не могла превышать восьми символов. По этой причине, во избежании недоразумений при работе с системой, не рекомендуется использовать файлы и каталоги с длинными именами, да ещё и содержащими буквы кириллицы.

Работа с дисками и каталогами

Проверить наличие свободного места на диске позволяет метод СвободноеМестоНаДиске(), возвращающий значение размера свободного дискового пространства в байтах. В качестве единственного параметра методу передаётся строковое выражение, содержащее имя проверяемого диска, например, "A:", "C:" или другое. Англоязычный синоним имени метода — GetDiskFreeSpace().

Пример использования метода:

Если ФС.СвободноеМестоНаДиске("A:") > РазмерФайла Тогда
   ФС.КопироватьФайл("D:\Base\output.txt", "A:\output.txt", 0);
Иначе
   Сообщить("На диске A: недостаточно места", "!");
КонецЕсли;

Данный метод может быть полезен, например, при копировании файлов на съёмный носитель, который имеет сравнительно небольшой объём дискового пространства.

Получить имя текущего каталога позволяет метод ТекКаталог(). Данный метод не имеет параметров, а возвращает стро­ко­вое значение — имя текущей директории (точнее, полный путь к ней, например, "D:\1S_Base\1SBDB"). Англоязычный синоним имени метода — GetCurrentDirectory().

Пример использования метода:

ИмяКаталога = ФС.ТекКаталог();

Кстати, для каждого конкретного поль­зо­ва­те­ля текущим каталогом по умолчанию является его рабочий каталог, указанный в настройках Конфигуратора.

Свойства пользователя

Если в Конфигураторе не указаны сведения о пользователях, то текущим каталогом для всех пользователей по умол­ча­нию является корневой каталог базы данных.

Сделать текущим другой каталог позволяет метод УстТекКаталог(). Возвращаемого значения у метода нет. В качестве единственного параметра методу передаётся строковое выражение, содержащее полный путь к каталогу, устанавливаемому в качестве текущего. Англоязычный синоним имени метода — SetCurrentDirectory().

Пример использования метода:

ФС.УстТекКаталог(КаталогИБ() + "CP");

Данный метод может быть полезен, например, при написании обработок, выгружающих файлы обмена для системы Клиент-Банк, рабочий каталог которой может находиться на другом диске или даже на другом компьютере в сети.

Примечание: Каталог, который сделали текущим с помощью метода УстТекКаталог(), является таковым только для того контекста, из которого был вызван метод. То есть, если метод был вызван из модуля формы обработки, то каталог становится текущим только для данной формы обработки. Если же метод был вызван из глобального модуля программы, то каталог становится текущим для всех нижестоящих модулей.

Возможность интерактивного выбора каталога предоставляет метод ВыбратьКаталог(). При вызове данного метода, на экран выводится стандартное окно выбора директории (см. рис. ниже), после чего в программу возвращаются значения, определяемые действиями пользователя. Англоязычный синоним имени метода — SelectDirectory().

Синтаксис метода:

ВыбратьКаталог(<Каталог>, <Заголовок>, <Таймаут>)

где

  • <Каталог> — имя переменной, в которую перед вызовом метода можно передать имя начальной директории — той, которая будет предложена пользователю в окне диалога (см. пример и рисунок ниже). Если в переменную передать пустую строку или вообще ничего не передать, то в качестве начальной директории будет использован каталог пользователя. В эту же переменную, в случае нажатия кнопки «ОК», система возвратит имя выбранного пользователем каталога;
  • <Заголовок> — строковый литерал или cтроковое выражение, с помощью которого можно задать заголовок открываемого окна;
  • <Таймаут> — числовое выражение, значение которого задаёт время ожидания системы (в секундах) на отклик пользователя. По истечении этого времени окно закрывается. Если же таймаут не задан (параметр вообще-то является необязательным) или задан 0, то окно будет ждать действий пользователя бесконечно.

Возвращаемое методом значение, в зависимости от действий пользователя, может быть следующим:

  • 1 — в окне диалога нажата кнопка «ОК», при этом в переменную <ИмяКаталога> возвращается имя выбранного каталога;
  • 0 — в окне диалога нажата кнопка «Отмена» или кнопка закрытия окна, либо клавиша Esc на клавиатуре;
  • −1 — истекло время ожидания отклика пользователя, указанное в параметре <Таймаут>.

Пример использования метода:

// Предлагаем свой вариант
КаталогДляВыбора = "D:\1S_Base";

// Выводим окно диалога
Если ФС.ВыбратьКаталог(КаталогДляВыбора, "Хотите выбрать другой каталог?") < 1 Тогда
   // Если была нажата кнопка "Отмена",
   // завершаем выполнение процедуры и закрываем окно Формы обработки
   Форма.Закрыть(0);
КонецЕсли;

// В случае нажатия кнопки "ОК" делаем выбранный каталог текущим
ФС.УстТекКаталог(КаталогДляВыбора);

В результате работы вышеприведённого кода на экран будет выведено стандартное диалоговое окно для выбора каталога.

Диалог выбора каталога

Содать новый каталог на диске позволяет метод СоздатьКаталог(). Возвращаемое значение у метода отсутствует. В качестве единственного параметра методу передаётся строковое выражение, содержащее имя создаваемого каталога и полный путь к нему. Англоязычный синоним имени метода — CreateDirectory().

Пример использования метода:

// Создаём новый каталог и делаем его текщим
КаталогВыгрузки = "D:\out";
ФС.СоздатьКаталог(КаталогВыгрузки);
ФС.УстТекКаталог(КаталогВыгрузки);

Примечание: Полный путь к создаваемому каталогу можно не указывать, если он создаётся в текущем каталоге.

Удалить каталог с диска позволяет метод УдалитьКаталог(). В качестве единственного параметра методу передаётся строковое выражение, содержащее имя удаляемого каталога и полный путь к нему. Англоязычный синоним имени метода — RemoveDirectory().

Пример использования метода:

ФС.УдалитьКаталог("D:\out");

Примечание: Полный путь к создаваемому каталогу можно не указывать, если он создаётся в текущем каталоге.

Получить имя основного каталога операционной системы Windows позволяет метод WindowsКаталог(). Он не имеет параметров. Англоязычный синоним имени метода — GetWindowsDirectory().

Примечание: Для получения информации о некоторых каталогах можно также использовать глобальные (встроенные) функции, такие как:

  • ИмяКомпьютера() — возвращает строковое значение, содержащее сетевое имя компьютера, работающего в данный момент с программой, например, "buch1";
  • КаталогПрограммы() — возвращает строковое значение, содержащее полный путь к папке исполнимыми файлами программы, например, "C:\Program Files\1Cv77\BIN\";
  • КаталогИБ() — возвращает строковое значение, содержащее полный путь к папке информационной базы (базы данных), например, "C:\Program Files\1Cv77\1SBDB\";
  • КаталогПользователя() — возвращает строковое значение, содержащее полный путь к рабочему каталогу пользователя, например, "C:\Program Files\1Cv77\1SBDB\usr1\";
  • КаталогВременныхФайлов() — возвращает строковое значение, содержащее имя каталога временных файлов, например, "C:\WINDOWS\Temp\".

Для выполнения таких действий, как проверка наличия каталога на указанном диске, переименование или перемещение каталога, получение атрибутов каталога, используются те же методы объекта "ФС", что и при работе с файлами (см. ниже).

Работа с файлами

Проверить наличие файла или каталога позволяет метод СуществуетФайл(). В качестве единственного параметра методу передаётся строковое выражение, содержащее имя искомого файла или каталога (например, "D:\SSTDB\update.txt" или "D:\1S_Base\SSTDB").). Англоязычный синоним имени метода — ExistFile().

Пример использования метода:

Если ФС.СуществуетФайл("D:\SSTDB\update.txt") = 0 Тогда
   Сообщить("Указанный файл не найден!", "!" );
КонецЕсли;

В параметре метода можно указать либо полный путь к файлу/каталогу, либо только имя искомого файла/каталога, если проверка будет производиться в текущей директории:

ФС.УстТекКаталог("D:\SSTDB");  // Устанавливаем текущий каталог

// Проверяем наличие файла
Если ФС.СуществуетФайл("update.txt") = 0 Тогда
   Сообщить("Указанный файл не найден!", "!" );
КонецЕсли;

Получить атрибуты указанного файла или каталога позволяет метод АтрибутыФайла(). Англоязычный синоним имени метода — GetFileAttr().

Синтаксис метода:

АтрибутыФайла(<Файл>, <Размер>, <Атрибуты>, <ВремяСоздания>,
              <ВремяПоследнДоступа>, <ВремяПоследнЗаписи>, <РасширенноеИмя>)

где

  • <Файл> — строковое выражение, содержащее имя файла или каталога, атрибуты которого требуется получить. В параметре следует указать либо полный путь к файлу/каталогу, либо только имя файла/каталога, если проверка файла будет производиться в текущей директории;
  • <Размер> — имя переменной, в которую система возвратит числовое значение размера файла в байтах;
  • <Атрибуты> — имя переменной, в которую система возвратит строковое значение длиной 9 символов, в котором будут закодированы атрибуты файла. Символы могут принимать значения «0» или «1». Если первый символ «1», то файл доступен только для чтения; если второй символ «1», то это скрытый файл; если третий символ «1», то это системный файл; если четвертый символ «1», то это каталог; если пятый символ «1», то это архивный файл; если шестой символ «1», то это обычный файл (все другие атрибуты не установлены); если седьмой символ «1», то это временный файл; если восьмой символ «1», то это файл, сжатый каким-либо архиватором; если девятый символ «1», то к файлу нет доступа;
  • <ВремяСоздания> — имя переменной, в которую система возвратит строковое значение, содержащее дату и время создания файла;
  • <ВремяПоследнДоступа> — имя переменной, в которую система возвратит строковое значение, содержащее дату и время последнего доступа к файлу;
  • <ВремяПоследнЗаписи> — имя переменной, в которую система возвратит строковое значение, содержащее дату и время последней записи файла;
  • <РасширенноеИмя> — имя переменной, в которую система возвратит строковое значение, содержащее полное имя файла.

Пример использования метода:

Перем РазмерФайла, A, B, C, D, E;
ФС.АтрибутыФайла("D:\Base\output.txt", РазмерФайла, A, B, C, D, E);

Если ФС.СвободноеМестоНаДиске("A:") > РазмерФайла Тогда
   ФС.КопироватьФайл("D:\Base\output.txt", "A:\output.txt", 0);
Иначе
   Сообщить("На диске A: недостаточно места", "!");
КонецЕсли;

Переместить или переименовать указанный файл или каталог позволяет метод ПереименоватьФайл(). Англоязычный синоним имени метода — MoveFile().

Синтаксис метода:

ПереименоватьФайл(<ФайлИсточник>, <ФайлПриемник>, <ФлагПерезаписи>)

где

  • <ФайлИсточник> — строковое выражение, содержащее имя файла или каталога, который необходимо переименовать или переместить. В параметре следует указать либо полный путь к файлу/каталогу, либо только имя файла/каталога, если операция будет выполняться с файлом или каталогом из текущей директории;
  • <ФайлПриемник> — строковое выражение, содержащее имя файла или каталога, который должен появиться в результате переименования или перемещения. В параметре следует указать полный путь к файлу/каталогу, либо только имя файла/каталога, если переименовывается файл/каталог из текущей директории, либо файл/каталог перемещается в текущую директорию;
  • <ФлагПерезаписи> — числовое выражение, определяющее режим переименования (перемещения) в случае наличия в каталоге-приёмнике одноимённого файла. Если значение параметра равно 0, то существующий в каталоге-при­ём­ни­ке одноимённый файл не за­ме­ня­ет­ся на копируемый (не перезаписывается) и перемещения не происходит; если же значение параметра равно 1, то вы­пол­ня­ет­ся перемещение и перезапись (только для файлов!!!).

Пример использования метода:

ФС.УстТекКаталог("D:\SSTDB\CP");  // Устанавливаем текущий каталог

// Сохраняем на всякий случай файл предыдущей выгрузки
Если ФС.СуществуетФайл("output.txt") = 1 Тогда
   ФС.ПереименоватьФайл("output.txt", "output.old", 1);
КонецЕсли;

Выполнить копирование файла позволяет метод КопироватьФайл(). Англоязычный синоним имени метода — FileCopy().

Синтаксис метода:

КопироватьФайл(<ФайлИсточник>, <ФайлПриемник>, <ФлагОтменыПерезаписи>)

где

  • <ФайлИсточник> — строковое выражение, содержащее имя файла, который необходимо копировать. В параметре следует указать либо полный путь к файлу, либо только имя файла, если он находится в текущей директории;
  • <ФайлПриемник> — строковое выражение, содержащее имя будущей копии файла. В параметре следует указать либо полный путь к файлу, либо только имя файла, если он будет находиться в текущей директории;
  • <ФлагОтменыПерезаписи> — числовое выражение, определяющее режим копирования в случае наличия в каталоге-приёмнике одноимённого файла. Если результатом этого выражения является 0, то существующий в каталоге-приёмнике одноимённый файл заменяется на копируемый (перезаписывается); если же результатом выражения является 1, то копирование не выполняется.

Пример использования метода:

ФС.КопироватьФайл("D:\Base\output.txt", "A:\output.txt", 0);

Удалить указанный файл позволяет метод УдалитьФайл(). В качестве единственного параметра методу передаётся строковое выражение, содержащее имя удаляемого файла, например, "D:\SSTDB\CP\input.tmp". Полный путь к удаляемому файлу можно не указывать, если он удаляется в текущем каталоге. Англоязычный синоним имени метода — DeleteFile().

Пример использования метода:

ФС.УдалитьФайл("D:\SSTDB\CP\output.old");

Выбор файла пользователем (кроме файлов картинки) позволяет реализовать метод ВыбратьФайл(). Англоязычный синоним имени метода — SelectFile().

Синтаксис метода:

ВыбратьФайл(<ТипДиалога>, <Файл>, <Каталог>, <3аголовок>, <Фильтр>, <Расширение>, <Таймаут>)

где

  • <ТипДиалога> — числовое выражение, значение которого определяет тип открываемого диалога. Допустимые значения: 0 — диалог ти­па «Открыть», 1 — диалог типа «Сохранить»;
  • <Файл> — имя переменной, в которую при вызове метода можно передать строковое значение с именем сохраняемого файла. В эту же переменную система возвращает имя выбранного файла;
  • <Каталог> — имя переменной, в которую при вызове метода можно передать строковое значение с именем начального (рекомендуемого) каталога. Если начальный каталог не указать, система использует текущий. В эту же переменную система возвратит имя выбранного пользователем каталога;
  • <3аголовок> — строковое выражение, содержащее текст заголовка для открываемого окна;
  • <Фильтр> — строковое выражение, задающее список фильтров отбора файлов. Фильтр состоит из двух частей, разделенных символом «|» (вертикальная черта): строки представления, которая отображается в окне выбора файла, и непосредственно строки маски. В строке маски можно использовать символ «*» (звёздочка), что означает наличие любого числа произвольных символов. Символ «?» (вопросительный знак) в строке маски означает наличие одного произвольного символа. Одновременно можно задавать несколько фильтров в виде списка, в качестве разделителей используется символ «|» (вертикальная черта). Например, список из двух фильтров: "Текст(*.txt)|*.txt| Таблицы(*.mxl)|*.mxl";
  • <Расширение> — строковое выражение, содержащее расширение имени файла по умолчанию (оно будет использовано системой при записи файла);
  • <Таймаут> — числовое выражение, значение которого задаёт время ожидания системы (в секундах) на отклик пользователя. По истечении этого времени окно закрывается. Если же таймаут не задан (параметр вообще-то является необязательным) или задан 0, то окно будет ждать действий пользователя бесконечно.

Возвращаемое методом значение, в зависимости от действий пользователя, может быть следующим:

  • 1 — в окне диалога нажата кнопка «ОК», при этом в в переменную <ИмяФайла> возвращается выбранное имя файла, а в переменную <НачКаталог> возвращается имя выбранного каталога;
  • 0 — в окне диалога нажата кнопка «Отмена» или кнопка закрытия окна, либо клавиша Esc на клавиатуре;
  • −1 — истекло время ожидания отклика пользователя, указанное в параметре <Таймаут>.

Пример использования метода:

ИмяФайла = "";
ИмяКаталога = КаталогПользователя();

Если ФС.ВыбратьФайл(0, ИмяФайла, ИмяКаталога, "Что удаляем?", "Все файлы (*.*)|*.*", , ) = 1 Тогда
   // Удаляем выбранный файл
   ФС.УдалитьФайл(ИмяКаталога + ИмяФайла);
КонецЕсли;

В результате работы вышеприведённого кода на экран будет выведено стандартное диалоговое окно для выбора файла.

Диалог выбора файла

Выбор файла картинки пользователем позволяет реализовать метод ВыбратьФайлКартинки(). Англоязычный синоним имени метода — SelectPictFile().

Синтаксис метода:

ВыбратьФайлКартинки(<ТипДиалога>, <Файл>, <Каталог>, <3аголовок>, <Расширение>, <Таймаут>)

где

  • <ТипДиалога> — числовое выражение, значение которого определяет тип открываемого диалога. Допустимые значения: 0 — диалог ти­па «Открыть», 1 — диалог типа «Сохранить»;
  • <Файл> — имя переменной, в которую при вызове метода можно передать строковое значение с именем сохраняемого файла. В эту же переменную система возвращает имя выбранного файла;
  • <Каталог> — имя переменной, в которую при вызове метода можно передать строковое значение с именем начального (рекомендуемого) каталога. Если начальный каталог не указать, система использует текущий. В эту же переменную система возвратит имя выбранного пользователем каталога;
  • <3аголовок> — строковое выражение, содержащее текст заголовка для открываемого окна;
  • <Расширение> — строковое выражение, содержащее расширение имени файла по умолчанию (оно будет использовано системой при записи файла);
  • <Таймаут> — числовое выражение, значение которого задаёт время ожидания системы (в секундах) на отклик пользователя. По истечении этого времени окно закрывается. Если же таймаут не задан (параметр вообще-то является необязательным) или задан 0, то окно будет ждать действий пользователя бесконечно.

Возвращаемое методом значение, в зависимости от действий пользователя, может быть следующим:

  • 1 — в окне диалога нажата кнопка «ОК», при этом в в переменную <ИмяФайла> возвращается выбранное имя файла, а в переменную <НачКаталог> возвращается имя выбранного каталога;
  • 0 — в окне диалога нажата кнопка «Отмена» или кнопка закрытия окна, либо клавиша Esc на клавиатуре;
  • −1 — истекло время ожидания отклика пользователя, указанное в параметре <Таймаут>.

Пример использования метода:

ИмяФайла = "";
ИмяКаталога = КаталогПользователя();
Фото = СоздатьОбъект("Картинка");

Если ФС.ВыбратьФайлКартинки(0, ИмяФайла, ИмяКаталога, "Выберите файл", "bmp", , ) = 1 Тогда
   // Загружаем объект "Картинка"
   Фото.Загрузить(ИмяКаталога + ИмяФайла);
КонецЕсли;

В результате работы вышеприведённого кода на экран будет выведено стандартное диалоговое окно для выбора файла картинки.

Диалог выбора рисунка

Работа с выборкой файлов

Начать выборку файлов по заданной маске и найти первый файл позволяет метод НайтиПервыйФайл(). В качестве единственного параметра методу передаётся строковое выражение, содержащее маску имён файлов. В строке маски можно использовать символ «*» (звёздочка), что означает наличие любого числа произвольных символов, и символ «?» (вопросительный знак), что означает наличие одного произвольного символа. Возвращаемое методом значение является строкой с именем найденного файла. Англоязычный синоним имени метода — FindFirstFile().

Пример использования метода:

Функция ПустойКаталог(ТекКаталог)
   КаталогПуст = 1;
   Каталог = СокрЛП(ТекКаталог);

   Если Прав(Каталог, 1) <> "\" Тогда
      // Добавляем недостающий символ "\" в конец строки
      Каталог = Каталог + "\";
   КонецЕсли;

   // Проверяем, является ли найденный каталог пустым
   ИскомыйФайл = ФС.НайтиПервыйФайл(Каталог + "*.*");
   // Начинаем выборку файлов
   Пока ПустаяСтрока(ИскомыйФайл) = 0 Цикл
      Если (ИскомыйФайл <> ".") И (ИскомыйФайл <> "..") Тогда
         // Если каталог не пуст
         КаталогПуст = 0;
         Прервать;
      КонецЕсли;
      // Иначе проверяем следующий элемент выборки
      ИскомыйФайл = ФС.НайтиСледующийФайл();
   КонецЦикла;
   Возврат КаталогПуст;
КонецФункции

Примечание: Методы НайтиПервыйФайл() и НайтиСледующийФайл() возвращают имена файлов в той же последовательности, как это делает команда dir операционной системы MS DOS (см. рис. ниже). То есть, если задана маска «*.*» для некорневого каталога, первым возвращаемым значением будет строка ".", обозначающая ссылку на текущий каталог. Вторым возвращаемым значением будет строка "..", обозначающая ссылку на каталог уровнем выше. А уже при получении последующих файлов, возвращаемыми значениями будут имена найденных файлов.

Команда dir

Найти следующий файл в открытой выборке файлов позволяет метод НайтиСледующийФайл(). Параметры у метода отсутствуют. Возвращаемым значением метода будет строка с именем найденного файла. Англоязычный синоним имени метода — FindNextFile().

Пример использования метода:

Перем РазмерФайла, A, B, C, D, E;

// Назначаем текущий каталог
ФС.УстТекКаталог(КаталогПользователя());

// Производим выборку всех текстовых файлов в каталоге
ИскомыйФайл = ФС.НайтиПервыйФайл("*.txt");
Пока ПустаяСтрока(ИскомыйФайл) = 0 Цикл
   Если (ИскомыйФайл <> ".") И (ИскомыйФайл <> "..") Тогда
      // Если это реальный файл, получаем его размер
      ФС.АтрибутыФайла(ИскомыйФайл, РазмерФайла, A, B, C, D, E);
      Если ФС.СвободноеМестоНаДиске("A:") > РазмерФайла Тогда
         // Если на диске A: есть место, копируем файл
         ФС.КопироватьФайл(ИскомыйФайл, "A:\" + ИскомыйФайл, 0);
      Иначе
         Сообщить("На диске A: недостаточно места", "!");
      КонецЕсли;
   КонецЕсли;
   // Переходим к следующему файлу выборки
   ИскомыйФайл = ФС.НайтиСледующийФайл();
КонецЦикла;
Сообщить("Копирование файлов завершено.");

Другие статьи по схожей тематике