Как выгрузить сформированный на сервере XML-файл на компьютер клиента в 1С?

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

При работе в управляемых формах 1С часто возникает задача, когда необходимо сформировать файл (например, XML) на сервере, а затем передать его пользователю для сохранения на локальный диск. Поскольку сервер 1С не имеет прямого доступа к файловой системе компьютера пользователя, мы используем механизм ВременноеХранилище. Давайте разберем этот процесс по шагам.

Алгоритм решения задачи

Для реализации этой задачи мы разделим логику на две части: клиентскую, которая инициирует процесс и запрашивает сохранение, и серверную, которая выполняет формирование XML и подготовку данных для передачи.

Шаг 1: Формирование XML на стороне сервера

На сервере мы создаем файл, записываем в него данные, а затем преобразуем его во временный адрес. Важно помнить, что сервер создает файл во временной директории, которую нужно корректно обработать.

Рассмотрим пример кода для функции, которая выполняет формирование XML:


&НаСервере
Функция СохранитьПоступленияТоваров()
    ИмяФайлаXML = ПолучитьИмяВременногоФайла("xml");
    
    ДанныеXML = Новый ЗаписьXML;
    ДанныеXML.ОткрытьФайл(ИмяФайлаXML);
    ДанныеXML.ЗаписатьОбъявлениеXML;
    ДанныеXML.ЗаписатьНачалоЭлемента("ROOT");
    
    // Здесь размещается логика заполнения XML
    // СлужебнаяИнформацияXMLФайла(ДанныеXML, ...);
    
    ДанныеXML.ЗаписатьКонецЭлемента;
    ДанныеXML.Закрыть();
    
    АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайлаXML), УникальныйИдентификатор);
    
    Возврат АдресВоВременномХранилище;
КонецФункции

Обратите внимание на использование функции ПолучитьИмяВременногоФайла — это более безопасный и надежный способ получения пути, чем жесткое задание имени файла. Также мы передаем УникальныйИдентификатор в ПоместитьВоВременноеХранилище, что позволяет платформе автоматически очистить временное хранилище после закрытия формы.

Шаг 2: Получение файла на клиенте

Теперь, когда данные находятся во временном хранилище, мы можем инициировать процедуру сохранения на стороне клиента с помощью метода ПолучитьФайл.


&НаКлиенте
Процедура СохранитьПоступления(Команда)
    Адрес = СохранитьПоступленияТоваров();
    
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
    Диалог.Фильтр = "XML файлы (*.xml)|*.xml";
    
    Если Диалог.Выбрать() Тогда
        ПолучитьФайл(Адрес, Диалог.ПолноеИмяФайла, Истина);
        Предупреждение("Файл успешно сохранен!");
    КонецЕсли;
КонецПроцедуры

Важные рекомендации по оптимизации

Хотя предложенный выше метод является стандартным и надежным, при разработке стоит учитывать следующие профессиональные нюансы:

  1. Исключение записи на диск сервера: Если XML-файл имеет небольшой размер, вместо создания физического файла с помощью ЗаписьXML.ОткрытьФайл(), вы можете использовать ЗаписьТекста в переменную или ПотокВПамяти. Это исключает лишние операции ввода-вывода (I/O) и ускоряет работу системы.
  2. Безопасность: Всегда передавайте УникальныйИдентификатор формы в ПоместитьВоВременноеХранилище. Это предотвращает накопление «мусорных» данных в памяти сервера, так как временное хранилище будет очищено автоматически при закрытии формы, вызвавшей операцию.
  3. Размер данных: Если предполагается формирование очень больших XML-файлов (сотни мегабайт), старайтесь использовать фоновые задания, так как передача огромных двоичных данных через оперативную память может привести к ошибке нехватки памяти Out of Memory на сервере.
  4. Автоматическое сохранение: Если вы хотите исключить диалог выбора файла (сохранять «тихо»), помните, что стандартный ПолучитьФайл этого не позволяет. Для таких целей в браузерах или тонком клиенте потребуются специализированные расширения работы с файлами.

Разработанный метод позволяет быстро и корректно передавать информацию между сервером и клиентом. Используя ДвоичныеДанные и временное хранилище, вы обеспечиваете стабильную работу интеграционных механизмов вашей конфигурации 1С.

← На главную