Большинство новичков-программистов, рано или поздно столкнется с проблемой передачи файла с клиента на сервер или в противоположную сторону! Необходимость передачи файла, скорее всего, возникнет после того, как программист на своем мониторе увидит ошибку вида:
ВнешняяОбработка.XML.Форма.Форма.Форма(61)}: Ошибка при вызове метода контекста (ОткрытьФайл);
Ошибка довольно простая и заключается в том, что находясь на сервере, программист пытается добраться до файла, лежащего у него на компе (на клиенте)! Выход из такой ситуации напрашивается сам собой - передать файл на машину-сервер!
Надеюсь, данная статья станет кому-нибудь полезной и поможет не забуксовать, столкнувшись с проблемой переноса. Ну и как маленький «бонусик» есть пример работы с xml (возможно тоже будем кому-то полезен, в частности для новичка)!
Это мой первый опыт в написании мини статьи, поэтому прошу строго не судить)
Весь программный код лежит в модуле формы:
&НаКлиенте
Процедура СоздатьXMLФайл(Команда)
ДиалогВыбораФайла=Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога); // выбор каталога
ДиалогВыбораФайла.Заголовок = "Выберите каталог!";
Если ДиалогВыбораФайла.Выбрать() Тогда
Путь = ДиалогВыбораФайла.Каталог + "\ФайлXML.xml"; // присваиваем переменной путь выбранного каталога + имя будущего файла
КомандаДляСозданияФайла = "dir>" + Путь;
КомандаСистемы(КомандаДляСозданияФайла ,Путь); // создаем файл на компе
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыгрузитьВXML(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите файл для записи в него данных из 1с!";
Если Диалог.Выбрать() Тогда
Путь = Диалог.ПолноеИмяФайла; // выбираем созданный нами файлик для записи в него данных из 1с в формате xml
АдресВременногоХранилища = "";
ПоместитьФайл(АдресВременногоХранилища, Путь,,Ложь, ЭтаФорма.УникальныйИдентификатор); // помещаем наш файл во временное хранилище (для его передачи на сервер)
Адрес = ВыгрузитьВXMLНаСервере(АдресВременногоХранилища);
Двоичное=ПолучитьИзВременногоХранилища(Адрес); // по адресу временного хранилища получаем двоичные данные
Двоичное.Записать(Путь); // перезаписываем наш файлик на клиенте
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ВыгрузитьВXMLНаСервере(АдресВременногоХранилища)
ДД = ПолучитьИзВременногоХранилища(АдресВременногоХранилища); // вытаскиваем на сервере из временного хранилища как двоичные данные
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml"); // получаем имя временного файла на сервере
ДД.Записать(ИмяВременногоФайла); // записываем двоичные данные
//перенос файла с клиента на сервер завершен, на сервере создался файл с путем в переменной - "ИмяВременногоФайла"
Запрос = Новый Запрос; // Запросом вытаскиваем в выборку любые данные
Запрос.Текст = "ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка,
| РеализацияТоваровУслуг.Контрагент,
| РеализацияТоваровУслуг.Номер,
| РеализацияТоваровУслуг.Организация,
| РеализацияТоваровУслугТовары.Номенклатура,
| РеализацияТоваровУслугТовары.ЕдиницаИзмерения,
| РеализацияТоваровУслугТовары.Количество,
| РеализацияТоваровУслугТовары.Цена,
| РеализацияТоваровУслугТовары.Сумма
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
| ПО (РеализацияТоваровУслугТовары.Ссылка = РеализацияТоваровУслуг.Ссылка)
|ГДЕ
| РеализацияТоваровУслуг.Дата = &Дата";
Запрос.УстановитьПараметр("Дата", '20170312235959');
Результат = Запрос.Выполнить().Выбрать();
Запись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.КонецЭлемента Тогда
////обработка
КонецЕсли ;
КонецЦикла;
КонецПроцедуры