В общем случае клиент и сервер 1С — это разные компьютеры с различной файловой системой. Рассмотрим как правильно передать файл с компьютера клиента на компьютер сервера.
Метод асинхронной передачи файла на сервер
Обмен файлом между клиентом и сервером осуществляется через временное хранилище. Для помещения данных во временное хранилище правильно воспользоваться методом
НачатьПомещениеФайла ( ОписаниеОповещенияОЗавершении >, Адрес >, ПомещаемыйФайл >, Интерактивно >, УникальныйИдентификаторФормы >, ОписаниеОповещенияПередНачаломПомещенияФайла >)
Метод работает в асинхронном режиме. Возможны два варианта выбора файла для передачи на сервер:
- интерактивной режим, при котором пользователю будет выдан диалог выбора файла;
- неинтерактивный режим, при котором уже известен путь к требуемому файлу на компьютере клиента. Такое возможно, например, когда пользователь в отдельном поле ввода выбрал путь к обрабатываемому файлу. Такой сценарий описан в этой статье.
Параметр ОписаниеОповещенияОЗавершении содержит описание процедуры (тип ОписаниеОповещения), которая будет вызвана после завершения помещения файла во временное хранилище. Эта процедура должна иметь ключевое слово Экспорт и 4 параметра:
- Результат — для интерактивного режима возвращает результат работы пользователя с окном выбора файла. Истина — пользователь выбрал файл; Ложь — пользователь отказался от выбора;
- Адрес — адрес временного хранилища;
- ПомещаемыйФайл — путь к файлу;
- ДополнительныеПараметры — значение, указанное при создании объекта ОписаниеОповещения.
Следует обратить внимание на параметр УникальныйИдентификаторФормы. В него рекомендуется передавать идентификатор текущей формы для сохранения данных во временном хранилище между несколькими серверными вызовами. При закрытии формы данные из временного хранилища будут автоматически удалены.
Неинтерактивная передача файла на сервер
Рассмотрим пример неинтерактивной передачи файла на сервер, без вызова окна выбора файла:
&НаКлиенте
Процедура ЗагрузитьФайл ( Команда )
ИмяФайлаДляОбработки = «C:ДанныеДляЗагрузки.xml» ;
// Описание процедуры, которая будет вызвана помещения файла во временное хранилище
ОписаниеОповещения = Новый ОписаниеОповещения ( «ЗагрузитьФайлЗавершение» , ЭтотОбъект );
// Начало помещение файла из файловой системы во временное хранилище
НачатьПомещениеФайла ( ОписаниеОповещения , , ИмяФайлаДляОбработки , Ложь, УникальныйИдентификатор );
&НаКлиенте
Процедура ЗагрузитьФайлЗавершение ( Результат , Адрес , ВыбранноеИмяФайла , ДополнительныеПараметры ) Экспорт
&НаСервере
Процедура ВыполнитьЗагрузкуНаСервере ( Адрес )
// Получение данных из временного хранилища
Данные = ПолучитьИзВременногоХранилища ( Адрес );
// Получение имени временного файла
ИмяВременногоФайла = ПолучитьИмяВременногоФайла ( «xml» );
// Сохранение данных во временный файл
Данные.Записать ( ИмяВременногоФайла );
// Хорошим тоном будет удалить временный файл
Попытка
При интерактивном выборе файла дополнительно необходимо предусмотреть два момента:
- указать настройки диалога выбора файла (если требуется);
- проверять, что пользователь действительно выбрал файл.
Интерактивная передача файла на сервер
Рассмотрим, пример интерактивной передачи файла на сервер:
&НаКлиенте
Процедура ЗагрузитьФайлИнтерактивно ( Команда )
// Описание процедуры, которая будет вызвана после закрытия окна выбора файла
ОписаниеОповещения = Новый ОписаниеОповещения ( «ЗагрузитьФайлЗавершение» , ЭтотОбъект );
// Описание диалога выбора файла
Диалог = Новый ДиалогВыбораФайла ( РежимДиалогаВыбораФайла . Открытие );
Диалог . Фильтр = НСтр ( «ru=’Файл XML (*.xml)|*.xml’» );
// Начало помещение файла из файловой системы во временное хранилище
НачатьПомещениеФайла ( ОписаниеОповещения , , Диалог , Истина, УникальныйИдентификатор );
&НаКлиенте
Процедура ЗагрузитьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры ) Экспорт
// Файл выбран
ВыполнитьЗагрузкуНаСервере ( Адрес );
// Пользователь отказался от выбора файла
Сообщить ( «Файл не был выбран» );
Процедура ВыполнитьЗагрузкуНаСервере при интерактивном и неинтерактивном режимах одинаковая.
Передача файла на сервер средствами БСП
В конфигурациях со встроенной Библиотекой стандартных подсистем для передачи файлов с клиента на сервер можно использовать процедуры
ЗагрузитьФайл ( ОбработчикЗавершения , ПараметрыЗагрузки = Неопределено, ИмяФайла = «» , АдресВоВременномХранилище = «» ) Экспорт
ЗагрузитьФайлы ( ОбработчикЗавершения , ПараметрыЗагрузки = Неопределено, ЗагружаемыеФайлы = Неопределено) Экспорт
общего модуля ФайловаяСистемаКлиент или
ВыбратьИПередатьФайлНаСервер ( ОповещениеЗавершения , Знач ПараметрыДиалога = Неопределено, Знач ИдентификаторФормы = Неопределено) Экспорт
общего модуля ОбменДаннымиКлиент.
Пример интерактивной загрузки файла на сервер средствами БСП:
&НаКлиенте
Процедура ЗагрузитьФайлИнтерактивно ( Команда )
ПараметрыДиалога = Новый Структура ;
ПараметрыДиалога . Вставить ( «Заголовок» , НСтр ( «ru = ‘Выберите файл XML’» ));
ПараметрыДиалога . Вставить ( «Фильтр» , НСтр ( «ru=’Файл XML (*.xml)|*.xml’» ));
Оповещение = Новый ОписаниеОповещения ( «ЗагрузитьФайлЗавершение» , ЭтотОбъект );
ОбменДаннымиКлиент . ВыбратьИПередатьФайлНаСервер ( Оповещение , ПараметрыДиалога , УникальныйИдентификатор );
&НаКлиенте
Процедура ЗагрузитьФайлЗавершение (Знач РезультатПомещенияФайлов , Знач ДополнительныеПараметры ) Экспорт
Адрес = РезультатПомещенияФайлов . Хранение ;
ТекстОшибки = РезультатПомещенияФайлов . ОписаниеОшибки ;
ИмяВыбранногоФайла = РезультатПомещенияФайлов . Имя ;
Если ПустаяСтрока ( ТекстОшибки ) И ПустаяСтрока ( Адрес ) Тогда
ТекстОшибки = НСтр ( «ru = ‘Ошибка передачи файла на сервер’» );
Если НЕ ПустаяСтрока ( ТекстОшибки ) Тогда
ОбщегоНазначенияКлиентСервер . СообщитьПользователю ( ТекстОшибки );
Возврат;
Остались вопросы?
Спросите в комментариях к статье.
Guesto notes
Задача
Необходимо организовать сохранение файлов web-клиенте(браузере) и тонком клиенте через web. Для наглядности будем решать более узкую задачу, будем организовывать сохранение табличного документа в MS Excel.
Решение
Для наглядности будем решать более узкую задачу, будем организовывать сохранение табличного документа в MS Excel.
- Создадим табличный документ с произвольным текстом;
- Если работа производится на web-клиенте, то попытаемся подключить расширение работы с файлами;
- Поместим табличный документ во временной хранилище как файл MS Excel;
- Для сохранение файла воспользуемся функцией ПолучитьФайл(), который получает файл и сохраняет его в локальную файловую систему.
В итоге имеем следующий код:
При выполнении команды СохранитьФайл() получим диалог с вариантами сохранить или открыть получаемый файл
При выборе варианта «Открыть»
При выборе варианта «Сохранить»
Комментарии 3
Спасибо за статью! Пригодилось.
Алексей, рад что пригодилось!
Обратите внимание, что в статье используются методы УстановитьРасширениеРаботыСФайлами() и ПодключитьРасширениеРаботыСФайлами(), в настоящее время правильнее использовать НачатьУстановкуРасширенияРаботыСФайлами() и НачатьПодключениеРасширенияРаботыСФайлами().
По возможности поправлю статью)
Спасибо огромное!
Небольшое замечание:
Попытка
ТабличныйДокумент.Записать(ИмяФайла, ТипФайла);
АдресХранилища = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла));
Подправленная строка
АдресХранилища = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла), УникальныйИдентификатор);
Подправленная строка
Без этого исправления вылетала ошибка 400
Исключение
ВызватьИсключение;
КонецПопытки;
Ситуация: пользователь на клиенте выбирает файл, и его нужно обработать. Удобнее всего это сделать на сервере, т.к. на клиенте многие функции и процедуры не доступны. Реализовать это возможно помещение данных во временное хранилище, а далее из него, при вызове серверной процедуры, «обратное» изьятие. Например реализовать это можно как-то вот так:
Комментарии:
Добавить комментарий Отменить ответ
Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.