helpf.pro
Регистрация

v8: Передача файла через Web-сервис из УПП в СЭД

ElenaT
12.01.2016 19:47Прочитано: 1412

Есть задача: В УПП формируется печ. форма (напр, для док-та РТУ). Надо передать эту печ форму в виде .mxl в документооборот. Задачу реализовала через сом-объект. Все замечательно передается. Теперь надо то же самое сделать через веб-сервис. Для этого создала веб-сервис в упп, который формирует пакет XDTO в виде ИНН(string), договор (string), Имя формы (String) и Данные (base64Binary). В СЭД тоже создан веб-сервис (передаю веб-ссылку в УПП), который должен принять эти двоичные данные. Как? Вообще правильно ли я реализовываю схему? что-то я засомневалась...

Код 1C v 8.х
 Функция Получить(ИНН, Договор, ИмяФайла, ДанныеФайла)	
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
| ВнутренниеДокументы.Ссылка,
| ВнутренниеДокументы.Корреспондент,
| Файлы.Наименование,
| Файлы.ТекущаяВерсияРасширение,
| Файлы.Ссылка КАК ФайлСсылка
|ИЗ
| Справочник.ВнутренниеДокументы КАК ВнутренниеДокументы
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Файлы КАК Файлы
| ПО ВнутренниеДокументы.Ссылка = Файлы.ВладелецФайла
|ГДЕ
| ВнутренниеДокументы.ПометкаУдаления = ЛОЖЬ
| И ВнутренниеДокументы.Корреспондент.ИНН =ИНН
| И ВнутренниеДокументы.Наименование =Договор
| И Файлы.ТекущаяВерсияРасширение =Расширение
| И Файлы.ПометкаУдаления = ЛОЖЬ
| И Файлы.Наименование =ИмяФайла";

Запрос.УстановитьПараметр("Договор", Договор);
Запрос.УстановитьПараметр("ИмяФайла", ИмяФайла);
Запрос.УстановитьПараметр("ИНН", ИНН);
Запрос.УстановитьПараметр("Расширение", "mxl");

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

...

КонецФункции
Yandex
Возможно, вас также заинтересует
Реклама на портале
all4cf
13.01.2016 02:05Ответ № 1

Организация онлайн-обмена данными в формате "Конвертации данных" через web-сервисы

Реализация. Серверная сторона.

Сервер – это для нас информационная база, которая принимает и отдает данные. Всё делаем на платформе 1С:Предприятие 8.2 (прикладное решение не важно).

Web-сервис

Добавляем web-сервис. Назовем «ОбменДаннымиXML». Свойства следующие:

Ключевым свойством для нас является Пакеты XDTO. Выбранный пакет «http://v8.1c.ru/8.1/data/core» представляет встроенные типы 1С:Предприятия, общие для любых конфигураций, такие как ХранилищеЗначения, Структура, Массив и т.п. Пускай вас не смущает число 8.1 в имени пакета. Имеется в виду, что эти типы есть в платформах 8.1 и выше, и их XML-представление не менялось с платформы 8.1.

URI пространства имен в данном случае совершенно не важен, можно указать любую строку. Их принято строить на базе URL, которые использует ваша организация, чтобы гарантировать глобальную уникальность имен типов, описанных в ваших пакетах, на всякий случай. Но мы описывать свои типы (это делается при помощи пакетов XDTOв соответствующей ветке дерева конфигурации) не будем, так как нам достаточно встроенных типов 1C:Предприятия.

Имя файла публикации может быть любым, но с соблюдением требований к URL. Кириллицу лучше не использовать. Расширение «1cws» тоже лучше не менять (не пробовал, если честно).

Операции

Добавляем операции web-сервиса. Наш web-сервис должен уметь как принимать данные, записывая в свою ИБ, так и отдавать их (выгружать в XML). Поэтому добавляем две операции, "ПринятьДанные" и "ОтдатьДанные".

Операция ПринятьДанные

