Простой способ передачи файла с клиента на сервер и обратно. Пример работы с 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"); // получаем имя временного файла на сервере
ДД.Записать(ИмяВременногоФайла);                        // записываем двоичные данные
//перенос файла с клиента на сервер завершен, на сервере создался файл с путем в переменной - "ИмяВременногоФайла"

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

Запись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 не будет опубликован. Обязательные поля помечены *