В клиент-серверном режиме работы 1С:Предприятия часто возникает ситуация, когда фоновый процесс или серверный код выгружает файл (например, через обработку УниверсальныйОбменДаннымиXML) на локальный диск сервера (например, D:\1CShare\file.xml). При попытке выполнить аналогичный код на клиентском компьютере выгрузка завершается ошибкой, так как локальный диск сервера недоступен с компьютера пользователя по прямому пути.
Ситуация осложняется в обычном приложении или при работе в режиме совместимости с версией 8.1, где недоступны управляемые директивы компиляции (&НаСервере, &НаКлиенте) и временное хранилище тонкого клиента. Рассмотрим подробно несколько проверенных способов решения этой задачи.
Для реализации этого метода разделим исполнение кода на две части. Серверная часть сгенерирует файл во временный каталог сервера, поместит его в объект ДвоичныеДанные и вернет на клиент в виде ХранилищеЗначения. Клиентская часть получит хранилище и сохранит файл на ПК пользователя.
Шаг 1. Настройка общего модуля
РаботаСФайламиСервер).Шаг 2. Написание серверной функции
В общем модуле разместим следующую функцию:
Функция СформироватьФайлНаСервере() Экспорт
// Получаем имя временного файла во временном каталоге ОС сервера
ВременныйПуть = ПолучитьИмяВременногоФайла("xml");
// Инициализируем и настраиваем обработку обмена
Обработина = Обработки.УниверсальныйОбменДаннымиXML.Создать();
Обработина.РежимОбмена = "Выгрузка";
Обработина.ИмяФайлаОбмена = ВременныйПуть;
Обработина.ИмяФайлаПравилОбмена = "D:\1CShare\ExchangeRules.xml"; // Правила на сервере
Обработина.ЗагрузитьПравилаОбмена();
Обработина.ВыполнитьВыгрузку();
// Считываем сформированный файл в двоичные данные
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ВременныйПуть);
// Удаляем временный файл с диска сервера
УдалитьФайлы(ВременныйПуть);
// Возвращаем результат в виде ХранилищаЗначения
Возврат Новый ХранилищеЗначения(ДвоичныеДанныеФайла);
КонецФункции
Шаг 3. Вызов функции на клиенте и сохранение файла
На стороне клиентского приложения (в модуле формы обработки или документа) вызываем серверную функцию и записываем файл локально:
Процедура ВыгрузитьФайлНаКлиенте()
// Вызов функции общего модуля с флагом "Вызов сервера"
ХранилищеФайла = РаботаСФайламиСервер.СформироватьФайлНаСервере();
ДвоичныеДанныеФайла = ХранилищеФайла.Получить();
Если ДвоичныеДанныеФайла <> Неопределено Тогда
ПутьНаКлиенте = "C:\Users\Public\Upload_inueco.xml";
ДвоичныеДанныеФайла.Записать(ПутьНаКлиенте);
Сообщить("Файл успешно сохранен по пути: " + ПутьНаКлиенте);
Иначе
Предупреждение("Не удалось сформировать файл на сервере.");
КонецЕсли;
КонецПроцедуры
Если нет необходимости передавать файл через контекст 1С, проанализируем вариант с использованием общей сетевой папки. При этом и клиент, и сервер работают с единым сетевым путем вида \\server\1CShare\Upload_inueco.xml.
Разберем по шагам порядок настройки безопасности для сетевого ресурса:
USR1CV8).Обработина.ИмяФайлаОбмена = "\\server\1CShare\Upload_inueco.xml";.Если задача заключается исключительно в запуск тяжелого обмена данными на сервере по требованию пользователей (без необходимости сохранять XML-файл на локальный ПК пользователя), лучшим решением будет использование механизма фоновых заданий.
Выясним, как запустить выполнение серверной процедуры без предоставления пользователям доступа к консоли заданий:
ФоновыеЗадания.Выполнить().Пример кода на клиенте для запуска серверного процесса:
Процедура КнопкаЗапуститьОбменНажатие(Элемент)
ПараметрыЗадания = Новый Массив;
// В массив передаются параметры, необходимые для процедуры выгрузки
Попытка
ФоновыеЗадания.Выполнить("РаботаСФайламиСервер.ВыполнитьВыгрузкуОбмена", ПараметрыЗадания);
Сообщить("Задание выгрузки успешно запущено на сервере.");
Исключение
Сообщить("Ошибка запуска фонового задания: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Таким образом, для работы с файлами в клиент-серверном режиме обычного приложения наиболее универсальным является сочетание общих модулей с флагом Вызов сервера и объекта ХранилищеЗначения, либо вынос тяжелых операций в фоновые задания.