Доступ до файлової системи з коду конфігурації
Робочі процеси можуть також бути запущені від імені іншого користувача, відмінного від того, під яким запускається агент сервера. Докладніше див. посібник адміністратора клієнт-серверного варіанта, <a href="http://its.1c.ru/db/v8doc#content:26:1:issogl1_3.20.swpuser.ini" target="_blank">опис службового файлу swpuser.ini</a>Робота з тимчасовими файлами та каталогами. Передавання файлів між клієнтом і сервером. Див. також
Робота з тимчасовими файлами та каталогами
Передавання файлів між клієнтом і сервером
Область застосування: керований застосунок, мобільний застосунок, звичайний застосунок.
1. Під час звернення з коду конфігурації до файлів і каталогів файлової системи слід мати на увазі, що доступ до них обмежений правами користувача операційної системи, від імені якого запущено застосунок.
1.1. Якщо доступ до файлової системи здійснюється з коду, що виконується на клієнті, то він виконується під правами користувача, від імені якого запущено застосунок (тонкий, товстий або веб-клієнт). Як правило, це поточний користувач операційної системи.
1.2. Якщо доступ до файлової системи здійснюється з коду, що виконується на сервері, то:
- під час використання клієнт-серверної інформаційної бази доступ обмежений правами користувача, від імені якого запущено сервер 1С:Підприємства (*);
- під час використання файлової бази, опублікованої на веб-сервері, доступ обмежений правами користувача, від імені якого запущено веб-сервер.
|
Область застосування (уточнення): керований застосунок, звичайний застосунок. 2. Забороняється виконувати запис будь-яких файлів до каталогу виконуваних файлів 1С:Підприємства, що отримується за допомогою методу КаталогПрограммы. Використання методу КаталогПрограммы допускається лише для читання або запуску файлів. Наприклад, під час роботи в ОС Windows для запуску копії тонкого клієнта 1С:Підприємства поточної версії допускається використовувати: ЗапуститьПриложение(КаталогПрограммы() + "1cv8s.exe"); |
Робота з тимчасовими файлами та каталогами
За потреби використання тимчасових файлів і каталогів необхідно дотримуватися таких вимог:
1. Для отримання імені тимчасового файлу слід використовувати метод ПолучитьИмяВременногоФайла. Інакше можлива некоректна робота конфігурації в багатокористувацькому режимі з увімкненими профілями безпеки, виникнення проблем із правами доступу до файлів операційної системи.
Неправильно:
ИмяПромежуточногоФайла = "C:/Временные файлы 1С/TempFile.xml"Данные.Записать(ИмяПромежуточногоФайла);
Поточний користувач може не мати прав на запис до вказаного каталогу. Крім того, у разі одночасного виконання цього коду з двох різних сеансів виникне помилка.
Правильно:
ИмяПромежуточногоФайла = ПолучитьИмяВременногоФайла("xml");Данные.Записать(ИмяПромежуточногоФайла);
Під час використання цієї функції буде отримано унікальне ім'я, доступ до файлу гарантовано.
2. Для створення тимчасового каталогу також рекомендується використовувати ім'я, отримане за допомогою методу ПолучитьИмяВременногоФайла. Це гарантує унікальність імені створюваного каталогу під час роботи в багатокористувацькому режимі. Після цього всередині створеного каталогу можна створювати інші каталоги та файли без обмежень.
3. Під час виконання коду у веб-клієнті або в рідкісних випадках, якщо не потрібно забезпечувати роботу в багатокористувацькому режимі, наприклад, оновлення файлової інформаційної бази, монопольний режим), необхідно використовувати для формування імені файлу або каталогу функцію КаталогВременныхФайлов.
Див. також Особенности разработки конфигураций для ОС Linux, про особливості використання імен і шляхів файлів.
4. Після закінчення роботи з тимчасовим файлом або каталогом його необхідно видалити самостійно. Не можна розраховувати на автоматичне видалення файлів і каталогів під час наступного запуску платформи, це може призвести до вичерпання вільного місця в каталозі тимчасових файлів.
ИмяПромежуточногоФайла = ПолучитьИмяВременногоФайла("xml");Данные.Записать(ИмяПромежуточногоФайла);// Работа с файлом...// Удаляем временный файлПопытка УдалитьФайлы(ИмяПромежуточногоФайла);Исключение ЗаписьЖурналаРегистрации(НСтр("ru = 'Мой механизм.Действие'"), УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));КонецПопытки;
Див. також: Использование Журнала регистрации.
5. Під час використання тимчасових файлів і каталогів на сервері необхідно повністю завершувати роботу з ними в межах одного серверного виклику. Під час роботи конфігурації з використанням кластера серверів у наступному виклику ці файли можуть стати недоступними, оскільки код почне виконуватися на іншому комп'ютері. За потреби зберегти дані між серверними викликами в межах одного сеансу слід використовувати тимчасове сховище платформи (методи ПоместитьВоВременноеХранилище, ПолучитьИзВременногоХранилища).
5. 1. У рідкісних випадках може виникнути потреба передавання даних у тимчасових файлах між сеансами, наприклад, під час підготовки даних для фонового завдання, під час організації тривалого процесу, що обслуговує кілька послідовних викликів веб-сервісу. Необхідно самостійно забезпечувати гарантовано спільне місце зберігання, права для доступу до файлів із різних місць їх обробки, видалення файлів після закінчення строків їх обробки або аварійного завершення процесу обробки. Рекомендується використовувати такий підхід:
- Для забезпечення доступу з усіх можливих місць обробки створюється константа для зберігання спільного шляху до файлів, доступного для доступу з усіх серверів кластера;
- Під час створення тимчасових файлів їхні імена заносяться до допоміжного регістру відомостей зі збереженням часу створення файлу;
- У разі штатного проходження процесу остання операція, якій були потрібні файли, перед своїм завершенням видаляє як сам файл, так і записи про них у допоміжному регістрі;
- Допоміжне регламентне завдання періодично перевіряє наявність записів у допоміжному регістрі, час існування яких свідомо перевищує час штатного завершення процесу. У разі виявлення таких записів завдання видаляє тимчасові файли та записи про них.
Передавання файлів між клієнтом і сервером
1. Під час одночасної роботи з файлом на клієнті та на сервері необхідно використовувати передавання файлу через тимчасове сховище (методи ПоместитьФайл, ПоместитьФайлы, ПолучитьФайл, ПолучитьФайлы, НачатьПомещениеФайла, ПоместитьВоВременноеХранилище, ПолучитьИзВременногоХранилища). У загальному випадку клієнт і сервери кластера — це різні комп'ютери з різною файловою системою, причому доступ до файлів може відбуватися під різними користувачами ОС із різними правами.
Неправильно:
&НаКлиентеПроцедура ОбработкаФайла() ... ИмяФайла = "C:/Файлы для обработки/Загрузка.xml"; Результат = ПроизвестиОбработкуНаСервере(ИмяФайла); ...КонецПроцедуры&НаСервереФункция ПроизвестиОбработкуНаСервере(ИмяФайла) Чтение = Новый ЧтениеТекста(ИмяФайла) ... Результат = Чтение.Прочитать(); Возврат Результат;КонецФункции
Правильно:
&НаКлиентеПроцедура ОбработкаФайла() ... ИмяФайлаДляОбработки = "C:/Файлы для обработки/Загрузка.xml"; Адрес = ""; ПоместитьФайл(Адрес, ИмяФайлаДляОбработки, ИмяФайлаДляОбработки, Ложь); Результат = ПроизвестиОбработкуНаСервере(Адрес); ...КонецПроцедуры&НаСервереФункция ПроизвестиОбработкуНаСервере(Адрес) Данные = ПолучитьИзВременногоХранилища(Адрес) ИмяПромежуточногоФайла = ПолучитьИмяВременногоФайла("txt"); Данные.Записать(ИмяПромежуточногоФайла); Чтение = Новый ЧтениеТекста(ИмяПромежуточногоФайла) ... Результат = Чтение.Прочитать(); ... УдалитьФайлы(ИмяПромежуточногоФайла); Возврат Результат;КонецФункции
2. Для збереження даних у тимчасовому сховищі між кількома серверними викликами під час поміщення його до сховища необхідно використовувати параметр УникальныйИдентификаторФормы методу ПоместитьФайл, передавши до нього ідентифікатор поточної форми. Такі значення буде видалено з тимчасового сховища лише під час закриття вказаної форми. При цьому під час повторного поміщення того самого файлу до тимчасового сховища попереднє значення необхідно видаляти вручну. Наприклад:
Неправильно:
... ИмяФайлаДляОбработки = "C:/Файлы для обработки/Загрузка.xml";
... // Первый серверный вызов Адрес = ""; ПоместитьФайл(Адрес, ИмяФайлаДляОбработки, ИмяФайлаДляОбработки, Ложь, УникальныйИдентификатор); Результат = ПроизвестиНачальнуюОбработкуНаСервере (Адрес);
... // Второй серверный вызов с той же версией файла Результат = ПроизвестиПромежуточнуюОбработкуНаСервере(Адрес); ...
// Третий серверный вызов с новой версией файла Адрес = ""; ПоместитьФайл(Адрес, ИмяФайлаДляОбработки, ИмяФайлаДляОбработки, Ложь, УникальныйИдентификатор); Результат = ПроизвестиКонечнуюбОбработкуНаСервере(Адрес); ...
При цьому в тимчасовому сховищі форми залишаться дві копії файлів. Адреса другої копії міститиметься у змінній Адрес, а адресу першої копії буде втрачено. Це призводить до витрат додаткових ресурсів застосунку, уповільнення роботи.
Правильно:
... ИмяФайлаДляОбработки = "C:/Файлы для обработки/Загрузка.xml";
... // Первый серверный вызов Адрес = ""; ПоместитьФайл(Адрес, ИмяФайлаДляОбработки, ИмяФайлаДляОбработки, Ложь, УникальныйИдентификатор); Результат = ПроизвестиНачальнуюОбработкуНаСервере(Адрес);
... // Второй серверный вызов с той же версией файла Результат = ПроизвестиПромежуточнуюОбработкуНаСервере(Адрес); ...
// Третий серверный вызов с новой версией файла УдалитьИзВременногоХранилища(Адрес); Адрес = ""; ПоместитьФайл(Адрес, ИмяФайлаДляОбработки, ИмяФайлаДляОбработки, Ложь, УникальныйИдентификатор); Результат = ПроизвестиКонечнуюбОбработкуНаСервере(Адрес); ...
Див. також
- Загальні вимоги до конфігурації