"ПринятьДанные" записывает в ИБ xml-данные, переданные в первом параметре "Данные". Тип параметра - Хранилище значения. ХранилищеЗначения выбираем, чтобы сжимать данные при передаче, т.к. файлы XML могут быть очень увесистыми и при этом хорошо "жмутся". Но можно было бы использовать и просто Строку, string(http://www.w3.org/2001/XMLSchema). Операция возвращает целое число – количество успешно записанных объектов.Второй параметр - ТекстОшибки, строка, входной-выходной, для возврата текста ошибки.

Понятно, что ValueStorage– это ХранилищеЗначения

Код метода:

Код 1C v 8.2 УП
 Функция ПринятьДанные(Данные, ТекстОшибки)

УстановитьПривилегированныйРежим(Истина);

ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаОбмена.РежимОбмена = "Загрузка";

РаботаВозможна = ОбработкаОбмена.ВыполнитьДействияПередЧтениемДанных(Данные.Получить());

Если НЕ РаботаВозможна Тогда
Возврат 0;
КонецЕсли;


ОбработкаОбмена.ПроизвестиЧтениеДанных(ТекстОшибки);

ОбработкаОбмена.ВыполнитьДействияПослеЗавершенияЧтенияДанных(); 

Возврат ОбработкаОбмена.мСчетчикЗагруженныхОбъектов;

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

Операция ОтдатьДанные

"ОтдатьДанные" возвращает xml-данные, выгруженные по переданным правилам обмена. Также в виде ХранилищаЗначения.Это тоже обертка над Универсальным обменом, только уже более функциональная. Обратите внимание , что Массив и Структура – это уже не простые типы, они попадают в метод в виде XDTO-объектов, и их нужно явно преобразовывать в/из типы 1С:Предприятия. Преобразовывать в/из XDTO нужно и на клиентской стороне.

ПравилаВыгрузки - это массив имен правил выгрузки, по которым следует произвести выборку данных.

ЗначенияПараметров – это структура со значениями параметров конвертации.

Код:

Код 1C v 8.2 УП
 Функция ОтдатьДанные(ПравилаОбмена, ПравилаВыгрузкиXDTO, ЗначенияПараметровXDTO)

УстановитьПривилегированныйРежим(Истина);

// Иницализация
Обмен = Обработки.УниверсальныйОбменДаннымиXML.Создать();
Обмен.РежимОбмена = "Выгрузка";
ИмяВремФайла = ПолучитьИмяВременногоФайла("xml");
Обмен.ИмяФайлаОбмена = ИмяВремФайла;

// Загрузка правил
ИмяФайлаПравилОбмена = ПолучитьИмяВременногоФайла("xml");
ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаПравилОбмена);
ЗаписьТекста.Записать(ПравилаОбмена.Получить());
ЗаписьТекста.Закрыть();
Обмен.ИмяФайлаПравилОбмена = ИмяФайлаПравилОбмена;
Обмен.ЗагрузитьПравилаОбмена();

// Параметры
ЗначенияПараметров = СериализаторXDTO.ПрочитатьXDTO(ЗначенияПараметровXDTO);
Если ЗначениеЗаполнено(ЗначенияПараметров) Тогда
Для каждого КлючИЗнач Из ЗначенияПараметров Цикл
Обмен.УстановитьЗначениеПараметраВТаблице(КлючИЗнач.Ключ, КлючИЗнач.Значение);
КонецЦикла; 
КонецЕсли; 

// Правила выгрузки данных
ПравилаВыгрузки = СериализаторXDTO.ПрочитатьXDTO(ПравилаВыгрузкиXDTO);
Если ЗначениеЗаполнено(ПравилаВыгрузки) Тогда

// Сначала снимаем все отметки
Для Каждого Строка из Обмен.ТаблицаПравилВыгрузки.Строки Цикл
Строка.Включить = 0;
Обмен.УстановитьПометкиПодчиненных(Строка, "Включить");
КонецЦикла;

