Как передать или сформировать файл на сервере 1С и записать его на клиенте в обычном приложении?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

В клиент-серверном режиме работы 1С:Предприятия часто возникает ситуация, когда фоновый процесс или серверный код выгружает файл (например, через обработку УниверсальныйОбменДаннымиXML) на локальный диск сервера (например, D:\1CShare\file.xml). При попытке выполнить аналогичный код на клиентском компьютере выгрузка завершается ошибкой, так как локальный диск сервера недоступен с компьютера пользователя по прямому пути.

Ситуация осложняется в обычном приложении или при работе в режиме совместимости с версией 8.1, где недоступны управляемые директивы компиляции (&НаСервере, &НаКлиенте) и временное хранилище тонкого клиента. Рассмотрим подробно несколько проверенных способов решения этой задачи.

Способ 1. Передача файла через ХранилищеЗначения и общий модуль с вызовом сервера

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

Шаг 1. Настройка общего модуля

  1. Создадим или выберем общий модуль (например, РаботаСФайламиСервер).
  2. В свойствах общего модуля установим флаги Сервер и Вызов сервера (Server Call). Флаг «Вызов сервера» позволяет обращаться к экспортным процедурам модуля с клиентской стороны в обычном приложении.

Шаг 2. Написание серверной функции

В общем модуле разместим следующую функцию:


Функция СформироватьФайлНаСервере() Экспорт

    // Получаем имя временного файла во временном каталоге ОС сервера
    ВременныйПуть = ПолучитьИмяВременногоФайла("xml");
    
    // Инициализируем и настраиваем обработку обмена
    Обработина = Обработки.УниверсальныйОбменДаннымиXML.Создать();
    Обработина.РежимОбмена = "Выгрузка";
    Обработина.ИмяФайлаОбмена = ВременныйПуть;
    Обработина.ИмяФайлаПравилОбмена = "D:\1CShare\ExchangeRules.xml"; // Правила на сервере
    
    Обработина.ЗагрузитьПравилаОбмена();
    Обработина.ВыполнитьВыгрузку();
    
    // Считываем сформированный файл в двоичные данные
    ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ВременныйПуть);
    
    // Удаляем временный файл с диска сервера
    УдалитьФайлы(ВременныйПуть);
    
    // Возвращаем результат в виде ХранилищаЗначения
    Возврат Новый ХранилищеЗначения(ДвоичныеДанныеФайла);

КонецФункции

Шаг 3. Вызов функции на клиенте и сохранение файла

На стороне клиентского приложения (в модуле формы обработки или документа) вызываем серверную функцию и записываем файл локально:


Процедура ВыгрузитьФайлНаКлиенте()

    // Вызов функции общего модуля с флагом "Вызов сервера"
    ХранилищеФайла = РаботаСФайламиСервер.СформироватьФайлНаСервере();
    
    ДвоичныеДанныеФайла = ХранилищеФайла.Получить();
    Если ДвоичныеДанныеФайла <> Неопределено Тогда
        ПутьНаКлиенте = "C:\Users\Public\Upload_inueco.xml";
        ДвоичныеДанныеФайла.Записать(ПутьНаКлиенте);
        Сообщить("Файл успешно сохранен по пути: " + ПутьНаКлиенте);
    Иначе
        Предупреждение("Не удалось сформировать файл на сервере.");
    КонецЕсли;

КонецПроцедуры

Способ 2. Использование сетевого каталога (UNC-путь)

Если нет необходимости передавать файл через контекст 1С, проанализируем вариант с использованием общей сетевой папки. При этом и клиент, и сервер работают с единым сетевым путем вида \\server\1CShare\Upload_inueco.xml.

Разберем по шагам порядок настройки безопасности для сетевого ресурса:

  1. На сервере создается общая папка и предоставляется сетевой доступ.
  2. В настройках прав доступа (NTFS и Сетевые права) указываются учетные записи конкретных пользователей-бухгалтеров, а также системная учетная запись, под которой запущена служба сервера 1С (например, USR1CV8).
  3. Отключать парольную защиту для всей сети не требуется — достаточно корректно выдать права службы 1С и доменным пользователям.
  4. В коде выгрузки указывается UNC-путь: Обработина.ИмяФайлаОбмена = "\\server\1CShare\Upload_inueco.xml";.

Способ 3. Программный запуск фонового задания по кнопке

Если задача заключается исключительно в запуск тяжелого обмена данными на сервере по требованию пользователей (без необходимости сохранять XML-файл на локальный ПК пользователя), лучшим решением будет использование механизма фоновых заданий.

Выясним, как запустить выполнение серверной процедуры без предоставления пользователям доступа к консоли заданий:

  1. Процедура выгрузки выносится в общий модуль с включенным признаком Сервер.
  2. На форму добавляется кнопка, вызывающая метод ФоновыеЗадания.Выполнить().

Пример кода на клиенте для запуска серверного процесса:


Процедура КнопкаЗапуститьОбменНажатие(Элемент)

    ПараметрыЗадания = Новый Массив;
    // В массив передаются параметры, необходимые для процедуры выгрузки
    
    Попытка
        ФоновыеЗадания.Выполнить("РаботаСФайламиСервер.ВыполнитьВыгрузкуОбмена", ПараметрыЗадания);
        Сообщить("Задание выгрузки успешно запущено на сервере.");
    Исключение
        Сообщить("Ошибка запуска фонового задания: " + ОписаниеОшибки());
    КонецПопытки;

КонецПроцедуры

Таким образом, для работы с файлами в клиент-серверном режиме обычного приложения наиболее универсальным является сочетание общих модулей с флагом Вызов сервера и объекта ХранилищеЗначения, либо вынос тяжелых операций в фоновые задания.

← На главную