Простой способ передачи файла с клиента на сервер и обратно. Пример работы с XML

В статье представлен простенький пример передачи файла с клиента на сервер и с сервера на клиент. Плюс к этому разобраны методы работы с записью XML.
Платформа 8.3.10.2466.
Конфигурация Бухгалтерия предприятия КОРП, редакция 3.0 (3.0.49.21).

Большинство новичков-программистов, рано или поздно столкнется с проблемой передачи файла с клиента на сервер или в противоположную сторону! Необходимость передачи файла, скорее всего, возникнет после того, как программист на своем мониторе увидит ошибку вида:

ВнешняяОбработка.XML.Форма.Форма.Форма(61)}: Ошибка при вызове метода контекста (ОткрытьФайл);

Ошибка довольно простая и заключается в том, что находясь на сервере, программист пытается добраться до файла, лежащего у него на компе (на клиенте)! Выход из такой ситуации напрашивается сам собой — передать файл на машину-сервер!

Надеюсь, данная статья станет кому-нибудь полезной и поможет не забуксовать, столкнувшись с проблемой переноса. Ну и как маленький «бонусик» есть пример работы с xml (возможно тоже будем кому-то полезен, в частности для новичка)!

Это мой первый опыт в написании мини статьи, поэтому прошу строго не судить) 

Весь программный код лежит в модуле формы:
 

&НаКлиенте
Процедура СоздатьXMLФайл(Команда)

ДиалогВыбораФайла=Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);  // выбор каталога
ДиалогВыбораФайла.Заголовок = "Выберите каталог!";
Если ДиалогВыбораФайла.Выбрать() Тогда
Путь = ДиалогВыбораФайла.Каталог + "ФайлXML.xml";    // присваиваем переменной путь выбранного каталога + имя будущего файла
КомандаДляСозданияФайла = "dir>" + Путь;
КомандаСистемы(КомандаДляСозданияФайла ,Путь); // создаем файл на компе
КонецЕсли;

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


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

Адрес = ВыгрузитьВXMLНаСервере(АдресВременногоХранилища);

Двоичное=ПолучитьИзВременногоХранилища(Адрес);  // по адресу временного хранилища получаем двоичные данные
Двоичное.Записать(Путь); // перезаписываем наш файлик на клиенте
КонецЕсли;
КонецПроцедуры

&НаСервере
Функция  ВыгрузитьВXMLНаСервере(АдресВременногоХранилища)

ДД = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);  // вытаскиваем на сервере из временного хранилища как двоичные данные
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml"); // получаем имя временного файла на сервере
ДД.Записать(ИмяВременногоФайла);                        // записываем двоичные данные
//перенос файла с клиента на сервер завершен, на сервере создался файл с путем в переменной - "ИмяВременногоФайла"

Запрос = Новый Запрос;       // Запросом вытаскиваем в выборку любые данные
Запрос.Текст =  "ВЫБРАТЬ
|    РеализацияТоваровУслуг.Ссылка,
|    РеализацияТоваровУслуг.Контрагент,
|    РеализацияТоваровУслуг.Номер,
|    РеализацияТоваровУслуг.Организация,
|    РеализацияТоваровУслугТовары.Номенклатура,
|    РеализацияТоваровУслугТовары.ЕдиницаИзмерения,
|    РеализацияТоваровУслугТовары.Количество,
|    РеализацияТоваровУслугТовары.Цена,
|    РеализацияТоваровУслугТовары.Сумма
|ИЗ
|    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|        ПО (РеализацияТоваровУслугТовары.Ссылка = РеализацияТоваровУслуг.Ссылка)
|ГДЕ
|    РеализацияТоваровУслуг.Дата = &Дата";
Запрос.УстановитьПараметр("Дата", '20260312235959');
Результат = Запрос.Выполнить().Выбрать();

ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяВременногоФайла);  // Открываем наш "серверный" файл для записи
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("Реализация");

Пока Результат.Следующий() Цикл  // в цикле заполняем ЗаписьXML данными из выборки
ЗаписьXML.ЗаписатьНачалоЭлемента("Контрагент");
ЗаписьXML.ЗаписатьАтрибут("Контрагент",Строка(Результат.Контрагент));
ЗаписьXML.ЗаписатьАтрибут("Номер",Строка(Результат.Номер));
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;

ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.Закрыть();

// передаем заполненный на сервере файлик назад на клиент через временноехранилище:
Двоичное=Новый ДвоичныеДанные(ИмяВременногоФайла);  // получаем двоичные данные из файла
Адрес = ПоместитьВоВременноеХранилище(Двоичное, ЭтаФорма.УникальныйИдентификатор); // кидаем двоичные данные во врем. хранилище
Возврат Адрес;

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




&НаКлиенте
Процедура ЗагрузитьИзXML(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите файл для чтения из него данных в 1с!";
Если Диалог.Выбрать() Тогда
Путь = Диалог.ПолноеИмяФайла;
КонецЕсли;

ЧтениеXML = Новый ЧтениеXML;

ЧтениеXML.ОткрытьФайл(Путь); // открываем файл для чтения

Пока ЧтениеXML.Прочитать() Цикл  // в цикле читаем данные с нашего файла и делаем с ними все, что душе угодно!
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Пока ЧтениеXML.ПрочитатьАтрибут() Цикл
///обработка
КонецЦикла;
ИначеЕсли ЧтениеXML.ТипУзла=ТипУзлаXML.Текст Тогда
////обработка
ИначеЕсли ЧтениеXML.ТипУзла=ТипУзлаXML.КонецЭлемента Тогда
////обработка
КонецЕсли ;
КонецЦикла;
КонецПроцедуры

 

7 Comments

  1. ALagutin

    А разве не проще будет через НачатьПомещениеФайлов()?

    Reply ↓
  2. Sergant007007

    (1)

    НачатьПомещениеФайлов

    Синтаксис:

    ПоместитьФайл(<Адрес>, <НачальноеИмяФайла>, <ВыбранноеИмяФайла>, <Интерактивно>, <УникальныйИдентификаторФормы>)

    Параметры:

    ……………….

    …………….

    ………..

    Примечание:

    Если для конфигурации свойство РежимИспользованияМодальности установлено в НеИспользовать, следует использовать метод НачатьПомещениеФайла.

    Чем по Вашему он проще?

    Reply ↓
  3. ALagutin

    (2) Хотел написать «правильнее» вместо «проще», Т9 =)

    Reply ↓
  4. Sergant007007

    (3) Почему правильнее?

    Reply ↓
  5. smilebringer

    (4) Потому что, если, использование модальности выключено, то приложение вызовет исключение, не будет работать Ваш код. Сейчас актуально использовать НачатьПомещениеФайла

    Reply ↓
  6. KereberoS

    Какой смысл помещения файла не сервер для записи, если в итоге создается файл пустой , передается на клиент , где в итоге перезаписывается? Копипаст статьи?

    Reply ↓
  7. manishka

    Методы ПоместитьФайл(), ПоместитьФайлы(), ПолучитьФайлы() являются устаревшими и не рекомендуются к использованию.

    Рекомендуется переработать работу с файлами в прикладных решениях, с учетом новых возможностей платформы.

    Источник: https://dl03.1c.ru/content/Platform/8_3_13_1865/1cv8upd_8_3_13_1865.htm#07736471-0d7a-11e8-a3f7-0050569f678a

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *