Доступ к файловой системе из кода конфигурации

#std542

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

1. Работа с временными файлами и каталогами

1.1. Для получения имени временного файла следует использовать метод ПолучитьИмяВременногоФайла (исключение составляет веб-клиент, см. п. 1.3). В противном случае возможна некорректная работа в многопользовательском режиме, возникновение проблем с правами доступа, неконтролируемое накопление временных файлов. При использовании метода ПолучитьИмяВременногоФайла платформа:

1.2. Для создания временного каталога также рекомендуется использовать имя, полученное с помощью ПолучитьИмяВременногоФайла. Внутри созданного каталога можно создавать другие файлы без ограничений.

1.3. При выполнении кода веб-клиентом метод ПолучитьИмяВременногоФайла недоступен. Для формирования имен временных файлов необходимо использовать функцию КаталогВременныхФайлов и объект УникальныйИдентификатор.

Если в конфигурацию встроена Библиотека стандартных подсистем, для создания временных каталогов на клиенте необходимо использовать процедуру ФайловаяСистемаКлиент.СоздатьВременныйКаталог.

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

Если в конфигурацию встроена Библиотека стандартных подсистем, рекомендуется использовать процедуры ФайловаяСистема.УдалитьВременныйФайл() и ФайловаяСистема.УдалитьВременныйКаталог.

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

Для сохранения данных между серверными вызовами в пределах сеанса следует использовать временное хранилище платформы (методы ПоместитьВоВременноеХранилище, ПолучитьИзВременногоХранилища).

1.6. В редких случаях передачи больших данных во временных файлах между сеансами (фоновые задания, веб-сервисы) необходимо самостоятельно обеспечивать:

Если в конфигурацию встроена Библиотека стандартных подсистем, рекомендуется использовать функцию ФайловаяСистема.ОбщийКаталогВременныхФайлов.

2. Работа с двоичными данными и потоками

В общем случае операции с файловой системой для получения двоичных данных являются избыточными, так как двоичные данные объекта в любом случае размещаются в памяти.

2.1. Для получения двоичных данных объектов рекомендуется использовать потоки в памяти (например, ПотокВПамяти, ЗаписьДанных, ЧтениеДанных).

Неправильно:

// Пример избыточного использования файловой системы
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("txt");
ТекстИнформации = Новый ТекстовыйДокумент();
ТекстИнформации.УстановитьТекст(ТехнологическаяИнформация);
ТекстИнформации.Записать(ИмяВременногоФайла, КодировкаТекста.UTF8);
Результат = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяВременногоФайла), Новый УникальныйИдентификатор());
УдалитьФайлы(ИмяВременногоФайла);

Правильно:

// Пример правильного подхода: использование потока в памяти
ПотокФайла = Новый ПотокВПамяти();
ТекстИнформации = Новый ТекстовыйДокумент;
ТекстИнформации.УстановитьТекст(ТехнологическаяИнформация);
ТекстИнформации.Записать(ПотокФайла, КодировкаТекста.UTF8);
Результат = ПоместитьВоВременноеХранилище(ПотокФайла.ЗакрытьИПолучитьДвоичныеДанные(), Новый УникальныйИдентификатор);

2.2. После чтения двоичных данных поток необходимо закрывать, в противном случае это может привести к возникновению утечки памяти и невозможности дальнейшей работы.

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

3. Передача файлов между клиентом и сервером

При одновременной работе с файлом на клиенте и сервере необходимо использовать передачу файла через временное хранилище, поскольку клиент и серверы кластера — разные компьютеры с разной файловой системой.

3.1. Загрузка файла с клиента на сервер

Для загрузки файла с клиента на сервер рекомендуется использовать методы ПоместитьФайлНаСерверАсинх, ПоместитьФайлыНаСерверАсинх, НачатьПомещениеФайлаНаСервер, НачатьПомещениеФайловНаСервер).

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

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

Для сохранения данных файла между несколькими серверными вызовами необходимо использовать свойство ИдентификаторФормы параметра ПараметрыЗагрузки.

3.2. Сохранение файла сервера на клиенте

Для сохранения (скачивания) файла сервера на клиенте рекомендуется использовать методы ПолучитьФайлССервераАсинх, ПолучитьФайлыССервераАсинх, НачатьПолучениеФайлаССервера, НачатьПолучениеФайловССервера).

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

4. Совместимость имен файлов

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

4.1. В именах файлов, автоматически формируемых из кода конфигурации, указывать только английские буквы, а также цифры, а в качестве кодировки текстовых файлов использовать только UTF-8.

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

4.2. В тех случаях, когда имя файла явно вводит пользователь, разрешить ввод русскоязычных имен, но при этом дать возможность транслитерировать его в англоязычное имя. По умолчанию рекомендуется предлагать англоязычное имя файла и сохранение в кодировке UTF-8.

В конфигурациях на базе Библиотеки стандартных подсистем для транслитерации имен файлов рекомендуется использовать функцию СтроковыеФункцииКлиентСервер.СтрокаЛатиницей.

5. Права доступа к файлам

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

5.1. Если доступ к файловой системе осуществляется из кода, выполняемого на клиенте, то он выполняется под правами пользователя, от имени которого запущено приложение (тонкий, толстый или веб-клиент). Как правило, это текущий пользователь операционной системы.

5.2. Если доступ к файловой системе осуществляется из кода, выполняемого на сервере, то:

* Рабочие процессы могут быть также запущены от имени другого пользователя, отличного от того, под которым запускается агент сервера. Подробнее см. руководство администратора клиент-серверного варианта, описание служебного файла swpuser.ini.

6. Безопасность файловой системы

При работе с файловой системой из программного кода конфигурации требуется исключить возможность чтения и изменения тех файлов, которые не предусмотрены проектным решением, чтобы предотвратить несанкционированный доступ к данным и не спровоцировать нарушение работы ОС. Для этого необходимо придерживаться следующих рекомендаций при проектировании, разработке и администрировании решений.

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

6.2. Запрещается передавать путь к файлу в параметры серверных процедур форм или экспортных процедур серверных общих модулей. Такие процедуры могут быть вызваны с клиента сторонними средствами.

6.3. Если серверный метод использует расширение файла, переданное с клиента, рекомендуется воспользоваться одним из вариантов его проверки на безопасность:

6.4. При формировании пути к файлу на основе данных из информационной базы (например, поле ввода, которое может редактировать пользователь) рекомендуется воспользоваться методом Библиотеки стандартных подсистем ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла.

6.5. Перед работой с файлом на сервере необходимо убедиться, что файл находится во временном каталоге или другом специально предусмотренном месте.

Пример 1:

// Проверка, что Путь получен методом ПолучитьИмяВременногоФайла()
Файл = Новый Файл(Путь);
Возврат СтрНачинаетсяС(Файл.ПолноеИмя, КаталогВременныхФайлов());

Пример 2:

// Проверка, что Путь получен из константы файлового хранилища
КаталогХранилищаФайлов = Константы. КаталогХранилищаФайловНаСервере.Получить();
Файл = Новый Файл(Путь);
Возврат СтрНачинаетсяС(Файл.ПолноеИмя, КаталогХранилищаФайлов);

6.6. При работе со временными файлами следует убедиться в том, что выполняются условия:

6.7. Запрещается выполнять запись каких-либо файлов в каталог исполняемых файлов 1С:Предприятия, получаемого с помощью метода КаталогПрограммы. Использование метода КаталогПрограммы допустимо только для чтения или запуска файлов.

6.8. Администраторам информационных баз рекомендуется использовать профили безопасности для ограничения доступа к файловой системе на сервере.

См. также