При работе в управляемых формах 1С часто возникает задача, когда необходимо сформировать файл (например, XML) на сервере, а затем передать его пользователю для сохранения на локальный диск. Поскольку сервер 1С не имеет прямого доступа к файловой системе компьютера пользователя, мы используем механизм ВременноеХранилище. Давайте разберем этот процесс по шагам.
Для реализации этой задачи мы разделим логику на две части: клиентскую, которая инициирует процесс и запрашивает сохранение, и серверную, которая выполняет формирование XML и подготовку данных для передачи.
На сервере мы создаем файл, записываем в него данные, а затем преобразуем его во временный адрес. Важно помнить, что сервер создает файл во временной директории, которую нужно корректно обработать.
Рассмотрим пример кода для функции, которая выполняет формирование XML:
&НаСервере
Функция СохранитьПоступленияТоваров()
ИмяФайлаXML = ПолучитьИмяВременногоФайла("xml");
ДанныеXML = Новый ЗаписьXML;
ДанныеXML.ОткрытьФайл(ИмяФайлаXML);
ДанныеXML.ЗаписатьОбъявлениеXML;
ДанныеXML.ЗаписатьНачалоЭлемента("ROOT");
// Здесь размещается логика заполнения XML
// СлужебнаяИнформацияXMLФайла(ДанныеXML, ...);
ДанныеXML.ЗаписатьКонецЭлемента;
ДанныеXML.Закрыть();
АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайлаXML), УникальныйИдентификатор);
Возврат АдресВоВременномХранилище;
КонецФункции
Обратите внимание на использование функции ПолучитьИмяВременногоФайла — это более безопасный и надежный способ получения пути, чем жесткое задание имени файла. Также мы передаем УникальныйИдентификатор в ПоместитьВоВременноеХранилище, что позволяет платформе автоматически очистить временное хранилище после закрытия формы.
Теперь, когда данные находятся во временном хранилище, мы можем инициировать процедуру сохранения на стороне клиента с помощью метода ПолучитьФайл.
&НаКлиенте
Процедура СохранитьПоступления(Команда)
Адрес = СохранитьПоступленияТоваров();
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Фильтр = "XML файлы (*.xml)|*.xml";
Если Диалог.Выбрать() Тогда
ПолучитьФайл(Адрес, Диалог.ПолноеИмяФайла, Истина);
Предупреждение("Файл успешно сохранен!");
КонецЕсли;
КонецПроцедуры
Хотя предложенный выше метод является стандартным и надежным, при разработке стоит учитывать следующие профессиональные нюансы:
ЗаписьXML.ОткрытьФайл(), вы можете использовать ЗаписьТекста в переменную или ПотокВПамяти. Это исключает лишние операции ввода-вывода (I/O) и ускоряет работу системы.УникальныйИдентификатор формы в ПоместитьВоВременноеХранилище. Это предотвращает накопление «мусорных» данных в памяти сервера, так как временное хранилище будет очищено автоматически при закрытии формы, вызвавшей операцию.Out of Memory на сервере.ПолучитьФайл этого не позволяет. Для таких целей в браузерах или тонком клиенте потребуются специализированные расширения работы с файлами.Разработанный метод позволяет быстро и корректно передавать информацию между сервером и клиентом. Используя ДвоичныеДанные и временное хранилище, вы обеспечиваете стабильную работу интеграционных механизмов вашей конфигурации 1С.