При переходе на управляемые формы в клиент-серверном режиме разработчики нередко сталкиваются с ситуацией, когда операции чтения или записи файлов начинают выполняться на стороне сервера, а не на локальном компьютере пользователя. Разберем архитектурные причины такого поведения платформы 1С:Предприятие и рассмотрим правильные механизмы работы с файлами.
Проанализируем базовый принцип клиент-серверной архитектуры: любой программный код платформы выполняется строго в том окружении, которое задано контекстом его директивы компиляции. Если в процедуре или функции используется директива &НаСервере или &НаСервереБезКонтекста, код исполняется процессом сервера приложений 1С (рабочим процессом rphost).
Выясним, к какой именно файловой системе обращается программа:
usr1cv8). Эта учетная запись не имеет физического доступа к локальным дискам клиентских рабочих станций (дискам C:, D: пользователей) и сетевым дискам, подключенным в пользовательских сессиях Windows.В управляемом приложении правильная работа с файлами строится без прямого указания серверных или клиентских путей к файлам в серверных модулях. Для обмена данными между клиентской машиной и сервером используется оперативная память и механизм временного хранилища.
Рассмотрим по шагам загрузку файла с локального компьютера пользователя на сервер:
Посмотрим на пример загрузки файла на клиенте с последующей обработкой на сервере:
&НаКлиенте
Процедура ЗагрузитьФайлВыполнить(Команда)
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Заголовок = "Выберите файл для загрузки";
ПараметрыДиалога.Фильтр = "Файлы Excel (*.xlsx)|*.xlsx|Все файлы (*.*)|*.*";
Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
НачатьПомещениеФайлаНаСервер(Оповещение, , , ПараметрыДиалога, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
ОбработатьФайлНаСервере(Результат.Адрес);
КонецПроцедуры
&НаСервере
Процедура ОбработатьФайлНаСервере(АдресХранилища)
ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(АдресХранилища);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДвоичныеДанныеФайла.Записать(ИмяВременногоФайла);
// Выполняем разбор файла на сервере
УдалитьФайлы(ИмяВременногоФайла);
УдалитьИзВременногоХранилища(АдресХранилища);
КонецПроцедуры
Разберем обратную задачу — формирование файла на стороне сервера и его последующее сохранение на диск пользователя:
&НаСервере
Функция СформироватьФайлНаСервере()
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("pdf");
// Формируем отчет или документ и сохраняем во временный файл
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.PDF);
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
УдалитьФайлы(ИмяВременногоФайла);
Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
КонецФункции
&НаКлиенте
Процедура СохранитьФайлКлиенту(Команда)
АдресФайла = СформироватьФайлНаСервере();
ПараметрыПолучения = Новый ПараметрыДиалогаПолученияФайлов;
ПараметрыПолучения.Заголовок = "Укажите путь для сохранения";
НачатьПолучениеФайлаССервера(Неопределено, АдресФайла, "ПечатнаяФорма.pdf", ПараметрыПолучения);
КонецПроцедуры
В случаях, когда файл выгружается автоматическими регламентными заданиями или интеграционными механизмами без участия пользователя, прямое сохранение на клиентский диск невозможно. Для этого настраивают общую сетевую папку.
Рассмотрим обязательные условия для корректной работы через сетевой путь:
\\server_name\shared_folder\file.xml, а не через букву сопоставленного диска (например, Z:\folder), так как служба сервера 1С не видит подключенные диски пользовательских сеансов.Если специфика системы предполагает постоянное хранение прикрепленных документов, отчетов или накладных, рекомендуются следующие архитектурные подходы:
ХранилищеЗначения. В этом случае файлы сохраняются непосредственно в таблицах СУБД, исключая необходимость администрирования отдельных дисковых каталогов и настроек прав на уровне операционной системы.HTTPСоединение, что полностью изолирует платформу от локальных дисковых структур конкретных рабочих мест.