// Теперь устанавливаем по переданным ПВД
Для каждого ИмяПравилаВыгрузки Из ПравилаВыгрузки Цикл
СтрДерева = Обмен.ТаблицаПравилВыгрузки.Строки.Найти(ИмяПравилаВыгрузки, "Имя", Истина);
Если СтрДерева = Неопределено Тогда
ВызватьИсключение "ОбменДаннымиXML.ОтдатьДанныеXML(): не удалось найти ПВД """ + ИмяПравилаВыгрузки + """!";
Иначе
СтрДерева.Включить = 1;
Обмен.УстановитьПометкиРодителей(СтрДерева, "Включить");
КонецЕсли; 
КонецЦикла; 

КонецЕсли; 

// Выгрузка
Обмен.ВыполнитьВыгрузку();

// Конец
ЧтениеТекста = Новый ЧтениеТекста;
ЧтениеТекста.Открыть(ИмяВремФайла, КодировкаТекста.UTF8);

Результат = ЧтениеТекста.Прочитать();

ЧтениеТекста.Закрыть();

УдалитьФайлы(ИмяВремФайла);
УдалитьФайлы(ИмяФайлаПравилОбмена);

ХранилищеДанных = Новый ХранилищеЗначения(Результат, Новый СжатиеДанных(9));

Возврат ХранилищеДанных;

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

Обработка УниверсальныйОбменДаннымиXML

Если в вашем прикладном решении такая обработка отсутствует, то её нужно добавить из комплекта поставки конфигурации «Конвертация данных» (файлV8Exchan82.epf).

Доступ к web-сервису. Роли и пользователи.

Для обращения к веб-сервисам необходимо подготовить роль и пользователя. Самый простой путь – это добавить отдельную роль, назовем ВебСервисы, этой роли не даем никаких прав, кроме прав на операции веб-сервиса, а сами методы выполняем в привилегированном режиме.

Добавляем пользователя

Назначаем ему только нашу роль ВебСервисы и больше никаких других. Этого достаточно.

На серверной стороне настройка закончена.

Клиент (обращение к web-сервису)

Тут просто приведу примеры обращения к веб-сервисам. Откуда берутся правила обмена , правила выгрузки, значения параметров и т.п. – это уже вопрос вашей прикладной задачи и её реализации.

Передача данных в базу-приемник

Пример передачи xml-данных в базу-приемник, на стороне которой работает вышеописанный web-сервис:

Код 1C v 8.2 УП
 Функция ПередатьНаСервере(СтрокаXML)

Данные = Новый ХранилищеЗначения(СтрокаXML, Новый СжатиеДанных(9));

// Подкдючение
Определения = Новый WSОпределения(" Прокси = Новый WSПрокси(Определения, "a href="http://your-domain.ru/" ,"="">http://your-domain.ru/", "ОбменДаннымиXML", "ОбменДаннымиXMLSoap");
Прокси.Пользователь = "WebServices";
Прокси.Пароль = "12345";

// Передача
ТекстОшибки = "";
ЗагруженоОбъектов = Прокси.ПринятьДанные(Данные, ТекстОшибки);

Если НЕ ПустаяСтрока(ТекстОшибки) Тогда
Сообщить(ТекстОшибки);
КонецЕсли; 

Возврат ЗагруженоОбъектов;

КонецФункции // ПередатьНСервере()

Данные перед этим получены из этой базы-источника функцией:

Код 1C v 8.2 УП
 Функция ВыгрузитьКонтрагента(Организация, Контрагент)

ПравилаОбмена = ПолучитьПравилаОбмена();

// Инициализация
Обмен = Обработки.УниверсальныйОбменДаннымиXML.Создать();
Обмен.РежимОбмена = "Выгрузка";
ИмяФайлаДанных = ПолучитьИмяВременногоФайла("xml");
Обмен.ИмяФайлаОбмена = ИмяФайлаДанных;

// Загрузка правил
ИмяФайлаПравилОбмена = ПолучитьИмяВременногоФайла("xml");
ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаПравилОбмена);
ЗаписьТекста.Записать(ПравилаОбмена);
ЗаписьТекста.Закрыть();
Обмен.ИмяФайлаПравилОбмена = ИмяФайлаПравилОбмена;
Обмен.ЗагрузитьПравилаОбмена();

// Параметры
Обмен.УстановитьЗначениеПараметраВТаблице("Организация", Организация);

// Правила выгрузки данных

// Сначала все отключаем
Для Каждого Строка из Обмен.ТаблицаПравилВыгрузки.Строки Цикл
Строка.Включить = 0;
Обмен.УстановитьПометкиПодчиненных(Строка, "Включить");
КонецЦикла;
// Включаем нужное правило
СтрПравил = Обмен.ТаблицаПравилВыгрузки.Строки.Найти("Контрагенты", "Имя", Истина);
Если СтрПравил = Неопределено Тогда
ВызватьИсключение "ПередатьНСервере(): не удалось найти правило выгрузки ""Контрагенты"" в правилах обмена.";
КонецЕсли; 
СтрПравил.Включить = 1;
Обмен.УстановитьПометкиРодителей(СтрПравил, "Включить");

// Отбор
Постр = Новый ПостроительОтчета("ВЫБРАТЬ ПЕРВЫЕ 1 _.* ИЗ Справочник.Контрагенты КАК _
 |{ГДЕ _.Ссылка.* КАК Справочник_Контрагенты}");
Постр.Отбор.Добавить("Справочник_Контрагенты").Установить(Контрагент);
СтрПравил.ИспользоватьОтбор = Истина;
СтрПравил.НастройкиПостроителя = Постр.ПолучитьНастройки();

// Выгрузка
Обмен.ВыполнитьВыгрузку();
ЧтениеТекста = Новый ЧтениеТекста;
ЧтениеТекста.Открыть(ИмяФайлаДанных, КодировкаТекста.UTF8);
СтрокаXML = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
УдалитьФайлы(ИмяФайлаДанных);
УдалитьФайлы(ИмяФайлаПравилОбмена);

Возврат СтрокаXML;

КонецФункции // ВыгрузитьКонтрагента()

Получение данных от web-сервиса

Пример получения данных от web-сервиса:

Код 1C v 8.2 УП
 Функция ПолучитьДанныеОтВебСервиса(ПравилаСтрокой)

// Подкдючение
Определения = Новый WSОпределения("http://server1c8/db_buh/ws/xml-exchange.1cws?wsdl", "WebServices", "12345");
Прокси = Новый WSПрокси(Определения, "http://your-domain.ru/", "ОбменДаннымиXML", "ОбменДаннымиXMLSoap");
Прокси.Пользователь = "WebServices";
Прокси.Пароль = "12345";

// Параметры
ПравилаВыгрузки = Новый Массив;
ПравилаВыгрузки.Добавить("ИерархияКонтрагентов");
ПравилаВыгрузкиXDTO = СериализаторXDTO.ЗаписатьXDTO(ПравилаВыгрузки);

ЗначенияПараметров = Новый Структура("КодБазыИсточника", "00001");
ЗначенияПараметровXDTO = СериализаторXDTO.ЗаписатьXDTO(ЗначенияПараметров);

// Получение данных
Правила = Новый ХранилищеЗначения(ПравилаСтрокой, Новый СжатиеДанных(9));
Данные = Прокси.ОтдатьДанные(Правила, ПравилаВыгрузкиXDTO, ЗначенияПараметровXDTO);

// Возвращаем строку XML
Возврат Данные.Получить();

КонецФункции // ПолучитьДанныеОтВебСервиса()
ElenaT
13.01.2016 13:58Ответ № 2

Спасибо, но формат конвертации данных (с правилами обмена) - это не мой вариант.

Вопрос закрыт. Разобралась вчера. Интернет рулит: http://it-terminal.ru/infobox/video1c/1441/ Доходчиво и по сути. 

Подсказка: Щелникни по Имени пользователя напротив ответа, и тем самым покажешь, что сообщение адресовано ему.
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.