При разработке конфигураций на платформе 1С:Предприятие часто возникает задача сформировать файл (например, dbf, xlsx или xml) на стороне сервера и передать его для сохранения на локальный компьютер пользователя. В клиент-серверном варианте при работе через веб-клиент многие разработчики сталкиваются с тем, что классические методы сохранения файлов не срабатывают или работают некорректно. Давайте разберем, почему это происходит и как правильно реализовать данный механизм. Для решения этой задачи в интерактивном режиме можно использовать двухпанельный файловый менеджер для обмена файлами между клиентом и сервером.
Прежде всего, важно осознать ключевое различие: код, выполняемый на сервере, работает в изолированной среде серверной операционной системы. Сервер 1С не имеет прямого доступа к файловой системе компьютера пользователя (клиента). Попытка выполнить запись файла по пути C:\Users\... в серверном коде приведет лишь к тому, что файл появится в папке на сервере, а не на локальной машине пользователя. Более того, веб-браузеры, через которые работают пользователи, накладывают строгие ограничения безопасности (песочницу), запрещающие сайтам произвольно записывать файлы на диск пользователя без явного подтверждения.
Чтобы передать данные, мы должны сначала сформировать их в оперативной памяти сервера или во временном файле, а затем поместить во ВременноеХранилище. Временное хранилище — это специальный механизм платформы, предназначенный для обмена данными между сервером и клиентом.
Рассмотрим пример формирования файла:
// Код выполняется на сервере
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("dbf");
Файл = Новый ЗаписьDBF();
Файл.СоздатьФайл(ИмяВременногоФайла);
// ... заполнение данными ...
Файл.Закрыть();
// Помещаем данные во временное хранилище
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИмяВременногоФайла);
АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайла, УникальныйИдентификатор);
После того как данные оказались во временном хранилище, мы получили строковый АдресХранилища. Теперь нам нужно инициировать процесс скачивания файла на сторону клиента. В современных версиях платформы 1С для этих целей используются асинхронные методы.
Рекомендуемым методом является ПолучитьФайлССервераАсинх. Этот метод берет на себя всю логику по передаче данных через HTTP и вызову стандартного браузерного диалога «Сохранить как», который позволяет пользователю выбрать место сохранения файла на своем компьютере.
Пример вызова в клиентском коде:
&НаКлиенте
Процедура ВыгрузитьФайл(Команда)
// АдресХранилища был передан с сервера
ИмяФайлаНаКлиенте = "Отчет.dbf";
// Вызываем асинхронный метод получения файла
ПолучитьФайлССервераАсинх(АдресХранилища, ИмяФайлаНаКлиенте);
КонецПроцедуры
Если специфика вашей задачи требует более глубокого взаимодействия с файловой системой (например, программное сохранение в определенные папки, работа с файловыми потоками), необходимо установить расширение браузера «Работа с файлами 1С». Это расширение предоставляет дополнительные привилегии при работе через веб-клиент, позволяя обходить ряд ограничений безопасности браузеров.
Для таких операций используется метод НачатьЗапись у объекта ДвоичныеДанные. Важно помнить, что в веб-клиенте работа с файлами практически всегда должна быть асинхронной:
// Пример асинхронной записи
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗаписиФайла", ЭтотОбъект);
Данные = ПолучитьИзВременногоХранилища(АдресХранилища);
Данные.НачатьЗапись(ОписаниеОповещения, "C:\Downloads\Отчет.dbf");
ВременноеХранилище как промежуточное звено для передачи данных.ПолучитьФайлССервераАсинх — это стандарт современной разработки, который обеспечивает стабильную работу интерфейса без зависаний.Следуя этим правилам, вы сможете организовать надежный и удобный процесс обмена файлами между сервером 1С и клиентами, работающими через веб-браузер.